summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py21
-rw-r--r--yaksh/test_models.py94
-rw-r--r--yaksh/urls.py2
3 files changed, 97 insertions, 20 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index f7d9906..ff326d3 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -1199,11 +1199,12 @@ class AnswerPaper(models.Model):
def get_current_question(self, questions):
if self.questions_order:
- question_id = int(self.questions_order.split(',')[0])
- question = questions.get(id=question_id)
- else:
- question = questions.first()
- return question
+ available_question_ids = questions.values_list('id', flat=True)
+ ordered_question_ids = [int(q) for q in self.questions_order.split(',')]
+ for qid in ordered_question_ids:
+ if qid in available_question_ids:
+ return questions.get(id=qid)
+ return questions.first()
def questions_left(self):
"""Returns the number of questions left."""
@@ -1218,10 +1219,7 @@ class AnswerPaper(models.Model):
self.questions_answered.add(question_id)
self.questions_unanswered.remove(question_id)
- next_question = self.next_question(question_id)
- if next_question and next_question.id == int(question_id):
- return None
- return next_question
+ return self.next_question(question_id)
def next_question(self, question_id):
"""
@@ -1229,8 +1227,9 @@ class AnswerPaper(models.Model):
available question.
"""
if self.questions_order:
- all_questions = [int(q_id)
- for q_id in self.questions_order.split(',')]
+ all_questions = [
+ int(q_id) for q_id in self.questions_order.split(',')
+ ]
else:
all_questions = list(self.questions.all().values_list(
'id', flat=True))
diff --git a/yaksh/test_models.py b/yaksh/test_models.py
index ea0cfca..71969fc 100644
--- a/yaksh/test_models.py
+++ b/yaksh/test_models.py
@@ -549,12 +549,20 @@ class AnswerPaperTestCases(unittest.TestCase):
self.quiz = Quiz.objects.get(description='demo quiz 1')
self.question_paper = QuestionPaper(quiz=self.quiz, total_marks=3)
self.question_paper.save()
- self.questions = Question.objects.all()[0:3]
+ self.quiz2 = Quiz.objects.get(description='demo quiz 2')
+ self.qtn_paper_with_single_question = QuestionPaper(
+ quiz=self.quiz2, total_marks=3
+ )
+ self.qtn_paper_with_single_question.save()
+
+ all_questions = Question.objects.all()
+ self.questions = all_questions[0:3]
self.start_time = timezone.now()
self.end_time = self.start_time + timedelta(minutes=20)
- self.question1 = self.questions[0]
- self.question2 = self.questions[1]
- self.question3 = self.questions[2]
+ self.question1 = all_questions[0]
+ self.question2 = all_questions[1]
+ self.question3 = all_questions[2]
+ self.question4 = all_questions[3]
# create answerpaper
self.answerpaper = AnswerPaper(user=self.user,
@@ -597,6 +605,33 @@ class AnswerPaperTestCases(unittest.TestCase):
)
self.answerpaper.answers.add(self.answer1)
+ # create an answerpaper with only one question
+ self.answerpaper_single_question = AnswerPaper(user=self.user,
+ question_paper=self.question_paper,
+ start_time=self.start_time,
+ end_time=self.end_time,
+ user_ip=self.ip
+ )
+ self.attempted_papers = AnswerPaper.objects.filter(
+ question_paper=self.question_paper,
+ user=self.user
+ )
+ self.qtn_paper_with_single_question.fixed_questions.add(self.question4)
+ already_attempted = self.attempted_papers.count()
+ self.answerpaper_single_question.attempt_number = already_attempted + 1
+ self.answerpaper_single_question.save()
+ self.answerpaper_single_question.questions.add(self.question4)
+ self.answerpaper_single_question.questions_unanswered.add(self.question4)
+ self.answerpaper_single_question.save()
+ # answers for the Answer Paper
+ self.single_answer = Answer(question=self.question4,
+ answer="Demo answer",
+ correct=True, marks=1,
+ error=json.dumps([])
+ )
+ self.single_answer.save()
+ self.answerpaper.answers.add(self.single_answer)
+
self.question1.language = 'python'
self.question1.test_case_type = 'standardtestcase'
self.question1.summary = "Question1"
@@ -656,6 +691,47 @@ class AnswerPaperTestCases(unittest.TestCase):
self.user2, self.ip, 1
)
+ def test_returned_question_is_not_none(self):
+ # Test add_completed_question and next_question
+ # When all questions are answered
+
+ # Before questions are answered
+ self.assertEqual(self.answerpaper_single_question.questions_left(), 1)
+
+ current_question = self.answerpaper_single_question.add_completed_question(
+ self.question4.id
+ )
+
+
+ # Then
+ self.assertEqual(
+ self.answerpaper_single_question.questions_answered.all()[0],
+ self.question4
+ )
+ self.assertEqual(self.answerpaper_single_question.questions_left(), 0)
+ self.assertIsNotNone(current_question)
+ self.assertEqual(current_question.summary, "Q4")
+
+ # When
+ next_question = self.answerpaper_single_question.next_question(
+ self.question4.id
+ )
+
+ # Then
+ self.assertEqual(self.answerpaper_single_question.questions_left(), 0)
+ self.assertIsNotNone(next_question)
+ self.assertEqual(next_question.summary, "Q4")
+
+ # When
+ current_question = self.answerpaper_single_question.get_current_question(
+ self.answerpaper_single_question.questions.all()
+ )
+
+ # Then
+ self.assertEqual(self.answerpaper_single_question.questions_left(), 0)
+ self.assertIsNotNone(current_question)
+ self.assertEqual(current_question.summary, "Q4")
+
def test_validate_and_regrade_mcc_correct_answer(self):
# Given
mcc_answer = [str(self.mcc_based_testcase.id)]
@@ -786,6 +862,7 @@ class AnswerPaperTestCases(unittest.TestCase):
# Test completed_question() method of Answer Paper
question = self.answerpaper.add_completed_question(self.question1.id)
+ self.assertIsNotNone(question)
self.assertEqual(self.answerpaper.questions_left(), 2)
# Test next_question() method of Answer Paper
@@ -817,7 +894,6 @@ class AnswerPaperTestCases(unittest.TestCase):
# Then
self.assertTrue(next_question_id is not None)
-
self.assertEqual(next_question_id.summary, "Question1")
# Given, last question in the list
@@ -851,11 +927,12 @@ class AnswerPaperTestCases(unittest.TestCase):
# When all questions are answered
current_question = self.answerpaper.add_completed_question(
- self.question2.id
- )
+ self.question2.id
+ )
# Then
self.assertEqual(self.answerpaper.questions_left(), 1)
+ self.assertIsNotNone(current_question)
self.assertEqual(current_question.summary, "Question3")
# When
@@ -865,6 +942,7 @@ class AnswerPaperTestCases(unittest.TestCase):
# Then
self.assertEqual(self.answerpaper.questions_left(), 0)
+ self.assertIsNotNone(current_question)
self.assertTrue(current_question == self.answerpaper.questions.all()[0])
# When
@@ -898,7 +976,7 @@ class AnswerPaperTestCases(unittest.TestCase):
first_answer_obj = first_answer['answer']
self.assertEqual(first_answer_obj.answer, 'Demo answer')
self.assertTrue(first_answer_obj.correct)
- self.assertEqual(len(answered), 2)
+ self.assertEqual(len(answered), 3)
def test_is_answer_correct(self):
self.assertTrue(self.answerpaper.is_answer_correct(self.questions[0]))
diff --git a/yaksh/urls.py b/yaksh/urls.py
index 2e25bee..4c5593a 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -100,7 +100,7 @@ urlpatterns = [
views.regrade, name='regrade'),
url(r'^manage/regrade/paper/(?P<course_id>\d+)/(?P<answerpaper_id>\d+)/$',
views.regrade, name='regrade'),
- url(r'^manage/(?P<mode>[\w\-]+)/(?P<quiz_id>\d+)/$', views.test_quiz),
+ url(r'^manage/(?P<mode>godmode|usermode)/(?P<quiz_id>\d+)/$', views.test_quiz),
url(r'^manage/create_demo_course/$', views.create_demo_course),
url(r'^manage/courses/download_course_csv/(?P<course_id>\d+)/$',
views.download_course_csv, name="download_course_csv"),