Add (somewhat hacky) support for text blocks in QuestionsForms

This commit is contained in:
Mira Weller
2026-09-30 21:03:27 +02:00
parent 83d2d4e081
commit 830887a75f
2 changed files with 24 additions and 1 deletions
+8 -1
View File
@@ -54,6 +54,7 @@ from pretix.base.models import (
SalesChannel,
)
from pretix.base.models.items import Questionnaire, QuestionnaireChild
from pretix.base.templatetags.rich_text import rich_text
class InlineItemVariationSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
@@ -651,13 +652,19 @@ class QuestionRefField(serializers.PrimaryKeyRelatedField):
return self.source == '*'
class RenderedMarkdownField(serializers.CharField):
def to_representation(self, value):
return rich_text(value)
class InlineQuestionnaireChildSerializer(I18nAwareModelSerializer):
question = QuestionRefField(source='*', queryset=Question.objects.none())
dependency_question = QuestionRefField(allow_null=True, required=False, queryset=Question.objects.none())
rendered_help_text = RenderedMarkdownField(read_only=True, source='help_text')
class Meta:
model = QuestionnaireChild
fields = ('question', 'required', 'label', 'help_text', 'dependency_question', 'dependency_values')
fields = ('question', 'required', 'label', 'help_text', 'dependency_question', 'dependency_values', 'rendered_help_text')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
+16
View File
@@ -50,6 +50,7 @@ from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db.models import QuerySet
from django.db import ProgrammingError
from django.forms import Select, widgets
from django.forms.widgets import FILE_INPUT_CONTRADICTION
from django.utils.formats import date_format
@@ -869,6 +870,8 @@ class BaseQuestionsForm(forms.Form):
initial=initial,
widget=WrappedPhoneNumberPrefixWidget()
)
else:
raise ProgrammingError('Invalid question type')
field.datafield = datafield
if answers:
# Cache the answer object for later use
@@ -884,6 +887,15 @@ class BaseQuestionsForm(forms.Form):
return field
def build_text_block(self, request, event, qc):
return forms.CharField( # TODO(questionnaires): use a less hacky way to format this field
required=False,
label="",
help_text=rich_text((f"#### {qc.label}\n" if qc.label else "") + str(qc.help_text)),
disabled=True,
widget=QuestionCheckboxSelectMultiple,
)
def check_user_questions(self, d):
question_cache = {f.question.pk: f.question for f in self.fields.values() if getattr(f, 'question', None)}
@@ -990,6 +1002,7 @@ class TicketLevelQuestionsForm(BaseQuestionsForm):
if cartpos and item.validity_mode == Item.VALIDITY_MODE_DYNAMIC and item.validity_dynamic_start_choice:
self.fields['requested_valid_from'] = self.build_requested_valid_from_field(event, pos, item)
idx = 0
for questionnaire in questionnaires:
for child in getattr(questionnaire, 'childlist', questionnaire.children.all()):
if child.user_datafield:
@@ -997,6 +1010,9 @@ class TicketLevelQuestionsForm(BaseQuestionsForm):
self.fields['question_%s' % df.id] = self.build_user_question_field(request, event, pos.answerlist, child, df)
elif child.system_datafield:
self.fields[child.system_datafield] = self.build_system_question_field(request, event, pos, child)
else:
self.fields['text_%d' % idx] = self.build_text_block(request, event, child)
idx += 1
responses = question_form_fields.send(sender=event, position=pos)
data = pos.meta_info_data