add event to api response

This commit is contained in:
Lukas Bockstaller
2026-02-05 14:22:40 +01:00
parent 15abe0a63f
commit cbcd413b35
4 changed files with 43 additions and 10 deletions

View File

@@ -1750,8 +1750,11 @@ List of all order positions
"results": [ "results": [
{ {
"id:": 23442 "id:": 23442
"code": "ABC12",
"event": "sampleconf", "event": "sampleconf",
"order": "ABC12",
"positionid": 1,
"canceled": false,
"item": 1345,
... ...
} }
] ]

View File

@@ -636,6 +636,14 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
return entry 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): class RequireAttentionField(serializers.Field):
def to_representation(self, instance: OrderPosition): def to_representation(self, instance: OrderPosition):
return instance.require_checkin_attention return instance.require_checkin_attention

View File

@@ -57,9 +57,10 @@ from pretix.api.serializers.order import (
BlockedTicketSecretSerializer, InvoiceSerializer, OrderCreateSerializer, BlockedTicketSecretSerializer, InvoiceSerializer, OrderCreateSerializer,
OrderPaymentCreateSerializer, OrderPaymentSerializer, OrderPaymentCreateSerializer, OrderPaymentSerializer,
OrderPositionSerializer, OrderRefundCreateSerializer, OrderPositionSerializer, OrderRefundCreateSerializer,
OrderRefundSerializer, OrderSerializer, OrganizerTransactionSerializer, OrderRefundSerializer, OrderSerializer, OrganizerOrderPositionSerializer,
PriceCalcSerializer, PrintLogSerializer, RevokedTicketSecretSerializer, OrganizerTransactionSerializer, PriceCalcSerializer, PrintLogSerializer,
SimulatedOrderSerializer, TransactionSerializer, RevokedTicketSecretSerializer, SimulatedOrderSerializer,
TransactionSerializer,
) )
from pretix.api.serializers.orderchange import ( from pretix.api.serializers.orderchange import (
BlockNameSerializer, OrderChangeOperationSerializer, BlockNameSerializer, OrderChangeOperationSerializer,
@@ -1066,7 +1067,6 @@ with scopes_disabled():
class OrderPositionViewSetMixin: class OrderPositionViewSetMixin:
serializer_class = OrderPositionSerializer
queryset = OrderPosition.all.none() queryset = OrderPosition.all.none()
filter_backends = (DjangoFilterBackend, RichOrderingFilter) filter_backends = (DjangoFilterBackend, RichOrderingFilter)
ordering = ('order__datetime', 'positionid') ordering = ('order__datetime', 'positionid')
@@ -1097,7 +1097,7 @@ class OrderPositionViewSetMixin:
else: else:
qs = OrderPosition.objects qs = OrderPosition.objects
qs = qs.filter(order__event__organizer=self.request.organizer) 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.organizer], 'meta_properties')
prefetch_related_objects( prefetch_related_objects(
[self.request.event], [self.request.event],
@@ -1168,12 +1168,14 @@ class OrderPositionViewSetMixin:
class OrganizerOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ReadOnlyModelViewSet): class OrganizerOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = OrganizerOrderPositionSerializer
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset() qs = super().get_queryset()
perm = self.permission if self.request.method in SAFE_METHODS else self.write_permission 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( qs = qs.filter(
order__event__in=self.request.auth.get_events_with_permission(perm, request=self.request) 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): class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet):
serializer_class = OrderPositionSerializer
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
ctx['event'] = self.request.event ctx['event'] = self.request.event

View File

@@ -1057,11 +1057,27 @@ def test_orderposition_list_limited_read(
@pytest.mark.parametrize( @pytest.mark.parametrize(
"endpoint_template", ("endpoint_template", "endpoint_type"),
[('/api/v1/organizers/{}/events/{}/orderpositions/'), ('/api/v1/organizers/{}/orderpositions/')] [
('/api/v1/organizers/{}/events/{}/orderpositions/', "event"),
('/api/v1/organizers/{}/orderpositions/', "organizer")
],
) )
@pytest.mark.django_db @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) endpoint = endpoint_template.format(organizer.slug, event.slug)
i2 = copy.copy(item) 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["answers"][0]["question"] = question.pk
res["print_logs"][0]["id"] = op.print_logs.first().pk res["print_logs"][0]["id"] = op.print_logs.first().pk
res["print_logs"][0]["device_id"] = device.device_id res["print_logs"][0]["device_id"] = device.device_id
if endpoint_type == "organizer":
res["event"] = event.slug
resp = token_client.get(endpoint) resp = token_client.get(endpoint)
assert resp.status_code == 200 assert resp.status_code == 200