from rest_framework.views import APIView from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from access.serializers import ExtraPrivilegeSerializer from courses.models import Course, Vertex from access.models import Progress, ExtraPrivilege from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, CourseTreeSerializer 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) res = CourseTreeSerializer(course).data try: res['active_id'] = Progress.objects.get(course=course, user=request.user).active_obj.id except Progress.DoesNotExist: res['active_id'] = False res['extra_privilege'] = [ ExtraPrivilegeSerializer(i).data for i in ExtraPrivilege.objects.filter( user=request.user, subject__course=course, ) ] return Response(res, 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 get(self, request): if not request.user.is_authenticated() or (not request.user.is_staff or request.GET.get('staff') == 'true'): return Response([CourseListSerializer(i).data for i in Course.objects.all()], self.status_code) res = [] for course in Course.objects.all(): if course.public: course_serialize = CourseListSerializer(course).data course_serialize['is_mine'] = False if request.user.is_authenticated() and Progress.objects.filter(course=course, user=request.user).exists(): course_serialize['is_mine'] = True res.append(course_serialize) 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) res_a = Response(VertexSerializer(vertex).data, status=200) if status == 200 else Response(status=204) if vertex.free: return res_a if not request.user.is_authenticated: return Response("Access to detail of vertex, exist only for authenticated users", status=403) if ExtraPrivilege.objects.filter(user=request.user, subject=vertex).exists(): return res_a try: if not Progress.objects.get(course=vertex.course, user=request.user).is_access(vertex): return Response("permission denied", status=403) except Progress.DoesNotExist: return Response("permission denied", status=403) return res_a