diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 1e8f44d61..fd95b928d 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1087,7 +1087,7 @@ class Order(LockModel, LoggedModel): for i, op in enumerate(positions): if op.seat: - if not op.seat.is_available(ignore_orderpos=op): + if not op.seat.is_available(ignore_orderpos=op, sales_channel=self.sales_channel.identifier): raise Quota.QuotaExceededException(error_messages['seat_unavailable'].format(seat=op.seat)) if force: continue diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 7439525ee..b598e59a5 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -1133,6 +1133,49 @@ def test_order_mark_paid_expired_seat_taken(client, env): assert o.status == Order.STATUS_EXPIRED +@pytest.mark.django_db +def test_order_mark_paid_expired_blocked(client, env): + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.expires = now() - timedelta(days=5) + o.status = Order.STATUS_EXPIRED + o.sales_channel = env[0].organizer.sales_channels.get(identifier="bar") + olddate = o.expires + o.save() + seat_a1 = env[0].seats.create(seat_number="A1", product=env[3], seat_guid="A1", blocked=True) + p = o.positions.first() + p.seat = seat_a1 + p.save() + + q = Quota.objects.create(event=env[0], size=100) + q.items.add(env[3]) + client.login(email='dummy@dummy.dummy', password='dummy') + response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { + 'status': 'p', + 'payment_date': now().date().isoformat(), + 'amount': str(o.pending_sum), + 'force': 'on' + }, follow=True) + assert b'alert-danger' in response.content + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == olddate.strftime("%Y-%m-%d %H:%M:%S") + assert o.status == Order.STATUS_EXPIRED + + env[0].settings.seating_allow_blocked_seats_for_channel = ["bar"] + + response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { + 'status': 'p', + 'payment_date': now().date().isoformat(), + 'amount': str(o.pending_sum), + 'force': 'on' + }, follow=True) + assert b'alert-success' in response.content + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.status == Order.STATUS_PAID + + @pytest.mark.django_db def test_order_go_lowercase(client, env): client.login(email='dummy@dummy.dummy', password='dummy')