from rest_framework.views import APIView from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from maps.serializers import CourseMapSerializer from courses.models import Course, Vertex from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer from journals.models import Thread 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(): route = course.progress_set.get(user=request.user).get_template() return Response(CourseMapSerializer(route.get_first()).data, self.status_code) 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: journals = Thread.objects.get(key="user_%s__vertex_%s" % (request.user.id, vertex.id)).journal_set.all() res['is_in_progress'] = progress.exists() and progress[0].active_obj == vertex and \ vertex.content_type.model == 'task' and \ not journals.filter(action_type__in=['no', 'yes']).count() < \ journals.filter(action_type='try').count() except Thread.DoesNotExist: pass return Response(res, status=200) if status == 200 else Response(status=204)