diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index d9dd910fe0..46d1787dc1 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -333,7 +333,7 @@ class Order(LoggedModel): return self._is_still_available() - def _is_still_available(self, now_dt: datetime=None) -> Union[bool, str]: + def _is_still_available(self, now_dt: datetime=None, count_waitinglist=True) -> Union[bool, str]: error_messages = { 'unavailable': _('The ordered product "{item}" is no longer available.'), } @@ -351,7 +351,7 @@ class Order(LoggedModel): for quota in quotas: if quota.id not in quota_cache: quota_cache[quota.id] = quota - quota.cached_availability = quota.availability(now_dt)[1] + quota.cached_availability = quota.availability(now_dt, count_waitinglist=count_waitinglist)[1] else: # Use cached version quota = quota_cache[quota.id] diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index ffb9f1a750..e1021e28c6 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -469,7 +469,7 @@ class OrderExtend(OrderView): else: try: with self.order.event.lock() as now_dt: - is_available = self.order._is_still_available(now_dt) + is_available = self.order._is_still_available(now_dt, count_waitinglist=False) if is_available is True: self.form.save() self.order.status = Order.STATUS_PENDING diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 52bd89d58c..8430976224 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -360,6 +360,27 @@ def test_order_extend_overdue_quota_empty(client, env): assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" +@pytest.mark.django_db +def test_order_extend_overdue_quota_blocked_by_waiting_list(client, env): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=1) + q.items.add(env[3]) + env[0].waitinglistentries.create(item=env[3], email='foo@bar.com') + + newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") + client.login(email='dummy@dummy.dummy', password='dummy') + response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { + 'expires': newdate + }, follow=True) + assert 'alert-success' in response.rendered_content + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" + assert o.status == Order.STATUS_PENDING + + @pytest.mark.django_db def test_order_extend_expired_quota_left(client, env): o = Order.objects.get(id=env[2].id)