from jwt import DecodeError from courses.models import Course, Lesson from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from rest_framework.views import APIView from django.contrib.auth import get_user_model from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer import jwt from courses.tasks import add_lesson from lms import settings class TreeView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def get(self, request, slug): try: course = Course.objects.get(slug=slug) return Response(CourseTreeSerializer(course).data, self.status_code) except Course.DoesNotExist: return Response("Course doesn't exist", status=404) class CourseListView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def post(self, request): """ This API endpoint create/update course. --- parameters: - name: level type: string required: true location: form - name: direction type: string required: true location: form - name: statistic type: string required: true location: form ... """ # TODO: Костыль teachers_emails = request.JSON.get('teachers', []) request.JSON['teachers'] = [get_user_model().objects.get(email=i).out_key for i in teachers_emails] course = Course.objects.update_or_create_course(**request.JSON.dict()) return Response(CourseDetailSerializer(course).data, status=self.status_code) def get(self, request): """ This API endpoint return list of courses. --- """ res = [CourseDetailSerializer(course).data for course in Course.objects.all()] return Response(res, self.status_code) class CourseDetailView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 @staticmethod def delete(request, slug): try: Course.objects.get(slug=slug).delete() except Course.DoesNotExist: return Response("Курса не существует", status=404) return Response(status=204) def get(self, request, slug): return Response(CourseDetailSerializer(Course.objects.get(slug=slug)).data, self.status_code) class LessonInfoView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def get(self, request, token): try: lesson = Lesson.objects.get(token=token) except Lesson.DoesNotExist: return Response('Урок не найден', status=404) if request.user.is_authenticated and request.user.out_key in lesson.topic.course.teacher_tokens: return Response(TeacherLessonSerializer(lesson).data, self.status_code) return Response("Пользователь не является преподователем по курсу", status=403) class LessonDetail(APIView): renderer_classes = (JSONRenderer,) @staticmethod def post(request, token): jwt_token = request.JSON.get('jwt_token', None) try: lesson = Lesson.objects.get(token=token) except Lesson.DoesNotExist: return Response("Урока не существует", status=404) l = LessonSerializer(lesson).data 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 if payload is None: if not lesson.free: return Response("Bad token", status=400) 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) if not prev_lesson is None: l['prev_token'] = prev_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) 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 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) return Response(l, status=200)