diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 77d49e821e..be795e21cd 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -61,17 +61,17 @@ class MarkPaidForm(forms.Form): def __init__(self, *args, **kwargs): self.instance = kwargs.pop("instance") super().__init__(*args, **kwargs) - quota_fail = ( + quota_success = ( self.instance.status == Order.STATUS_PENDING or self.instance._is_still_available(now(), count_waitinglist=False) is True ) term_last = self.instance.payment_term_last - term_fail = ( + term_success = ( (not term_last or term_last >= now()) and (self.instance.status == Order.STATUS_PENDING or self.instance.event.settings.get( 'payment_term_accept_late')) ) - if quota_fail or term_fail: + if quota_success and term_success: del self.fields['force'] diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index b5a6694b81..9aa3007e5c 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -519,6 +519,43 @@ def test_order_mark_paid_overdue_quota_blocked_by_waiting_list(client, env): assert o.status == Order.STATUS_PAID +@pytest.mark.django_db +def test_order_mark_paid_blocked(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=0) + 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' + }, follow=True) + assert 'alert-danger' in response.rendered_content + o = Order.objects.get(id=env[2].id) + assert o.status == Order.STATUS_EXPIRED + + +@pytest.mark.django_db +def test_order_mark_paid_forced(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=0) + 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', + 'force': 'on' + }, follow=True) + assert 'alert-success' in response.rendered_content + 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')