mirror of
https://github.com/pretix/pretix.git
synced 2026-08-08 10:27:49 +00:00
return ids of occupying objects instead of boolean flags
This commit is contained in:
@@ -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',
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user