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.
 
 
 
 
 
 

116 lines
3.9 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, 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 request.user.in_role == 'U'))\
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.manager.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