diff options
-rw-r--r-- | yaksh/models.py | 21 | ||||
-rw-r--r-- | yaksh/test_models.py | 94 | ||||
-rw-r--r-- | yaksh/urls.py | 2 |
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"), |