Add primary_answer field to AnatomyQuestion model and create migration to backfill existing values

This commit is contained in:
Ross
2026-02-16 09:32:25 +00:00
parent 90c96333a1
commit f72ec82525
2 changed files with 75 additions and 24 deletions
+32 -24
View File
@@ -127,6 +127,15 @@ class AnatomyQuestion(QuestionBase):
related_name="anatomy_authored_questions",
)
primary_answer = models.ForeignKey(
'Answer',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='primary_for_questions',
help_text="Optional explicit primary answer for this question",
)
class Meta:
permissions = ()
@@ -151,33 +160,32 @@ class AnatomyQuestion(QuestionBase):
def get_absolute_url(self):
return reverse("anatomy:question_detail", kwargs={"pk": self.pk})
def get_primary_answer(self):
if hasattr(self, "prefetched_primary_answer") and 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()
def get_primary_answer_obj(self):
"""Return the Answer instance considered the primary answer, or None.
Preference order:
- explicit `primary_answer` FK if set
- `prefetched_primary_answer` if provided by a queryset
- first non-proposed Answer with status CORRECT
"""
if getattr(self, "primary_answer", None):
return self.primary_answer
if hasattr(self, "prefetched_primary_answer") and self.prefetched_primary_answer:
return self.prefetched_primary_answer[0]
return self.answers.filter(proposed=False, status=Answer.MarkOptions.CORRECT).first()
def get_primary_answer(self):
"""Return the primary answer text (string) for templates and display.
Keeps backward compatibility by returning the answer string when
available, or "None yet..." if no primary answer is defined.
"""
ans = self.get_primary_answer_obj()
if ans is None:
return "None yet..."
else:
return ans.answer
if (
self.answers.filter(
proposed=False, status=Answer.MarkOptions.CORRECT
).count()
> 0
):
return (
self.answers.filter(proposed=False, status=Answer.MarkOptions.CORRECT)
.first()
.answer
)
else:
return "None yet..."
return ans.answer
def get_exams(self):
e = self.exams.all().values_list("name", flat=True)