From cbcd413b359866f834a229e8ebd8e67f9d1f49bf Mon Sep 17 00:00:00 2001 From: Lukas Bockstaller Date: Thu, 5 Feb 2026 14:22:40 +0100 Subject: [PATCH] add event to api response --- doc/api/resources/orders.rst | 5 ++++- src/pretix/api/serializers/order.py | 8 ++++++++ src/pretix/api/views/order.py | 16 ++++++++++------ src/tests/api/test_orders.py | 24 +++++++++++++++++++++--- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 5a53dd5c4f..7b10e160e1 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -1750,8 +1750,11 @@ List of all order positions "results": [ { "id:": 23442 - "code": "ABC12", "event": "sampleconf", + "order": "ABC12", + "positionid": 1, + "canceled": false, + "item": 1345, ... } ] diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 4fb4dce059..cbed601322 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -636,6 +636,14 @@ class OrderPositionSerializer(I18nAwareModelSerializer): return entry +class OrganizerOrderPositionSerializer(OrderPositionSerializer): + event = SlugRelatedField(slug_field='slug', read_only=True) + + class Meta(OrderPositionSerializer.Meta): + fields = OrderPositionSerializer.Meta.fields + ('event',) + read_only_fields = OrderPositionSerializer.Meta.read_only_fields + ('event',) + + class RequireAttentionField(serializers.Field): def to_representation(self, instance: OrderPosition): return instance.require_checkin_attention diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index c82815f91c..9b9d2c08af 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -57,9 +57,10 @@ from pretix.api.serializers.order import ( BlockedTicketSecretSerializer, InvoiceSerializer, OrderCreateSerializer, OrderPaymentCreateSerializer, OrderPaymentSerializer, OrderPositionSerializer, OrderRefundCreateSerializer, - OrderRefundSerializer, OrderSerializer, OrganizerTransactionSerializer, - PriceCalcSerializer, PrintLogSerializer, RevokedTicketSecretSerializer, - SimulatedOrderSerializer, TransactionSerializer, + OrderRefundSerializer, OrderSerializer, OrganizerOrderPositionSerializer, + OrganizerTransactionSerializer, PriceCalcSerializer, PrintLogSerializer, + RevokedTicketSecretSerializer, SimulatedOrderSerializer, + TransactionSerializer, ) from pretix.api.serializers.orderchange import ( BlockNameSerializer, OrderChangeOperationSerializer, @@ -1066,7 +1067,6 @@ with scopes_disabled(): class OrderPositionViewSetMixin: - serializer_class = OrderPositionSerializer queryset = OrderPosition.all.none() filter_backends = (DjangoFilterBackend, RichOrderingFilter) ordering = ('order__datetime', 'positionid') @@ -1097,7 +1097,7 @@ class OrderPositionViewSetMixin: else: qs = OrderPosition.objects qs = qs.filter(order__event__organizer=self.request.organizer) - if self.request.query_params.get('pdf_data', 'false').lower() == 'true' and getattr(request, 'event', None): + if self.request.query_params.get('pdf_data', 'false').lower() == 'true' and getattr(self.request, 'event', None): prefetch_related_objects([self.request.organizer], 'meta_properties') prefetch_related_objects( [self.request.event], @@ -1168,12 +1168,14 @@ class OrderPositionViewSetMixin: class OrganizerOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ReadOnlyModelViewSet): + serializer_class = OrganizerOrderPositionSerializer + def get_queryset(self): qs = super().get_queryset() perm = self.permission if self.request.method in SAFE_METHODS else self.write_permission - if isinstance(self.request.auth, (TeamAPIToken, Device)) or self.request.user.is_authenticated:: + if isinstance(self.request.auth, (TeamAPIToken, Device)) or self.request.user.is_authenticated: qs = qs.filter( order__event__in=self.request.auth.get_events_with_permission(perm, request=self.request) ) @@ -1182,6 +1184,8 @@ class OrganizerOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ReadOnly class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet): + serializer_class = OrderPositionSerializer + def get_serializer_context(self): ctx = super().get_serializer_context() ctx['event'] = self.request.event diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index a9253a551c..4ef40e8490 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -1057,11 +1057,27 @@ def test_orderposition_list_limited_read( @pytest.mark.parametrize( - "endpoint_template", - [('/api/v1/organizers/{}/events/{}/orderpositions/'), ('/api/v1/organizers/{}/orderpositions/')] + ("endpoint_template", "endpoint_type"), + [ + ('/api/v1/organizers/{}/events/{}/orderpositions/', "event"), + ('/api/v1/organizers/{}/orderpositions/', "organizer") + ], ) @pytest.mark.django_db -def test_orderposition_list(endpoint_template, token_client, organizer, device, event, order, item, subevent, subevent2, question, django_assert_num_queries): +def test_orderposition_list( + endpoint_template, + endpoint_type, + token_client, + organizer, + device, + event, + order, + item, + subevent, + subevent2, + question, + django_assert_num_queries +): endpoint = endpoint_template.format(organizer.slug, event.slug) i2 = copy.copy(item) @@ -1080,6 +1096,8 @@ def test_orderposition_list(endpoint_template, token_client, organizer, device, res["answers"][0]["question"] = question.pk res["print_logs"][0]["id"] = op.print_logs.first().pk res["print_logs"][0]["device_id"] = device.device_id + if endpoint_type == "organizer": + res["event"] = event.slug resp = token_client.get(endpoint) assert resp.status_code == 200