# 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() flow = None start_flow = None if request.user.is_authenticated() and not request.user.is_admin: try: bill = Bill.objects.get( service__course=course, user=request.user, status='F') if bill.flow: flow = bill.flow.get_status() start_flow = bill.flow.start_flow except Bill.DoesNotExist: pass return { 'course': journal.get_face(user_fabric(request.user)), 'user': user_fabric(request.user), 'flow': flow, 'start_flow': start_flow, } @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) 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} 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} @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) 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))} } 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))},} @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) 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()} } 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()}} @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}