You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
11 KiB
254 lines
11 KiB
# coding=utf-8
|
|
import datetime
|
|
from django.http import Http404
|
|
|
|
from finance.models import Bill
|
|
from lms.decors import response_decor
|
|
from lms.tools import user_fabric
|
|
from courses.models import Course, Lesson, Homework, Exam, MaterialDirection, Achievements, Skills, SkillJ, CourseMap
|
|
from journals.models import LessonJ, TeacherJ, HomeworkJ, check_journal, ExamJ, AchievementJ
|
|
from finance.tools import system_check_bill
|
|
|
|
|
|
@response_decor(template='course.html', without_auth=True)
|
|
def course(request, slug):
|
|
# Страница курса
|
|
user = user_fabric(request.user)
|
|
if not slug: return {'redirect': '/'}
|
|
try:
|
|
course = Course.objects.get(slug=slug)
|
|
except Course.DoesNotExist:
|
|
try:
|
|
course = Course.objects.get(id=slug)
|
|
except ValueError:
|
|
raise Http404
|
|
except Course.DoesNotExist:
|
|
raise Http404
|
|
else:
|
|
return {'redirect': course.get_absolute_url()}
|
|
except Course.DoesNotExist:
|
|
raise Http404
|
|
|
|
if not course.public and not (request.user.is_authenticated() and request.user.is_admin):
|
|
raise Http404
|
|
|
|
if course.hidden:
|
|
if not request.user.is_authenticated():
|
|
raise Http404
|
|
else:
|
|
if not request.user.is_admin:
|
|
try:
|
|
Bill.objects.get(service__course=course, user=request.user, status='F')
|
|
except Bill.DoesNotExist:
|
|
raise Http404
|
|
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
|
|
if created:
|
|
check_journal(journal)
|
|
_map = CourseMap.objects.filter(course=course).order_by('sort').first()
|
|
_j = _map.get_obj()
|
|
j = HomeworkJ.objects.get(material=_j, student=request.user)
|
|
j.open_material()
|
|
else:
|
|
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
|
|
|
|
if user and not journal.start_date:
|
|
journal.start_date = datetime.datetime.now()
|
|
journal.save()
|
|
|
|
waiting_materials = []
|
|
if journal.waiting.exists():
|
|
for n in journal.waiting.all():
|
|
_obj = n.get_obj()
|
|
__type = n.get_type()
|
|
_type = None
|
|
if __type == 'L':
|
|
_type = 'lesson'
|
|
elif __type == 'H':
|
|
_type = 'homework'
|
|
elif __type == 'E':
|
|
_type = 'exam'
|
|
|
|
waiting_materials.append({'obj': _obj, 'type': _type})
|
|
return {
|
|
'course': journal.get_face(user_fabric(request.user)),
|
|
'user': user_fabric(request.user),
|
|
'waiting_materials': waiting_materials
|
|
}
|
|
|
|
|
|
@response_decor(template='lesson.html')
|
|
def lesson(request, lesson):
|
|
# Открытие окна урока
|
|
# TODO: Проверить все ссылки на ID Lesson
|
|
try:
|
|
lesson = Lesson.objects.get(id=lesson)
|
|
lj = LessonJ.objects.get(material=lesson, student=request.user)
|
|
except Lesson.DoesNotExist:
|
|
raise Http404
|
|
except LessonJ.DoesNotExist:
|
|
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course)
|
|
check_journal(j)
|
|
lj = LessonJ.objects.get(material=lesson, student=request.user)
|
|
|
|
waiting_materials = []
|
|
if lj.parent.parent.waiting.exists():
|
|
for n in lj.parent.parent.waiting.all():
|
|
_obj = n.get_obj()
|
|
__type = n.get_type()
|
|
_type = None
|
|
if __type == 'L':
|
|
_type = 'lesson'
|
|
elif __type == 'H':
|
|
_type = 'homework'
|
|
elif __type == 'E':
|
|
_type = 'exam'
|
|
|
|
waiting_materials.append({'obj': _obj, 'type': _type})
|
|
|
|
if request.user.is_authenticated() and request.user.is_admin or request.user in lesson.course.teachers.all():
|
|
return {'lesson': lj.get_face(user_fabric(request.user)),
|
|
'course': {'head': lj.parent.parent.get_head_face(),
|
|
'level': lj.parent.parent.course.get_level(),
|
|
'journal': lj.parent.parent.get_face(user_fabric(request.user))},
|
|
'bought': True, 'accept': True, 'waiting_materials': waiting_materials}
|
|
|
|
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type):
|
|
return {'redirect': '/access/by_error/'}
|
|
else:
|
|
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists():
|
|
return {'redirect': '/access/auth_error/'}
|
|
else:
|
|
result = False
|
|
if lj.get_status_flag() != 'N':
|
|
result = True
|
|
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists():
|
|
result = True
|
|
lj.date = datetime.datetime.now()
|
|
lj.save()
|
|
if result:
|
|
return {'lesson': lj.get_face(user_fabric(request.user)), 'course': {'head': lj.parent.parent.get_head_face(), 'level': lj.parent.parent.course.get_level(), 'journal': lj.parent.parent.get_face(user_fabric(request.user))}, 'bought': True, 'accept': True, 'waiting_materials': waiting_materials}
|
|
|
|
|
|
@response_decor(template='homework.html')
|
|
def homework(request, homework):
|
|
# Страница ДЗ
|
|
# TODO: Проверить везде ссылки с ID ДЗ
|
|
try:
|
|
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
|
|
except Homework.DoesNotExist:
|
|
raise Http404
|
|
except HomeworkJ.DoesNotExist:
|
|
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course)
|
|
check_journal(j)
|
|
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
|
|
|
|
waiting_materials = []
|
|
if hj.parent.parent.waiting.exists():
|
|
for n in hj.parent.parent.waiting.all():
|
|
_obj = n.get_obj()
|
|
__type = n.get_type()
|
|
_type = None
|
|
if __type == 'L':
|
|
_type = 'lesson'
|
|
elif __type == 'H':
|
|
_type = 'homework'
|
|
elif __type == 'E':
|
|
_type = 'exam'
|
|
|
|
waiting_materials.append({'obj': _obj, 'type': _type})
|
|
|
|
if request.user.is_authenticated() and request.user.is_admin:
|
|
return {'homework': hj.get_face(user_fabric(request.user)),
|
|
'course': {'head': hj.parent.parent.get_head_face(),
|
|
'level': hj.parent.parent.course.get_level(),
|
|
'journal': hj.parent.parent.get_face(user_fabric(request.user))},
|
|
'waiting_materials': waiting_materials}
|
|
|
|
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type):
|
|
return {'redirect': '/access/by_error/'}
|
|
else:
|
|
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists():
|
|
return {'redirect': '/access/auth_error/'}
|
|
else:
|
|
result = False
|
|
if hj.get_status_flag() != 'N':
|
|
result = True
|
|
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists():
|
|
hj.date = datetime.datetime.now()
|
|
hj.save()
|
|
result = True
|
|
|
|
if result:
|
|
return {'homework': hj.get_face(user_fabric(request.user)),
|
|
'course': {'head': hj.parent.parent.get_head_face(),
|
|
'level': hj.parent.parent.course.get_level(), 'journal': hj.parent.parent.get_face(user_fabric(request.user))},
|
|
'waiting_materials': waiting_materials}
|
|
|
|
|
|
@response_decor(template='exam.html')
|
|
def exam(request, exam):
|
|
# Страница экзамена
|
|
# TODO: проверить, чтобы это было ID экзамена
|
|
try:
|
|
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
|
|
except Exam.DoesNotExist:
|
|
raise Http404
|
|
except ExamJ.DoesNotExist:
|
|
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course)
|
|
check_journal(j)
|
|
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
|
|
|
|
waiting_materials = []
|
|
if exam.parent.parent.waiting.all().exists():
|
|
for n in exam.parent.parent.waiting.all():
|
|
_obj = n.get_obj()
|
|
__type = n.get_type()
|
|
_type = None
|
|
if __type == 'L':
|
|
_type = 'lesson'
|
|
elif __type == 'H':
|
|
_type = 'homework'
|
|
elif __type == 'E':
|
|
_type = 'exam'
|
|
|
|
waiting_materials.append({'obj': _obj, 'type': _type})
|
|
|
|
if request.user.is_authenticated() and request.user.is_admin:
|
|
return {'exam': exam.get_face(user_fabric(request.user)),
|
|
'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()},
|
|
'waiting_materials': waiting_materials}
|
|
|
|
if not system_check_bill(exam.material.token, request.user):
|
|
return {'redirect': '/access/by_error/'}
|
|
else:
|
|
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists():
|
|
return {'redirect': '/access/auth_error/'}
|
|
else:
|
|
result = False
|
|
if exam.get_status_flag() != 'N':
|
|
result = True
|
|
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists():
|
|
result = True
|
|
exam.date = datetime.datetime.now()
|
|
exam.save()
|
|
|
|
if result:
|
|
return {'exam': exam.get_face(user_fabric(request.user)), 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, 'waiting_materials': waiting_materials}
|
|
|
|
|
|
@response_decor(template='all_achievements.html', without_auth=True)
|
|
def achievements(request):
|
|
# Список ачивок и статус получения
|
|
skills = {}
|
|
for course in Course.objects.all().order_by('sort'):
|
|
skills[(course.id, course.title)] = {}
|
|
for skillj in SkillJ.objects.filter(lesson__course=course):
|
|
if not skills[(course.id, course.title)].get(skillj.skill.title):
|
|
skills[(course.id, course.title)][skillj.skill.title] = {
|
|
'size': 0,
|
|
'icon': skillj.skill.mini_icon,
|
|
'color': skillj.skill.color
|
|
}
|
|
skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size
|
|
|
|
return {'achievements': Achievements.objects.all(), 'skills': skills}
|
|
|