You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
3.8 KiB

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
if not request.user.is_authenticated():
res['active_id'] = False
res['extra_privilege'] = []
return Response(res, self.status_code)
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.filter(public=True):
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