From bc081d6ccb2c9699e5a04e6d58f2582fafd63223 Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Tue, 22 Sep 2026 17:15:53 +0200 Subject: [PATCH] Fix access to old fields --- src/pretix/base/models/items.py | 29 ++++++++++--------- src/pretix/base/models/orders.py | 8 ++--- .../pretixcontrol/items/question_delete.html | 2 +- src/pretix/control/views/item.py | 2 +- src/pretix/control/views/orders.py | 2 +- src/pretix/presale/views/__init__.py | 4 +-- 6 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 8aa258596d..b377ddd446 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -1682,10 +1682,11 @@ class Question(LoggedModel): choices=FieldType.choices, verbose_name=_("Question type") ) - #required = models.BooleanField( # TODO(questionnaires) : to be removed, -> QuestionnaireChild - # default=False, - # verbose_name=_("Required question") - #) + tbd_required = models.BooleanField( # TODO(questionnaires) : to be removed, -> QuestionnaireChild + default=False, + verbose_name=_("Required question"), + db_column="required", + ) #items = models.ManyToManyField( # TODO(questionnaires) : to be removed, -> Questionnaire # Item, # related_name='questions', @@ -1693,15 +1694,17 @@ class Question(LoggedModel): # blank=True, # help_text=_('This question will be asked to buyers of the selected products') #) - #position = models.PositiveIntegerField( # TODO(questionnaires) : to be removed, -> Questionnaire + QuestionnaireChild - # default=0, - # verbose_name=_("Position") - #) - #ask_during_checkin = models.BooleanField( # TODO(questionnaires) : to be removed - # verbose_name=_('Ask during check-in instead of in the ticket buying process'), - # help_text=_('Not supported by all check-in apps for all question types.'), - # default=False - #) + tbd_position = models.PositiveIntegerField( # TODO(questionnaires) : to be removed, -> Questionnaire + QuestionnaireChild + default=0, + verbose_name=_("Position"), + db_column="position", + ) + tbd_ask_during_checkin = models.BooleanField( # TODO(questionnaires) : to be removed + verbose_name=_('Ask during check-in instead of in the ticket buying process'), + help_text=_('Not supported by all check-in apps for all question types.'), + default=False, + db_column="ask_during_checkin", + ) show_during_checkin = models.BooleanField( verbose_name=_('Show answer during check-in'), help_text=_('Not supported by all check-in apps for all question types.'), diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 51127972cd..57232a0519 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -918,7 +918,7 @@ class Order(LockModel, LoggedModel): positions = list( self.positions.all().annotate( has_checkin=Exists(Checkin.objects.filter(position_id=OuterRef('pk'), list__consider_tickets_used=True)) - ).select_related('item').prefetch_related('item__questions') + ).select_related('item').prefetch_related('item__questionnaires') ) if not self.event.settings.allow_modifications_after_checkin: for cp in positions: @@ -929,7 +929,7 @@ class Order(LockModel, LoggedModel): return True ask_names = self.event.settings.get('attendee_names_asked', as_type=bool) for cp in positions: - if (cp.item.ask_attendee_data and ask_names) or cp.item.questions.all(): + if (cp.item.ask_attendee_data and ask_names) or cp.item.questionnaires.all(): # TODO(questionnaires) : filter to only QuestionnaireType.ORDER_POSITION_SALE return True return False # nothing there to modify @@ -2780,7 +2780,7 @@ class OrderPosition(AbstractPosition): positions = list( self.order.positions.all().annotate( has_checkin=Exists(Checkin.objects.filter(position_id=OuterRef('pk'), list__consider_tickets_used=True)) - ).select_related('item').prefetch_related('item__questions') + ).select_related('item').prefetch_related('item__questionnaires') ) if not self.event.settings.allow_modifications_after_checkin: for cp in positions: @@ -2790,7 +2790,7 @@ class OrderPosition(AbstractPosition): ask_names = self.event.settings.get('attendee_names_asked', as_type=bool) for cp in positions: if cp.pk == self.pk or cp.addon_to_id == self.pk: - if (cp.item.ask_attendee_data and ask_names) or cp.item.questions.all(): + if (cp.item.ask_attendee_data and ask_names) or cp.item.questionnaires.all(): # TODO(questionnaires) : filter to only QuestionnaireType.ORDER_POSITION_SALE return True return False # nothing there to modify diff --git a/src/pretix/control/templates/pretixcontrol/items/question_delete.html b/src/pretix/control/templates/pretixcontrol/items/question_delete.html index 2dfa98a021..c902e017f5 100644 --- a/src/pretix/control/templates/pretixcontrol/items/question_delete.html +++ b/src/pretix/control/templates/pretixcontrol/items/question_delete.html @@ -6,7 +6,7 @@

{% trans "Delete question" %}

{% csrf_token %} -

{% blocktrans %}Are you sure you want to delete the question {{ question }}?{% endblocktrans %}

+

{% blocktrans %}Are you sure you want to delete the data field {{ question }}?{% endblocktrans %}

{% if dependent|length > 0 %}

{% blocktrans %}All answers to the question given by the buyers of the following products will be lost.{% endblocktrans %} diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index b9aa8e3a6d..059c20a9ab 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -456,7 +456,7 @@ class QuestionDelete(EventPermissionRequiredMixin, CompatDeleteView): def get_context_data(self, *args, **kwargs) -> dict: context = super().get_context_data(*args, **kwargs) - context['dependent'] = list(self.get_object().items.all()) + # TODO(questionnaires) context['dependent'] = list(self.get_object().items.all()) context['edit_url'] = reverse('control:event.items.questions.edit', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 2ee1237eec..cb5438bf2c 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -600,7 +600,7 @@ class OrderDetail(OrderView): 'item', 'variation', 'addon_to', 'tax_rule', 'used_membership', 'used_membership__membership_type', 'discount', ).prefetch_related( - 'item__questions', 'issued_gift_cards', 'owned_gift_cards', 'linked_media', + 'item__questions', 'issued_gift_cards', 'owned_gift_cards', 'linked_media', # TODO(questionnaires) : item__questions gibts nicht mehr Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options').select_related('question')), Prefetch('all_checkins', queryset=Checkin.all.select_related('list', 'gate').order_by('datetime')), Prefetch('print_logs', queryset=PrintLog.objects.select_related('device').order_by('datetime')), diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 0a04e4039f..74b51a4976 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -136,7 +136,7 @@ class CartMixin: if queryset is not None: prefetch = [] if answers: - prefetch.append('item__questions') + prefetch.append('item__questionnaires') prefetch.append(Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options'))) cartpos = queryset.order_by( @@ -213,7 +213,7 @@ class CartMixin: # Never group if the position has add-ons pos.pk not in has_addons and # Never group if we have answers to show - (not answers or (not has_attendee_data and not bool(pos.item.questions.all()))) and # do not use .exists() to re-use prefetch cache + (not answers or (not has_attendee_data and not bool(pos.item.questionnaires.all()))) and # do not use .exists() to re-use prefetch cache # Never group when we have a final order and a gift card code (isinstance(pos, CartPosition) or not pos.item.issue_giftcard) )