diff --git a/progress/management/commands/set_progress.py b/progress/management/commands/set_progress.py index 8dbb2ae..525c4dc 100644 --- a/progress/management/commands/set_progress.py +++ b/progress/management/commands/set_progress.py @@ -101,7 +101,7 @@ class Command(BaseCommand): pl.finish_date = None pl.save() except ProgressLesson.DoesNotExist: - pl = ProgressLesson.objects.create( + ProgressLesson.objects.create( progress=progress, lesson_token=token_list[-1:][0], checker=progress.teacher if lesson_list[-1:][0].is_hm else student diff --git a/progress/urls.py b/progress/urls.py index 4ec08b4..b78ac8f 100644 --- a/progress/urls.py +++ b/progress/urls.py @@ -6,4 +6,5 @@ urlpatterns = [ url(r'students/(?P[0-9A-Fa-f-]+)/$', views.StudentWorkView.as_view()), url(r'student/$', views.StudentUpdateProgress.as_view()), url(r'teacher/$', views.TeacherUpdateProgress.as_view()), + url(r'set-progress/$', views.SetProgress.as_view()), ] \ No newline at end of file diff --git a/progress/views.py b/progress/views.py index 9587cce..73bfc08 100644 --- a/progress/views.py +++ b/progress/views.py @@ -10,6 +10,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from django.db.models import Q +from courses.models import Course from progress.models import ProgressLesson, Progress from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer from courses.api import CourseProgressApi @@ -252,3 +253,96 @@ class UserGuardView(APIView): return res_204 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)