diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 70ac0b892e..8ddc0b605f 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -280,13 +280,13 @@ class Seat(models.Model): def is_available(self, ignore_cart=None, ignore_orderpos=None, ignore_voucher_id=None, sales_channel='web', - ignore_distancing=False, distance_ignore_cart_id=None): + ignore_distancing=False, distance_ignore_cart_id=None, always_allow_blocked=False): from .orders import Order from .organizer import SalesChannel if isinstance(sales_channel, SalesChannel): sales_channel = sales_channel.identifier - if self.blocked and sales_channel not in self.event.settings.seating_allow_blocked_seats_for_channel: + if not always_allow_blocked and self.blocked and sales_channel not in self.event.settings.seating_allow_blocked_seats_for_channel: return False opqs = self.orderposition_set.filter( order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID], diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index b37e584736..863ca76cd2 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1670,13 +1670,14 @@ class OrderChangeManager: AddBlockOperation = namedtuple('AddBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked')) RemoveBlockOperation = namedtuple('RemoveBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked')) - def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True): + def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True, allow_blocked_seats=False): self.order = order self.user = user self.auth = auth self.event = order.event self.split_order = None self.reissue_invoice = reissue_invoice + self.allow_blocked_seats = allow_blocked_seats self._committed = False self._totaldiff_guesstimate = 0 self._quotadiff = Counter() @@ -2197,7 +2198,7 @@ class OrderChangeManager: for seat, diff in self._seatdiff.items(): if diff <= 0: continue - if not seat.is_available(sales_channel=self.order.sales_channel, ignore_distancing=True) or diff > 1: + if not seat.is_available(sales_channel=self.order.sales_channel, ignore_distancing=True, always_allow_blocked=self.allow_blocked_seats) or diff > 1: raise OrderError(self.error_messages['seat_unavailable'].format(seat=seat.name)) if self.event.has_subevents: diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 1cb9edf66f..5abcc88160 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -2146,7 +2146,8 @@ class OrderChange(OrderView): self.order, user=self.request.user, notify=notify, - reissue_invoice=self.other_form.cleaned_data['reissue_invoice'] if self.other_form.is_valid() else True + reissue_invoice=self.other_form.cleaned_data['reissue_invoice'] if self.other_form.is_valid() else True, + allow_blocked_seats=True, ) form_valid = (self._process_add_fees(ocm) and self._process_add_positions(ocm) and