diff --git a/anatomy/models.py b/anatomy/models.py index ce552862..bbe28255 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -158,9 +158,12 @@ class AnatomyQuestion(models.Model): return reverse("anatomy:question_detail", kwargs={"pk": self.pk}) def get_primary_answer(self): - ans = self.answers.filter( - proposed=False, status=Answer.MarkOptions.CORRECT - ).first() + if hasattr(self, "prefetched_primary_answer"): + ans = self.prefetched_primary_answer[0] + else: + ans = self.answers.filter( + proposed=False, status=Answer.MarkOptions.CORRECT + ).first() # ans = self.answers.first() if ans is None: @@ -214,13 +217,26 @@ class AnatomyQuestion(models.Model): return unmarked_answers def get_unmarked_user_answer_count(self, exam_pk=None): - return len(self.get_unmarked_user_answers(exam_pk)) + if exam_pk is None: + return self.cid_user_answers.filter( + score=Answer.MarkOptions.UNMARKED + ).count() + else: + if hasattr(self, "prefetched_unmarked_cid_answers"): + return len(self.prefetched_unmarked_cid_answers) + + else: + return self.cid_user_answers.filter( + score=Answer.MarkOptions.UNMARKED, exam__id=exam_pk + ).count() + # return len(self.get_unmarked_user_answers(exam_pk)) def get_marked_answers(self): return set( [ i.answer_compare for i in self.answers.filter(proposed=False) + # for i in self.answers.all() if i.status != i.MarkOptions.UNMARKED ] ) @@ -236,6 +252,7 @@ class AnatomyQuestion(models.Model): [ str(i) for i in self.answers.filter(proposed=False) + # for i in self.answers.all() if i.status == i.MarkOptions.CORRECT ] ) diff --git a/anatomy/views.py b/anatomy/views.py index 61b0e756..89901650 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -340,8 +340,6 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): except IndexError: raise Http404("Exam question does not exist") - # unmarked_user_answers = question.get_unmarked_user_answers() - if request.method == "POST": form = MarkAnatomyQuestionForm(request.POST) diff --git a/generic/views.py b/generic/views.py index 5379836d..09cc6141 100644 --- a/generic/views.py +++ b/generic/views.py @@ -446,15 +446,16 @@ class ExamViews(View, LoginRequiredMixin): "region", "examination", "question_type", - ).all() - # .prefetch_related( - # Prefetch( - # "answers", - # queryset=self.Answer.objects.filter( - # proposed=False, status=self.Answer.MarkOptions.CORRECT - # ), - # ) - # ) + ) + .all() + .prefetch_related( + Prefetch( + "answers", + queryset=self.Answer.objects.filter(proposed=False, status=self.Answer.MarkOptions.CORRECT), + to_attr="prefetched_primary_answer" + #queryset=self.Answer.objects.filter(), + ), + ) ) elif self.app_name == "rapids": questions = ( @@ -622,7 +623,35 @@ class ExamViews(View, LoginRequiredMixin): if not self.check_user_access(request.user, pk): raise PermissionDenied - questions = exam.exam_questions.all() + if self.app_name == "anatomy": + questions = ( + exam.exam_questions.select_related( + "modality", + "structure", + "body_part", + "region", + "examination", + "question_type", + ) + .all() + .prefetch_related( + #"cid_user_answers", + Prefetch( + "answers", + queryset=self.Answer.objects.filter(proposed=False, status=self.Answer.MarkOptions.CORRECT), + to_attr="prefetched_primary_answer" + #queryset=self.Answer.objects.filter(), + ), + Prefetch( + "cid_user_answers", + queryset=self.CidUserAnswer.objects.filter(score=self.Answer.MarkOptions.UNMARKED, exam__id=pk), + to_attr="prefetched_unmarked_cid_answers" + #queryset=self.Answer.objects.filter(), + ), + ) + ) + else: + questions = exam.exam_questions.all() # Handle exams that require double marking try: