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, MaterialDirection, Vertex from access.models import ActiveObject, ExtraPrivilege from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, CourseTreeSerializer from finance.models import Bill class DirectionListView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def get(self, _request): return Response([direction.title for direction in MaterialDirection.objects.all()], self.status_code) 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'] = ActiveObject.objects.get(course=course, user=request.user).active_obj.id except ActiveObject.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 Bill.objects.filter(service__course=course, user=request.user, status='F').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 ActiveObject.objects.get(course=vertex.course, user=request.user).is_access(vertex): return Response("permission denied", status=403) except ActiveObject.DoesNotExist: return Response("permission denied", status=403) return res_a