From c3635162ec2f86fd0a6e55cbc8029d703879f84f Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Mon, 22 Jul 2024 14:54:20 +0200 Subject: [PATCH] return ids of occupying objects instead of boolean flags --- src/pretix/api/serializers/event.py | 10 +++++----- src/pretix/api/views/event.py | 4 ++-- src/pretix/base/models/seating.py | 29 ++++++++++++++++++----------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index 38965fefd8..41199b6075 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -972,19 +972,19 @@ class ItemMetaPropertiesSerializer(I18nAwareModelSerializer): class SeatSerializer(I18nAwareModelSerializer): - has_order = serializers.BooleanField() - has_cart = serializers.BooleanField() - has_voucher = serializers.BooleanField() + order = serializers.CharField() + cart = serializers.IntegerField() + voucher = serializers.IntegerField() class Meta: model = Seat read_only_fields = ( 'id', 'subevent', 'zone_name', 'row_name', 'row_label', 'seat_number', 'seat_label', 'seat_guid', 'product', 'sorting_rank', 'x', 'y', - 'has_order', 'has_cart', 'has_voucher', + 'order', 'cart', 'voucher', ) fields = ( 'id', 'subevent', 'zone_name', 'row_name', 'row_label', 'seat_number', 'seat_label', 'seat_guid', 'product', 'blocked', 'sorting_rank', 'x', 'y', - 'has_order', 'has_cart', 'has_voucher', + 'order', 'cart', 'voucher', ) diff --git a/src/pretix/api/views/event.py b/src/pretix/api/views/event.py index f6d6668e24..5034deefcd 100644 --- a/src/pretix/api/views/event.py +++ b/src/pretix/api/views/event.py @@ -683,9 +683,9 @@ class SeatViewSet(ConditionalListView, viewsets.ModelViewSet): subevent = self.request.event.subevents.get(pk=self.request.resolver_match.kwargs['subevent']) except SubEvent.DoesNotExist: raise NotFound('Subevent not found') - return Seat.annotated(event_id=self.request.event.id, subevent=subevent, qs=subevent.seats.all()) + return Seat.annotated(event_id=self.request.event.id, subevent=subevent, qs=subevent.seats.all(), annotate_ids=True) elif not self.request.event.has_subevents and 'subevent' not in self.request.resolver_match.kwargs: - return Seat.annotated(event_id=self.request.event.id, subevent=None, qs=self.request.event.seats.all()) + return Seat.annotated(event_id=self.request.event.id, subevent=None, qs=self.request.event.seats.all(), annotate_ids=True) else: raise NotFound diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index c55d635508..ee5970ea2c 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -185,7 +185,7 @@ class Seat(models.Model): @classmethod def annotated(cls, qs, event_id, subevent, ignore_voucher_id=None, minimal_distance=0, - ignore_order_id=None, ignore_cart_id=None, distance_only_within_row=False): + ignore_order_id=None, ignore_cart_id=None, distance_only_within_row=False, annotate_ids=False): from . import CartPosition, Order, OrderPosition, Voucher vqs = Voucher.objects.filter( @@ -214,17 +214,24 @@ class Seat(models.Model): ) if ignore_cart_id: cqs = cqs.exclude(cart_id=ignore_cart_id) - qs_annotated = qs.annotate( - has_order=Exists( - opqs - ), - has_cart=Exists( - cqs - ), - has_voucher=Exists( - vqs + if annotate_ids: + qs_annotated = qs.annotate( + order=Subquery(opqs.values('order__code')), + cart=Subquery(cqs.values('id')), + voucher=Subquery(vqs.values('id')), + ) + else: + qs_annotated = qs.annotate( + has_order=Exists( + opqs + ), + has_cart=Exists( + cqs + ), + has_voucher=Exists( + vqs + ) ) - ) if minimal_distance > 0: # TODO: Is there a more performant implementation on PostgreSQL using