diff --git a/courses/tasks.py b/courses/tasks.py index 9d00b7f..9384958 100644 --- a/courses/tasks.py +++ b/courses/tasks.py @@ -1,4 +1,5 @@ from progress.models import ProgressLesson, Progress +from django.contrib.auth import get_user_model def add_lesson(user_out_key: str, course_token: str, lesson_token: str, teacher_key: str, is_hm: bool): @@ -8,5 +9,5 @@ def add_lesson(user_out_key: str, course_token: str, lesson_token: str, teacher_ ProgressLesson.objects.get_or_create( progress=p, lesson_token=lesson_token, - checker=user_out_key if is_hm else teacher_key, + checker=get_user_model().objects.get(out_key=(teacher_key if is_hm else user_out_key)), ) \ No newline at end of file diff --git a/courses/views.py b/courses/views.py index 90450b6..1a6138b 100644 --- a/courses/views.py +++ b/courses/views.py @@ -108,41 +108,43 @@ class LessonDetail(APIView): l = LessonSerializer(lesson).data - if not lesson.free: - if jwt_token is None: - return Response("Ошибка доступа", status=403) + try: + payload = None if jwt_token is None\ + else jwt.decode(jwt_token, settings.COURSE_PROGRESS_SECRET_KEY, algorithms=['HS256']) + except DecodeError: + payload = None + + course = lesson.topic.course - try: - payload = jwt.decode(jwt_token, settings.COURSE_PROGRESS_SECRET_KEY, algorithms=['HS256']) - except DecodeError: + if payload is None: + if not lesson.free: return Response("Bad token", status=400) - try: - course = Course.objects.get(token=payload['course_token']) - except Course.DoesNotExist: - return Response("Course not found", status=404) + else: + return Response(l, status=200) + + prev_lesson = course.get_previous(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) + next_lesson = course.get_next(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) - prev_lesson = course.get_previous(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) - next_lesson = course.get_next(lesson, (lambda x: not x.is_hm) if payload['only_watch'] else None) + if not prev_lesson is None: + l['prev_token'] = prev_lesson.token - if not prev_lesson is None: - l['prev_token'] = prev_lesson.token + if not next_lesson is None: + l['next_token'] = next_lesson.token - if not next_lesson is None: - l['next_token'] = next_lesson.token + new_lesson = False + for payload_lesson in payload['lessons']: + if payload_lesson['lesson_token'] == str(lesson.token): + return Response(l, status=200) - new_lesson = False - for payload_lesson in payload['lessons']: - if payload_lesson['lesson_token'] == str(lesson.token): - return Response(l, status=200) + if not prev_lesson is None and str(prev_lesson.token) == payload_lesson['lesson_token']: new_lesson = True if prev_lesson is None else \ - ((payload_lesson['status'] == "done" or payload_lesson['status'] == "wait") - if prev_lesson.token == payload_lesson['lesson_token'] else False) + (payload_lesson['status'] == "done" or payload_lesson['status'] == "wait") - if not new_lesson: - return Response("Permission denied", status=403) + if not new_lesson: + return Response("Permission denied", status=403) - #TODO Задача для селери - add_lesson(request.user.out_key, course.token, lesson.token, course.get_teacher(), lesson.is_hm) + #TODO Задача для селери + add_lesson(request.user.out_key, course.token, lesson.token, course.get_teacher(), lesson.is_hm) return Response(l, status=200) diff --git a/progress/views.py b/progress/views.py index ed3db3f..e0ae37d 100644 --- a/progress/views.py +++ b/progress/views.py @@ -14,7 +14,8 @@ 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 progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer, \ + SecureProgressSerializer from courses.api import CourseProgressApi, CourseParamsApi from progress.tasks import add_next_lesson @@ -203,13 +204,9 @@ class StudentUpdateProgress(APIView): pv.save() else: - return Response("Ошибка прав доступа", status=403) + pass - if pv.status == ProgressLesson.STATUSES.done: - # TODO: Ассинхроннаязадача для celery - add_next_lesson(pv.progress) - - return Response(ProgressSerializer(pv.progress).data, status=200) + return Response(SecureProgressSerializer(pv.progress).data, status=200) except Progress.DoesNotExist: return Response('Не найден прогресс по заданным параметрам', status=404)