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.
 
 
 
 
 
 

92 lines
3.3 KiB

from rest_framework.views import APIView
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from maps.serializers import CourseMapSerializer
from courses.models import Course, Vertex
from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer
from journals.models import Thread
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():
route = course.progress_set.get(user=request.user).get_template()
return Response(CourseMapSerializer(route.get_first()).data, self.status_code)
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:
journals = Thread.objects.get(key="user_%s__vertex_%s" % (request.user.id, vertex.id)).journal_set.all()
res['is_in_progress'] = progress.exists() and progress[0].active_obj == vertex and \
vertex.content_type.model == 'task' and \
not journals.filter(action_type__in=['no', 'yes']).count() < \
journals.filter(action_type='try').count()
except Thread.DoesNotExist:
pass
return Response(res, status=200) if status == 200 else Response(status=204)