From f4d38965ccdaaf441a6da6555a04fe2687300f50 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 29 May 2020 17:48:20 +0200 Subject: [PATCH] Allow to limit distance metric to rows --- src/pretix/base/models/event.py | 6 ++++-- src/pretix/base/models/seating.py | 6 +++++- src/pretix/base/settings.py | 4 ++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index a073030ec5..d696b2f086 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -395,7 +395,8 @@ class Event(EventMixin, LoggedModel): qs_annotated = Seat.annotated(self.seats, self.pk, None, ignore_voucher_id=ignore_voucher.pk if ignore_voucher else None, - minimal_distance=self.settings.seating_minimal_distance) + minimal_distance=self.settings.seating_minimal_distance, + distance_only_within_row=self.settings.seating_distance_within_row) qs = qs_annotated.filter(has_order=False, has_cart=False, has_voucher=False) if self.settings.seating_minimal_distance > 0: @@ -1044,7 +1045,8 @@ class SubEvent(EventMixin, LoggedModel): from .seating import Seat qs_annotated = Seat.annotated(self.seats, self.event_id, self, ignore_voucher_id=ignore_voucher.pk if ignore_voucher else None, - minimal_distance=self.settings.seating_minimal_distance) + minimal_distance=self.settings.seating_minimal_distance, + distance_only_within_row=self.settings.seating_distance_within_row) qs = qs_annotated.filter(has_order=False, has_cart=False, has_voucher=False) if self.settings.seating_minimal_distance > 0: qs = qs.filter(has_closeby_taken=False) diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 8ca9e5b7aa..351d67fdf4 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -162,7 +162,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): + ignore_order_id=None, ignore_cart_id=None, distance_only_within_row=False): from . import Order, OrderPosition, Voucher, CartPosition vqs = Voucher.objects.filter( @@ -215,6 +215,8 @@ class Seat(models.Model): Q(has_order=True) | Q(has_cart=True) | Q(has_voucher=True), distance__lt=minimal_distance ** 2 ) + if distance_only_within_row: + sq_closeby = sq_closeby.filter(row_name=OuterRef('row_name')) qs_annotated = qs_annotated.annotate(has_closeby_taken=Exists(sq_closeby)) return qs_annotated @@ -262,6 +264,8 @@ class Seat(models.Model): Q(has_order=True) | Q(has_cart=True) | Q(has_voucher=True), distance__lt=self.event.settings.seating_minimal_distance ** 2 ) + if self.event.settings.seating_distance_within_row: + qs_closeby_taken = qs_closeby_taken.filter(row_name=self.row_name) if qs_closeby_taken.exists(): return False diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 9faba96b81..b250cfeac1 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1656,6 +1656,10 @@ Your {event} team""")) 'default': [], 'type': list }, + 'seating_distance_within_row': { + 'default': 'False', + 'type': bool + } } PERSON_NAME_TITLE_GROUPS = OrderedDict([ ('english_common', (_('Most common English titles'), (