diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 6906b0d59f..0c762a2e55 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -657,7 +657,9 @@ class OrderCreateSerializer(I18nAwareModelSerializer): delete_cps = [] quota_avail_cache = {} if consume_carts: - for cp in CartPosition.objects.filter(event=self.context['event'], cart_id__in=consume_carts): + for cp in CartPosition.objects.filter( + event=self.context['event'], cart_id__in=consume_carts, expires__gt=now() + ): quotas = (cp.variation.quotas.filter(subevent=cp.subevent) if cp.variation else cp.item.quotas.filter(subevent=cp.subevent)) for quota in quotas: diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index 313fc0e16d..e3d265a98a 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -2441,6 +2441,35 @@ def test_order_create_quota_consume_cart(token_client, organizer, event, item, q assert not CartPosition.objects.filter(pk=cr.pk).exists() +@pytest.mark.django_db +def test_order_create_quota_consume_cart_expired(token_client, organizer, event, item, quota, question): + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + + with scopes_disabled(): + cr = CartPosition.objects.create( + event=event, cart_id="uxLJBUMEcnxOLI2EuxLYN1hWJq9GKu4yWL9FEgs2m7M0vdFi@api", item=item, + price=23, + expires=now() - datetime.timedelta(hours=3) + ) + + quota.size = 0 + quota.save() + res['consume_carts'] = [cr.cart_id] + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 400 + assert resp.data == { + 'positions': [ + {'item': ['There is not enough quota available on quota "Budget Quota" to perform the operation.']}, + ] + } + + @pytest.mark.django_db def test_order_create_free(token_client, organizer, event, item, quota, question): res = copy.deepcopy(ORDER_CREATE_PAYLOAD)