return ids of occupying objects instead of boolean flags

This commit is contained in:
Mira Weller
2024-07-22 14:54:20 +02:00
parent 61dd6a3f90
commit c3635162ec
3 changed files with 25 additions and 18 deletions
+5 -5
View File
@@ -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',
)
+2 -2
View File
@@ -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
+18 -11
View File
@@ -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