Normalize whitespace and strip <p> wrappers in question answers and feedback

This commit is contained in:
Ross
2025-10-20 17:20:48 +01:00
parent f6f208b065
commit e3055e3998
+40 -5
View File
@@ -4,6 +4,7 @@ from django.utils import timezone
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.utils.html import format_html
import re
from django.urls import reverse
@@ -112,16 +113,50 @@ class Question(QuestionBase):
return self.stem
def clean(self):
# normalize whitespace and strip surrounding <p>...</p> wrappers
try:
super().clean()
except Exception:
# If parent has no clean or it fails, ignore and continue
pass
def _strip_outer_p(text):
if not text:
return text
t = text.strip()
# match <p> with optional attributes, e.g. <p>, <p class="...">, etc.
m = re.match(r"^<p[^>]*>(.*)</p>$", t, flags=re.IGNORECASE | re.DOTALL)
if m:
return m.group(1).strip()
return t
# Answers
if self.a_answer:
self.a_answer = self.a_answer.strip()
self.a_answer = _strip_outer_p(self.a_answer)
if self.b_answer:
self.b_answer = self.b_answer.strip()
self.b_answer = _strip_outer_p(self.b_answer)
if self.c_answer:
self.c_answer = self.c_answer.strip()
self.c_answer = _strip_outer_p(self.c_answer)
if self.d_answer:
self.d_answer = self.d_answer.strip()
self.d_answer = _strip_outer_p(self.d_answer)
if self.e_answer:
self.e_answer = self.e_answer.strip()
self.e_answer = _strip_outer_p(self.e_answer)
# Per-answer feedbacks
if hasattr(self, 'a_feedback') and self.a_feedback:
self.a_feedback = _strip_outer_p(self.a_feedback)
if hasattr(self, 'b_feedback') and self.b_feedback:
self.b_feedback = _strip_outer_p(self.b_feedback)
if hasattr(self, 'c_feedback') and self.c_feedback:
self.c_feedback = _strip_outer_p(self.c_feedback)
if hasattr(self, 'd_feedback') and self.d_feedback:
self.d_feedback = _strip_outer_p(self.d_feedback)
if hasattr(self, 'e_feedback') and self.e_feedback:
self.e_feedback = _strip_outer_p(self.e_feedback)
# General feedback
if hasattr(self, 'feedback') and self.feedback:
self.feedback = _strip_outer_p(self.feedback)
def get_app_name(self):
return "sbas"