|
|
|
@ -10,6 +10,7 @@ from rest_framework.response import Response |
|
|
|
from rest_framework.views import APIView |
|
|
|
from rest_framework.views import APIView |
|
|
|
from django.db.models import Q |
|
|
|
from django.db.models import Q |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from courses.models import Course |
|
|
|
from progress.models import ProgressLesson, Progress |
|
|
|
from progress.models import ProgressLesson, Progress |
|
|
|
from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer |
|
|
|
from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer |
|
|
|
from courses.api import CourseProgressApi |
|
|
|
from courses.api import CourseProgressApi |
|
|
|
@ -252,3 +253,96 @@ class UserGuardView(APIView): |
|
|
|
return res_204 |
|
|
|
return res_204 |
|
|
|
|
|
|
|
|
|
|
|
return res_403 |
|
|
|
return res_403 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SetProgress(APIView): |
|
|
|
|
|
|
|
renderer_classes = (JSONRenderer,) |
|
|
|
|
|
|
|
permission_classes = (IsAuthenticated,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def post(request): |
|
|
|
|
|
|
|
if request.user.is_staff: |
|
|
|
|
|
|
|
email = request.JSON.get('email', None) |
|
|
|
|
|
|
|
course_slug = request.JSON.get('course_slug', None) |
|
|
|
|
|
|
|
topic_sort = int(request.JSON.get('topic', 1)) |
|
|
|
|
|
|
|
lesson_sort = int(request.JSON.get('lesson', 1)) |
|
|
|
|
|
|
|
force = request.JSON.get('force', False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if course_slug is None: |
|
|
|
|
|
|
|
return Response('course_slug не передан', status=400) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if email is None: |
|
|
|
|
|
|
|
return Response('email не передан', status=400) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
student = get_user_model().objects.get(email=email) |
|
|
|
|
|
|
|
except get_user_model().DoesNotExist: |
|
|
|
|
|
|
|
return Response("User doesn't exist", status=404) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
course = Course.objects.get(slug=course_slug) |
|
|
|
|
|
|
|
except get_user_model().DoesNotExist: |
|
|
|
|
|
|
|
return Response("Course doesn't exist", status=404) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
progress = Progress.objects.get(course_token=course.token, user=student) |
|
|
|
|
|
|
|
except Progress.DoesNotExist: |
|
|
|
|
|
|
|
if not force: |
|
|
|
|
|
|
|
return Response("Студент не проходит этот курс", status=403) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
teacher = get_user_model().objects.get(out_key=course.get_teacher()) |
|
|
|
|
|
|
|
progress = Progress.objects.create(course_token=course.token, user=student, teacher=teacher) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
token_list = [] |
|
|
|
|
|
|
|
lesson_list = [] |
|
|
|
|
|
|
|
for topic_idx, topic in enumerate(course.topic_set.all()): |
|
|
|
|
|
|
|
topic_find = topic_idx == (topic_sort - 1) |
|
|
|
|
|
|
|
for lesson_idx, lesson in enumerate(topic.lesson_set.all()): |
|
|
|
|
|
|
|
token_list.append(lesson.token) |
|
|
|
|
|
|
|
lesson_list.append(lesson) |
|
|
|
|
|
|
|
if lesson_idx == (lesson_sort - 1) and topic_find: |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if topic_find: |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if progress.progresslesson_set.filter( |
|
|
|
|
|
|
|
~Q(lesson_token__in=token_list)).exists() and not force: |
|
|
|
|
|
|
|
return Response("Пользователь, прошёл дальше по курсу", status=403) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
progress.progresslesson_set.filter(~Q(lesson_token__in=token_list)).delete() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for lesson_idx, lesson_token in enumerate(token_list[:-1]): |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
pl = ProgressLesson.objects.get(progress__user=student, lesson_token=lesson_token) |
|
|
|
|
|
|
|
if pl.finish_date is None: |
|
|
|
|
|
|
|
pl.finish_date = datetime.datetime.now() |
|
|
|
|
|
|
|
pl.status = 'done' |
|
|
|
|
|
|
|
pl.save() |
|
|
|
|
|
|
|
except ProgressLesson.DoesNotExist: |
|
|
|
|
|
|
|
ProgressLesson.objects.create( |
|
|
|
|
|
|
|
progress=progress, |
|
|
|
|
|
|
|
lesson_token=lesson_token, |
|
|
|
|
|
|
|
checker=progress.teacher if lesson_list[lesson_idx].is_hm else student, |
|
|
|
|
|
|
|
status="done", |
|
|
|
|
|
|
|
finish_date=datetime.datetime.now() |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
pl = ProgressLesson.objects.get(progress=progress, lesson_token=token_list[-1:][0]) |
|
|
|
|
|
|
|
if pl.status == "done": |
|
|
|
|
|
|
|
pl.status = "start" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pl.finish_date = None |
|
|
|
|
|
|
|
pl.save() |
|
|
|
|
|
|
|
except ProgressLesson.DoesNotExist: |
|
|
|
|
|
|
|
ProgressLesson.objects.create( |
|
|
|
|
|
|
|
progress=progress, |
|
|
|
|
|
|
|
lesson_token=token_list[-1:][0], |
|
|
|
|
|
|
|
checker=progress.teacher if lesson_list[-1:][0].is_hm else student |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
return Response("Эта функция доступна только сотрудникам персонала", status=403) |
|
|
|
|