From 8bee2b4a4f47ad1e0c23c23fc07354aa3ca578fb Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Wed, 12 Aug 2026 16:03:07 +0200 Subject: [PATCH] Get rid of CheckoutSession / Order distinction in OrderLevelQuestionsForm, both behave the same way --- src/pretix/base/forms/questions.py | 28 ++++++++++++---------------- src/pretix/base/views/mixins.py | 23 ++++++++++++----------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index bab14d053d..228f203e84 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -638,7 +638,7 @@ class PortraitImageField(SizeValidationMixin, ExtValidationMixin, forms.FileFiel FakeQuestion = namedtuple( - 'FakeQuestion', 'id question position required help_text container_type' + 'FakeQuestion', 'id question position required help_text container_type', defaults=('', Question.ContainerType.ORDERPOSITION) ) @@ -647,19 +647,19 @@ def get_fake_attendee_questions(settings): sqo = settings.system_question_order if settings.attendee_names_asked: - fq.append(FakeQuestion('attendee_name_parts', _('Attendee name'), sqo.get('attendee_name_parts', 0), settings.attendee_names_required, '', Question.ContainerType.ORDERPOSITION)) + fq.append(FakeQuestion('attendee_name_parts', _('Attendee name'), sqo.get('attendee_name_parts', 0), settings.attendee_names_required)) if settings.attendee_emails_asked: - fq.append(FakeQuestion('attendee_email', _('Attendee email'), sqo.get('attendee_email', 0), settings.attendee_emails_required, '', Question.ContainerType.ORDERPOSITION)) + fq.append(FakeQuestion('attendee_email', _('Attendee email'), sqo.get('attendee_email', 0), settings.attendee_emails_required)) if settings.attendee_company_asked: - fq.append(FakeQuestion('company', _('Company'), sqo.get('company', 0), settings.attendee_company_required, '', Question.ContainerType.ORDERPOSITION)) + fq.append(FakeQuestion('company', _('Company'), sqo.get('company', 0), settings.attendee_company_required)) if settings.attendee_addresses_asked: - fq.append(FakeQuestion('street', _('Street'), sqo.get('street', 0), settings.attendee_addresses_required, '', Question.ContainerType.ORDERPOSITION)) - fq.append(FakeQuestion('zipcode', _('ZIP code'), sqo.get('zipcode', 0), settings.attendee_addresses_required, '', Question.ContainerType.ORDERPOSITION)) - fq.append(FakeQuestion('city', _('City'), sqo.get('city', 0), settings.attendee_addresses_required, '', Question.ContainerType.ORDERPOSITION)) - fq.append(FakeQuestion('country', _('Country'), sqo.get('country', 0), settings.attendee_addresses_required, '', Question.ContainerType.ORDERPOSITION)) + fq.append(FakeQuestion('street', _('Street'), sqo.get('street', 0), settings.attendee_addresses_required)) + fq.append(FakeQuestion('zipcode', _('ZIP code'), sqo.get('zipcode', 0), settings.attendee_addresses_required)) + fq.append(FakeQuestion('city', _('City'), sqo.get('city', 0), settings.attendee_addresses_required)) + fq.append(FakeQuestion('country', _('Country'), sqo.get('country', 0), settings.attendee_addresses_required)) return fq @@ -669,7 +669,7 @@ class BaseQuestionsForm(forms.Form): """ address_validation = False - def build_user_question_field(self, request, event, answerlist, container, q): + def build_user_question_field(self, request, event, answerlist, q): # Do we already have an answer? Provide it as the initial value answers = [a for a in answerlist if a.question_id == q.id] if answers: @@ -947,7 +947,7 @@ class BaseQuestionsForm(forms.Form): class OrderLevelQuestionsForm(BaseQuestionsForm): - def __init__(self, *args, **kwargs): + def __init__(self, container, *args, **kwargs): """ Takes two additional keyword arguments: @@ -956,10 +956,6 @@ class OrderLevelQuestionsForm(BaseQuestionsForm): :param event: The event this belongs to """ request = kwargs.pop('request', None) - checkoutsession = kwargs.pop('checkoutsession', None) - order = kwargs.pop('order', None) - container = checkoutsession or order - assert container and not (checkoutsession and order) # exactly one should be set event = kwargs.pop('event') self.all_optional = kwargs.pop('all_optional', False) @@ -972,7 +968,7 @@ class OrderLevelQuestionsForm(BaseQuestionsForm): answerlist = container.answers.prefetch_related('options') for q in questions: - self.fields['question_%s' % q.id] = self.build_user_question_field(request, event, answerlist, container, q) + self.fields['question_%s' % q.id] = self.build_user_question_field(request, event, answerlist, q) def clean(self): d = super().clean() @@ -1019,7 +1015,7 @@ class TicketLevelQuestionsForm(BaseQuestionsForm): if isinstance(q, FakeQuestion): self.fields[q.id] = self.build_system_question_field(request, event, pos, q) else: - self.fields['question_%s' % q.id] = self.build_user_question_field(request, event, pos.answerlist, pos, q) + self.fields['question_%s' % q.id] = self.build_user_question_field(request, event, pos.answerlist, q) responses = question_form_fields.send(sender=event, position=pos) data = pos.meta_info_data diff --git a/src/pretix/base/views/mixins.py b/src/pretix/base/views/mixins.py index 64a7ab26c3..157f805430 100644 --- a/src/pretix/base/views/mixins.py +++ b/src/pretix/base/views/mixins.py @@ -65,18 +65,15 @@ class BaseQuestionsViewMixin: @cached_property def order_questions_form(self): - c = self.order_question_container - if c is None: + container = self.order_question_container + if container is None: return None - checkoutsession = c if isinstance(c, CheckoutSession) else None - order = c if isinstance(c, Order) else None kwargs = {} # self.question_form_kwargs(cr) form = self.order_form_class( event=self.request.event, prefix='order', request=self.request, - checkoutsession=checkoutsession, - order=order, + container=container, all_optional=self.all_optional, data=(self.request.POST if self.request.method == 'POST' else None), files=(self.request.FILES if self.request.method == 'POST' else None), @@ -164,6 +161,8 @@ class BaseQuestionsViewMixin: if not self.order_questions_form.is_valid(): failed = True else: + checkoutsession = self.order_question_container if isinstance(self.order_question_container, CheckoutSession) else None + order = self.order_question_container if isinstance(self.order_question_container, Order) else None for k, v in self.order_questions_form.cleaned_data.items(): if k.startswith('question_'): field = self.order_questions_form.fields[k] @@ -179,15 +178,17 @@ class BaseQuestionsViewMixin: self._save_to_answer(field, field.answer, v) field.answer.save() elif v != '' and v is not None: - answer = self._upsert_answer( + self._upsert_answer( field, v, - checkoutsession=self.order_questions_form.checkoutsession, - order=self.order_questions_form.order, + checkoutsession=checkoutsession, + order=order, question=field.question, ) for form in self.forms: meta_info = form.pos.meta_info_data + cartposition = form.pos if isinstance(form.pos, CartPosition) else None + orderposition = form.pos if isinstance(form.pos, OrderPosition) else None # Every form represents a CartPosition or OrderPosition with questions attached if not form.is_valid(): failed = True @@ -241,8 +242,8 @@ class BaseQuestionsViewMixin: elif v != '' and v is not None: answer = self._upsert_answer( field, v, - cartposition=(form.pos if isinstance(form.pos, CartPosition) else None), - orderposition=(form.pos if isinstance(form.pos, OrderPosition) else None), + cartposition=cartposition, + orderposition=orderposition, question=field.question, )