From 346f4810939e8af51801b80c68c73c79ba1db29f Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Tue, 11 Aug 2026 16:25:11 +0200 Subject: [PATCH] Use models.TextChoices --- src/pretix/api/serializers/item.py | 2 +- src/pretix/api/views/item.py | 2 +- src/pretix/base/forms/questions.py | 2 +- src/pretix/base/models/items.py | 13 +++++-------- src/pretix/base/views/mixins.py | 2 +- src/pretix/control/forms/item.py | 2 +- src/pretix/control/views/item.py | 20 +++++++++++--------- src/pretix/presale/views/__init__.py | 2 +- 8 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index 3f1bc55d50..b34858c49b 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -619,7 +619,7 @@ class QuestionSerializer(I18nAwareModelSerializer): options_data = validated_data.pop('options') if 'options' in validated_data else [] items = validated_data.pop('items', []) - question = Question.objects.create(**validated_data, container_type=Question.CONTAINER_TYPE_ORDERPOSITION) + question = Question.objects.create(**validated_data, container_type=Question.ContainerType.ORDERPOSITION) question.items.set(items) for opt_data in options_data: QuestionOption.objects.create(question=question, **opt_data) diff --git a/src/pretix/api/views/item.py b/src/pretix/api/views/item.py index 975478e200..7f6b15bf82 100644 --- a/src/pretix/api/views/item.py +++ b/src/pretix/api/views/item.py @@ -475,7 +475,7 @@ class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet): write_permission = 'event.items:write' def get_queryset(self): - return self.request.event.questions.filter(container_type=Question.CONTAINER_TYPE_ORDERPOSITION).prefetch_related('options').all() + return self.request.event.questions.filter(container_type=Question.ContainerType.ORDERPOSITION).prefetch_related('options').all() @transaction.atomic() def perform_create(self, serializer): diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index d08ca38d35..f25569d713 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -967,7 +967,7 @@ class OrderLevelQuestionsForm(BaseQuestionsForm): super().__init__(*args, **kwargs) questions = Question.objects.filter( - event=event, container_type=Question.CONTAINER_TYPE_ORDER, + event=event, container_type=Question.ContainerType.ORDER, ask_during_checkin=False, hidden=False, ).order_by('position') answerlist = container.answers.prefetch_related('options') diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index b2fe949455..d6fa624180 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -1606,12 +1606,9 @@ class Question(LoggedModel): :param dependency_values: The values that `dependency_question` needs to be set to for this question to be applicable. :type dependency_values: list[str] """ - CONTAINER_TYPE_ORDER = "O" - CONTAINER_TYPE_ORDERPOSITION = "P" - CONTAINER_TYPE_CHOICES = ( - (CONTAINER_TYPE_ORDER, _("Order")), - (CONTAINER_TYPE_ORDERPOSITION, _("Order position")), - ) + class ContainerType(models.TextChoices): + ORDER = "O", _("Order") + ORDERPOSITION = "P", _("Order position") TYPE_NUMBER = "N" TYPE_STRING = "S" TYPE_TEXT = "T" @@ -1649,9 +1646,9 @@ class Question(LoggedModel): ) container_type = models.CharField( max_length=5, - choices=CONTAINER_TYPE_CHOICES, + choices=ContainerType.choices, verbose_name=_("Asked on"), - default=CONTAINER_TYPE_ORDERPOSITION, + default=ContainerType.ORDERPOSITION, ) question = I18nTextField( verbose_name=_("Question") diff --git a/src/pretix/base/views/mixins.py b/src/pretix/base/views/mixins.py index a002750255..5794f34c41 100644 --- a/src/pretix/base/views/mixins.py +++ b/src/pretix/base/views/mixins.py @@ -347,7 +347,7 @@ class OrderQuestionsViewMixin(BaseQuestionsViewMixin): def positions(self): qqs = self.request.event.questions.all() if self.only_user_visible: - qqs = qqs.filter(ask_during_checkin=False, hidden=False, container_type=Question.CONTAINER_TYPE_ORDERPOSITION) + qqs = qqs.filter(ask_during_checkin=False, hidden=False, container_type=Question.ContainerType.ORDERPOSITION) return list(self.order.positions.select_related( 'item', 'variation' ).prefetch_related( diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 8b905aac91..6ba5ce091e 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -153,7 +153,7 @@ class QuestionForm(I18nModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - if self.instance.container_type == Question.CONTAINER_TYPE_ORDERPOSITION: + if self.instance.container_type == Question.ContainerType.ORDERPOSITION: self.fields['items'].queryset = self.instance.event.items.all() self.fields['items'].required = True else: diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 8a0cea48e9..90d6bb44d2 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -450,7 +450,7 @@ class QuestionList(ListView): question=_('Attendee name'), position=sys_order.get('attendee_name_parts', 0), required=self.request.event.settings.attendee_names_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) if self.request.event.settings.attendee_emails_asked: @@ -459,7 +459,7 @@ class QuestionList(ListView): question=_('Attendee email'), position=sys_order.get('attendee_email', 0), required=self.request.event.settings.attendee_emails_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) if self.request.event.settings.attendee_company_asked: @@ -468,7 +468,7 @@ class QuestionList(ListView): question=_('Company'), position=sys_order.get('company', 0), required=self.request.event.settings.attendee_company_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) if self.request.event.settings.attendee_addresses_asked: @@ -477,28 +477,28 @@ class QuestionList(ListView): question=_('Street'), position=sys_order.get('street', 0), required=self.request.event.settings.attendee_addresses_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) questions.append(FakeQuestion( id='zipcode', question=_('ZIP code'), position=sys_order.get('zipcode', 0), required=self.request.event.settings.attendee_addresses_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) questions.append(FakeQuestion( id='city', question=_('City'), position=sys_order.get('city', 0), required=self.request.event.settings.attendee_addresses_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) questions.append(FakeQuestion( id='country', question=_('Country'), position=sys_order.get('country', 0), required=self.request.event.settings.attendee_addresses_required, - container_type=Question.CONTAINER_TYPE_ORDERPOSITION, + container_type=Question.ContainerType.ORDERPOSITION, )) questions += list(ctx['questions']) @@ -539,7 +539,7 @@ def reorder_questions(request, organizer, event): } ) - if request.GET['container_type'] == Question.CONTAINER_TYPE_ORDERPOSITION: + if request.GET['container_type'] == Question.ContainerType.ORDERPOSITION: system_question_order = {} for s in ('attendee_name_parts', 'attendee_email', 'company', 'street', 'zipcode', 'city', 'country'): if s in ids: @@ -789,7 +789,9 @@ class QuestionCreate(EventPermissionRequiredMixin, QuestionMixin, CreateView): def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['instance'] = Question(event=self.request.event) - kwargs['instance'].container_type = self.request.GET.get('container_type', Question.CONTAINER_TYPE_ORDERPOSITION) + kwargs['instance'].container_type = self.request.GET.get('container_type', Question.ContainerType.ORDERPOSITION) + if kwargs['instance'].container_type not in Question.ContainerType.values: + raise PermissionDenied return kwargs def get_success_url(self) -> str: diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index a6a85d812b..0b2c355df3 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -408,7 +408,7 @@ def get_cart(request): request._cart_cache = CartPosition.objects.none() else: qqs = request.event.questions.all() - qqs = qqs.filter(ask_during_checkin=False, hidden=False, container_type=Question.CONTAINER_TYPE_ORDERPOSITION) + qqs = qqs.filter(ask_during_checkin=False, hidden=False, container_type=Question.ContainerType.ORDERPOSITION) request._cart_cache = CartPosition.objects.filter( cart_id=cart_id, event=request.event ).annotate(