diff --git a/access/models/progress.py b/access/models/progress.py index 7ef76be..abd9fae 100644 --- a/access/models/progress.py +++ b/access/models/progress.py @@ -15,6 +15,7 @@ class Progress(models.Model): related_name='teacher_progress') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') course_token = models.UUIDField(verbose_name="Токен курса", editable=False) + active_lesson = models.UUIDField(verbose_name="Токен активного урока", blank=True, null=True) def progress_status(self, sorted_token_list): """ diff --git a/access/tasks.py b/access/tasks.py new file mode 100644 index 0000000..7fb0de8 --- /dev/null +++ b/access/tasks.py @@ -0,0 +1,17 @@ +from courses.api import CourseProgressApi + + +def add_next_lesson(progress): + sorted_token_list = CourseProgressApi.get_topic_lesson(progress.course_token) + is_next = False + new_lesson = None + + for lesson_list in sorted_token_list: + for lesson_token in lesson_list: + if is_next: + new_lesson = lesson_token + is_next = lesson_token == progress.active_lesson + + progress.active_lesson = new_lesson + progress.save() + return "access update course %s" % progress.course_token diff --git a/access/views.py b/access/views.py index 7a0087c..af4c4be 100644 --- a/access/views.py +++ b/access/views.py @@ -20,6 +20,7 @@ from access.models.progress import ProgressLesson from access.models import Progress from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressLessonSerializer, \ ProgressAnalyticSerializer +from access.tasks import add_next_lesson from courses.api import CourseProgressApi @@ -246,33 +247,60 @@ class UpdateProgress(APIView): """ lesson_token = request.JSON.get('lesson_token', None) course_token = request.JSON.get('course_token', None) + student_out_key = request.JSON.get('student_out_key', None) + action = request.JSON.get('action', 'wait') comment = request.JSON.get('comment', None) if lesson_token is None or course_token is None: return Response('Не передан слаг курса или токен урока', status=400) try: - p = Progress.objects.get(user=request.user, course_token=course_token) + is_student = student_out_key is None + student = request.user if is_student else get_user_model().objects.get(out_key=student_out_key) + + if is_student: + p = Progress.objects.get(user=student, course_token=course_token) + else: + p = Progress.objects.get( + user=student, + teacher=request.user, + course_token=course_token, + ) + + if p.active_lesson == lesson_token: + return Response("Ошибка доступа", status=403) + try: pv = ProgressLesson.objects.get( progress=p, lesson_token=lesson_token, ) + if is_student and pv.status == ProgressLesson.STATUSES.fail and action == "wait": + pv.status = ProgressLesson.STATUSES.wait + + elif not is_student and pv.status == ProgressLesson.STATUSES.wait: + pv.status = action + + else: + return Response("Ошибка прав доступа", status=403) + + pv.comment_tokens.append(comment) + except ProgressLesson.DoesNotExist: pv = ProgressLesson.objects.create( date=datetime.datetime.now(), teacher=p.teacher, progress=p, lesson_token=lesson_token, + status=ProgressLesson.STATUSES.done ) - if not comment is None: - pv.comment_tokens.append(comment) + pv.save() - else: - pv.status = ProgressLesson.STATUSES.done + if pv.status == ProgressLesson.STATUSES.done: + #TODO: Ассинхроннаязадача для celery + add_next_lesson(p) - pv.save() return Response(ProgressLessonSerializer(pv).data, status=200) except Progress.DoesNotExist: