From a4bf74684bcb32e461defc36e48ba71bf7f02c03 Mon Sep 17 00:00:00 2001 From: mahesh Date: Mon, 29 Jan 2018 13:00:02 +0530 Subject: Fix bug in make_answerpaper --- yaksh/models.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index 1e45851..4dd045a 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1161,7 +1161,7 @@ class QuestionPaper(models.Model): return all_questions def make_answerpaper(self, user, ip, attempt_num, course_id): - """Creates an answer paper for the user to attempt the quiz""" + """Creates an answer paper for the user to attempt the quiz""" try: ans_paper = AnswerPaper.objects.get(user=user, attempt_number=attempt_num, @@ -1187,13 +1187,11 @@ class QuestionPaper(models.Model): ans_paper.save() ans_paper.questions_unanswered.add(*questions) except AnswerPaper.MultipleObjectsReturned: - ans_paper = AnswerPaper.objects.get(user=user, - attempt_number=attempt_num, - question_paper=self, - course_id=course_id - ).order_by('-id') - ans_paper = ans_paper[0] - + ans_paper = AnswerPaper.objects.filter(user=user, + attempt_number=attempt_num, + question_paper=self, + course_id=course_id + ).order_by('id').last() return ans_paper def _is_attempt_allowed(self, user, course_id): @@ -1503,6 +1501,9 @@ class AnswerPaper(models.Model): objects = AnswerPaperManager() + class Meta: + unique_together = ('user', 'question_paper', 'attempt_number') + def get_per_question_score(self, question_id): if question_id not in self.get_questions().values_list('id', flat=True): return 'NA' -- cgit From 782fd83b5931efde8ae26795c65e952df5012d0f Mon Sep 17 00:00:00 2001 From: mahesh Date: Tue, 30 Jan 2018 15:02:55 +0530 Subject: Add test cases to check for duplicate answerpapers --- yaksh/models.py | 6 ------ yaksh/test_models.py | 11 +++++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index 4dd045a..6a7b800 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1186,12 +1186,6 @@ class QuestionPaper(models.Model): ans_paper.questions_order = ",".join(question_ids) ans_paper.save() ans_paper.questions_unanswered.add(*questions) - except AnswerPaper.MultipleObjectsReturned: - ans_paper = AnswerPaper.objects.filter(user=user, - attempt_number=attempt_num, - question_paper=self, - course_id=course_id - ).order_by('id').last() return ans_paper def _is_attempt_allowed(self, user, course_id): diff --git a/yaksh/test_models.py b/yaksh/test_models.py index 7086a1e..9166a3e 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -12,6 +12,7 @@ from datetime import datetime, timedelta from django.utils import timezone import pytz from django.contrib.auth.models import Group +from django.db import IntegrityError from django.core.files import File from django.forms.models import model_to_dict from textwrap import dedent @@ -1313,6 +1314,16 @@ class AnswerPaperTestCases(unittest.TestCase): self.assertEqual(self.user2_answerpaper2.current_question(), self.question1) + def test_duplicate_attempt_answerpaper(self): + with self.assertRaises(IntegrityError): + new_answerpaper = AnswerPaper.objects.create( + user=self.answerpaper.user, + question_paper=self.answerpaper.question_paper, + attempt_number=self.answerpaper.attempt_number, + start_time=self.answerpaper.start_time, + end_time=self.answerpaper.end_time + ) + ############################################################################### class CourseTestCases(unittest.TestCase): -- cgit From 2c53d636aa4a3f36586910e1d3ef5276a7efc337 Mon Sep 17 00:00:00 2001 From: mahesh Date: Wed, 7 Feb 2018 18:49:08 +0530 Subject: Add course as a unique constraint --- yaksh/models.py | 4 +++- yaksh/test_models.py | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index 6a7b800..46cf603 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1496,7 +1496,9 @@ class AnswerPaper(models.Model): objects = AnswerPaperManager() class Meta: - unique_together = ('user', 'question_paper', 'attempt_number') + unique_together = ('user', 'question_paper', + 'attempt_number', "course" + ) def get_per_question_score(self, question_id): if question_id not in self.get_questions().values_list('id', flat=True): diff --git a/yaksh/test_models.py b/yaksh/test_models.py index 9166a3e..5db0f27 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -774,7 +774,8 @@ class AnswerPaperTestCases(unittest.TestCase): question_paper=self.question_paper, start_time=self.start_time, end_time=self.end_time, - user_ip=self.ip + user_ip=self.ip, + course=self.course ) self.attempted_papers = AnswerPaper.objects.filter( question_paper=self.question_paper, @@ -1321,7 +1322,8 @@ class AnswerPaperTestCases(unittest.TestCase): question_paper=self.answerpaper.question_paper, attempt_number=self.answerpaper.attempt_number, start_time=self.answerpaper.start_time, - end_time=self.answerpaper.end_time + end_time=self.answerpaper.end_time, + course=self.answerpaper.course ) -- cgit