diff --git a/anatomy/models.py b/anatomy/models.py index 1a330132..ccc4ee9f 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -161,8 +161,8 @@ class AnatomyQuestion(models.Model): exams = ", ".join(e) return exams - def get_unmarked_answer_string(self, exam_pk=None): - unmarked_answers = self.get_unmarked_answers(exam_pk) + def get_unmarked_user_answer_string(self, exam_pk=None): + unmarked_answers = self.get_unmarked_user_answers(exam_pk) if not unmarked_answers: return "No answers to mark" @@ -172,7 +172,7 @@ class AnatomyQuestion(models.Model): ) ) - def get_unmarked_answers(self, exam_pk=None): + def get_unmarked_user_answers(self, exam_pk=None): if exam_pk is None: user_answers = set([i.answer_compare for i in self.cid_user_answers.all()]) else: @@ -187,8 +187,8 @@ class AnatomyQuestion(models.Model): return unmarked_answers - def get_unmarked_answer_count(self, exam_pk=None): - return len(self.get_unmarked_answers(exam_pk)) + def get_unmarked_user_answer_count(self, exam_pk=None): + return len(self.get_unmarked_user_answers(exam_pk)) def get_marked_answers(self): return set( diff --git a/anatomy/views.py b/anatomy/views.py index 864d9877..10043f48 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -323,7 +323,7 @@ def mark(request, pk, sk): # i.answer.lower() for i in question.incorrect_answers.all() # ] - unmarked_user_answers = question.get_unmarked_answers() + unmarked_user_answers = question.get_unmarked_user_answers() if request.method == "POST": diff --git a/generic/views.py b/generic/views.py index d72984f0..803e6ae3 100644 --- a/generic/views.py +++ b/generic/views.py @@ -419,7 +419,7 @@ class ExamViews(View, LoginRequiredMixin): questions = exam.exam_questions.all() - # Long cases require some special info + # Handle exams that require double marking try: if exam.double_mark: question_unmarked_map = [] diff --git a/longs/models.py b/longs/models.py index 64e69eee..3156a79a 100644 --- a/longs/models.py +++ b/longs/models.py @@ -178,13 +178,13 @@ class Long(models.Model): def get_image_url_array(self): return json.dumps(["https://www.penracourses.org.uk{}".format(i.url) for i in self.get_images()]) - def get_unmarked_answer_count(self, exam_pk=None, marker=None): + def get_unmarked_user_answer_count(self, exam_pk=None, marker=None): if exam_pk is None: return self.cid_user_answers.all().count() - return len(self.get_unmarked_answers(exam_pk=exam_pk, marker=marker)) + return len(self.get_unmarked_user_answers(exam_pk=exam_pk, marker=marker)) - def get_unmarked_answers(self, exam_pk=None, marker=None): + def get_unmarked_user_answers(self, exam_pk=None, marker=None): if exam_pk is None: answers = self.cid_user_answers.all() else: @@ -195,7 +195,7 @@ class Long(models.Model): if marker is None: return unmarked_answers - # If marker is specified we check for what they have marker + # If marker is specified we check for what they have marked marker_unmarked = [] for answer in unmarked_answers: if answer.mark.filter(marker=marker).count() < 1: diff --git a/longs/views.py b/longs/views.py index d55217b4..61b05013 100755 --- a/longs/views.py +++ b/longs/views.py @@ -678,9 +678,9 @@ def mark_answer(request, exam_id, question_number, cid, override=False): try: if exam.double_mark: - unmarked = question.get_unmarked_answers(exam_pk=exam.id, marker=request.user) + unmarked = question.get_unmarked_user_answers(exam_pk=exam.id, marker=request.user) else: - unmarked = question.get_unmarked_answers(exam_pk=exam.id) + unmarked = question.get_unmarked_user_answers(exam_pk=exam.id) next_unmarked_id = unmarked[0].cid if next_unmarked_id == cid: next_unmarked_id = unmarked[1].cid @@ -809,7 +809,7 @@ def mark_question_overview(request, exam_id, sk): unmarked_count = user_answers.filter(score=CidUserAnswer.ScoreOptions.UNMARKED).count() if exam.double_mark: - marker_unmarked_count = question.get_unmarked_answer_count(exam.pk, marker=request.user) + marker_unmarked_count = question.get_unmarked_user_answer_count(exam.pk, marker=request.user) return render( request, "longs/mark_question_double_overview.html", diff --git a/rapids/migrations/0032_exam_double_mark.py b/rapids/migrations/0032_exam_double_mark.py new file mode 100644 index 00000000..6fdb5204 --- /dev/null +++ b/rapids/migrations/0032_exam_double_mark.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.8 on 2021-10-16 07:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rapids', '0031_delete_note'), + ] + + operations = [ + migrations.AddField( + model_name='exam', + name='double_mark', + field=models.BooleanField(default=False, help_text='If the exam requires double marking'), + ), + ] diff --git a/rapids/models.py b/rapids/models.py index a8cec32b..208676e8 100644 --- a/rapids/models.py +++ b/rapids/models.py @@ -231,8 +231,8 @@ class Rapid(models.Model): exams = ", ".join(e) return exams - def get_unmarked_answer_string(self, exam_pk=None): - unmarked_answers = self.get_unmarked_answers(exam_pk) + def get_unmarked_user_answer_string(self, exam_pk=None): + unmarked_answers = self.get_unmarked_user_answers(exam_pk) if not unmarked_answers: return "No answers to mark" @@ -242,26 +242,40 @@ class Rapid(models.Model): ) ) - def get_unmarked_answers(self, exam_pk=None): - # If normal no answers to mark + def get_unmarked_user_answers(self, exam_pk=None, marker=None): + # If normal no answers to mark (they will be automarked) if self.normal: return [] if exam_pk is None: - user_answers = set( - [i.answer_compare for i in self.cid_user_answers.all() if i.normal == False] - ) + user_answer_queryset = self.cid_user_answers.all() else: - user_answers = set( - [i.answer_compare for i in self.cid_user_answers.filter(exam__id=exam_pk) if i.normal == False] - ) + user_answer_queryset = self.cid_user_answers.filter(exam__id=exam_pk) - unmarked_answers = user_answers - self.get_marked_answers() + marked_answers = self.get_marked_answers() - return unmarked_answers + unmarked_answers = set( + [i for i in user_answer_queryset if i.normal == False and i not in marked_answers] + ) - def get_unmarked_answer_count(self, exam_pk=None): - return len(self.get_unmarked_answers(exam_pk)) + #unmarked_answers = user_answers - self.get_marked_answers() + + if marker is None: + return [i.answer_compare for i in unmarked_answers] + + # If marker is specified we check for what they have marked + marker_unmarked = [] + for answer in unmarked_answers: + if answer.mark.filter(marker=marker).count() < 1: + marker_unmarked.append(answer) + + return marker_unmarked + + def get_unmarked_user_answer_count(self, exam_pk=None, marker=None): + if exam_pk is None: + return self.cid_user_answers.all().count() + + return len(self.get_unmarked_user_answers(exam_pk, marker=marker)) def get_user_answers(self, exam_pk=None): if exam_pk is None: @@ -459,6 +473,8 @@ class Exam(ExamBase): help_text='Author of exam', related_name="rapid_exam_author") + double_mark = models.BooleanField(default=False, help_text="If the exam requires double marking") + def get_normal_abnormal_breakdown(self): # Inefficient but more extendible diff --git a/rapids/views.py b/rapids/views.py index f4eb2dab..609b1c41 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -606,7 +606,7 @@ def mark(request, pk, sk): # i.answer.lower() for i in question.incorrect_answers.all() # ] - unmarked_user_answers = question.get_unmarked_answers() + unmarked_user_answers = question.get_unmarked_user_answers() if request.method == "POST":