Normalize whitespace and strip <p> wrappers in question answers and feedback
This commit is contained in:
+40
-5
@@ -4,6 +4,7 @@ from django.utils import timezone
|
|||||||
from django.core.files.storage import FileSystemStorage
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.html import format_html
|
from django.utils.html import format_html
|
||||||
|
import re
|
||||||
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
@@ -112,16 +113,50 @@ class Question(QuestionBase):
|
|||||||
return self.stem
|
return self.stem
|
||||||
|
|
||||||
def clean(self):
|
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:
|
if self.a_answer:
|
||||||
self.a_answer = self.a_answer.strip()
|
self.a_answer = _strip_outer_p(self.a_answer)
|
||||||
if self.b_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:
|
if self.c_answer:
|
||||||
self.c_answer = self.c_answer.strip()
|
self.c_answer = _strip_outer_p(self.c_answer)
|
||||||
if self.d_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:
|
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):
|
def get_app_name(self):
|
||||||
return "sbas"
|
return "sbas"
|
||||||
|
|||||||
Reference in New Issue
Block a user