summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorprathamesh2019-06-21 03:23:45 +0530
committerprathamesh2019-06-21 03:23:45 +0530
commita7b4b9e0c6699987d1dee4007e9c62da15559432 (patch)
tree7cb2bfe3dcb36f073ad9db1f1b1d3a2f465cd2d0
parent81d1e4e4ff4406f7f3823c40a82cf21096f2ccec (diff)
downloadonline_test-a7b4b9e0c6699987d1dee4007e9c62da15559432.tar.gz
online_test-a7b4b9e0c6699987d1dee4007e9c62da15559432.tar.bz2
online_test-a7b4b9e0c6699987d1dee4007e9c62da15559432.zip
Add API to get complete course details and AnswerPaper for the quiz
Courses are retrieved in which the user is a student. Complete course info is made available. Answerpaper is created if does not exists on start quiz. AnswerPaper detail info is made available. If attempts are not allowed then the message is retrieved.
-rw-r--r--api/serializers.py42
-rw-r--r--api/urls.py3
-rw-r--r--api/views.py45
3 files changed, 88 insertions, 2 deletions
diff --git a/api/serializers.py b/api/serializers.py
index d34f269..df66730 100644
--- a/api/serializers.py
+++ b/api/serializers.py
@@ -1,5 +1,8 @@
from rest_framework import serializers
-from yaksh.models import Question, Quiz, QuestionPaper, AnswerPaper
+from yaksh.models import (
+ Question, Quiz, QuestionPaper, AnswerPaper, Course,
+ LearningModule, LearningUnit, Lesson
+)
class QuestionSerializer(serializers.ModelSerializer):
@@ -21,6 +24,43 @@ class QuestionPaperSerializer(serializers.ModelSerializer):
class AnswerPaperSerializer(serializers.ModelSerializer):
+
+ questions = QuestionSerializer(many=True)
+
class Meta:
model = AnswerPaper
fields = '__all__'
+
+
+class LessonSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Lesson
+ fields = '__all__'
+
+
+class LearningUnitSerializer(serializers.ModelSerializer):
+
+ quiz = QuizSerializer()
+ lesson = LessonSerializer()
+
+ class Meta:
+ model = LearningUnit
+ fields = '__all__'
+
+
+class LearningModuleSerializer(serializers.ModelSerializer):
+
+ learning_unit = LearningUnitSerializer(many=True)
+
+ class Meta:
+ model = LearningModule
+ fields = '__all__'
+
+
+class CourseSerializer(serializers.ModelSerializer):
+
+ learning_module = LearningModuleSerializer(many=True)
+
+ class Meta:
+ model = Course
+ fields = '__all__'
diff --git a/api/urls.py b/api/urls.py
index 5dfd8c7..22a9b54 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -7,6 +7,9 @@ urlpatterns = [
url(r'questions/$', views.QuestionList.as_view(), name='questions'),
url(r'questions/(?P<pk>[0-9]+)/$', views.QuestionDetail.as_view(),
name='question'),
+ url(r'get_courses/$', views.CourseList.as_view(), name='get_courses'),
+ url(r'start_quiz/(?P<course_id>[0-9]+)/(?P<quiz_id>[0-9]+)/$', views.StartQuiz.as_view(),
+ name='start_quiz'),
url(r'quizzes/$', views.QuizList.as_view(), name='quizzes'),
url(r'quizzes/(?P<pk>[0-9]+)/$', views.QuizDetail.as_view(), name='quiz'),
url(r'questionpapers/$', views.QuestionPaperList.as_view(),
diff --git a/api/views.py b/api/views.py
index ff21828..b81e895 100644
--- a/api/views.py
+++ b/api/views.py
@@ -3,7 +3,7 @@ from yaksh.models import (
)
from api.serializers import (
QuestionSerializer, QuizSerializer, QuestionPaperSerializer,
- AnswerPaperSerializer
+ AnswerPaperSerializer, CourseSerializer
)
from rest_framework.views import APIView
from rest_framework.response import Response
@@ -31,6 +31,49 @@ class QuestionList(APIView):
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+class CourseList(APIView):
+ """ List all courses """
+
+ def get(self, request, format=None):
+ courses = Course.objects.filter(students=request.user)
+ serializer = CourseSerializer(courses, many=True)
+ return Response(serializer.data)
+
+
+class StartQuiz(APIView):
+ """ Retrieve Answerpaper. If does not exists then create one """
+
+ def get_quiz(self, pk, user):
+ try:
+ return Quiz.objects.get(pk=pk)
+ except Quiz.DoesNotExist:
+ raise Http404
+
+ def get(self, request, course_id, quiz_id, format=None):
+ user = request.user
+ quiz = self.get_quiz(quiz_id, user)
+ questionpaper = quiz.questionpaper_set.first()
+
+ last_attempt = AnswerPaper.objects.get_user_last_attempt(
+ questionpaper, user, course_id)
+ if last_attempt and last_attempt.is_attempt_inprogress():
+ serializer = AnswerPaperSerializer(last_attempt)
+ return Response(serializer.data)
+
+ can_attempt, msg = questionpaper.can_attempt_now(user, course_id)
+ if not can_attempt:
+ return Response({'message': msg})
+ if not last_attempt:
+ attempt_number = 1
+ else:
+ attempt_number = last_attempt.attempt_number + 1
+ ip = request.META['REMOTE_ADDR']
+ answerpaper = questionpaper.make_answerpaper(user, ip, attempt_number,
+ course_id)
+ serializer = AnswerPaperSerializer(answerpaper)
+ return Response(serializer.data, status=status.HTTP_201_CREATED)
+
+
class QuestionDetail(APIView):
""" Retrieve, update or delete a question """