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.
 
 
 
 
 
 

250 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}