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 from progress.models import ProgressLesson 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): # 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): 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 get(request, token): try: lesson = Lesson.objects.get(token=token) except Lesson.DoesNotExist: return Response("Lesson doesn't exist", status=404) if not lesson.free and not ProgressLesson.objects.filter(lesson_token=lesson.token).exists(): previous_lesson = lesson.topic.course.get_previous(lesson) if not previous_lesson is None or not ProgressLesson.objects.filter( lesson_token=previous_lesson.token, status=ProgressLesson.STATUSES.done).exists(): return Response("Lesson doesn't access", status=403) # TODO: Доделать систему прав на курс res = LessonSerializer(lesson).data # progress = vertex.course.progress_set.filter(user=request.user) # try: # if progress.exists(): # next_vertex = vertex.get_next(progress[0].get_template()) # if next_vertex: # res['next'] = MiniVertexSerializer(next_vertex).data # res['is_in_progress'] = vertex in progress[0].get_objects_in_progress() # else: # res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data # except Thread.DoesNotExist or Vertex.DoesNotExist: # res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data return Response(res, status=200)