from rest_framework.views import APIView from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from access.models import Progress from maps.serializers import CourseMapSerializer from courses.models import Course, Vertex from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, MiniVertexSerializer class TreeView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 @staticmethod def post(request): print(request) return Response(status=204) def get(self, request, slug): try: course = Course.objects.get(slug=slug) except Course.DoesNotExist: return Response("Course doesn't exist", status=404) if request.user.is_authenticated(): try: route = course.progress_set.get(user=request.user).get_template() return Response(CourseMapSerializer(route.get_first()).data, self.status_code) except Progress.DoesNotExist: pass return Response(CourseMapSerializer(course.route.get_first()).data, self.status_code) class CourseDetailView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def get(self, request, pk): if not request.user.is_authenticated() and request.user.in_role in ['A']: return Response("Course detail access only for admin users", status=403) try: return Response(CourseDetailSerializer(Course.objects.get(id=pk)).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): course = Course.objects.update_or_create_course(**request.JSON.dict()) return Response(CourseDetailSerializer(course).data, status=self.status_code) def get(self, request): if request.user.is_authenticated() and request.user.is_staff: course_list = Course.objects.all() else: course_list = Course.objects.filter(public=True) res = [CourseListSerializer(course).data for course in course_list] return Response(res, self.status_code) class VertexDetail(APIView): renderer_classes = (JSONRenderer,) @staticmethod def get(request, pk): status = int(request.GET.get('status', '200')) try: vertex = Vertex.objects.get(id=pk) except Vertex.DoesNotExist: return Response("Vertex doesn't exist", status=404) if not vertex.check_vertex(request.user): return Response("permission denied", status=403) res = VertexSerializer(vertex).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) if status == 200 else Response(status=204)