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.
97 lines
3.5 KiB
97 lines
3.5 KiB
from rest_framework.views import APIView
|
|
from rest_framework.renderers import JSONRenderer
|
|
from rest_framework.response import Response
|
|
|
|
from access.models import Progress
|
|
from maps.serializers import CourseMapSerializer
|
|
from courses.models import Course, Vertex
|
|
from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, MiniVertexSerializer
|
|
|
|
|
|
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():
|
|
try:
|
|
route = course.progress_set.get(user=request.user).get_template()
|
|
return Response(CourseMapSerializer(route.get_first()).data, self.status_code)
|
|
except Progress.DoesNotExist:
|
|
pass
|
|
|
|
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:
|
|
# if progress.exists():
|
|
# next_vertex = vertex.get_next(progress[0].get_template())
|
|
# if next_vertex:
|
|
# res['next'] = MiniVertexSerializer(next_vertex).data
|
|
# res['is_in_progress'] = vertex in progress[0].get_objects_in_progress()
|
|
# else:
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data
|
|
# except Thread.DoesNotExist or Vertex.DoesNotExist:
|
|
# res['next'] = MiniVertexSerializer(vertex.get_next(vertex.course.route)).data
|
|
|
|
return Response(res, status=200) if status == 200 else Response(status=204)
|
|
|