diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index f476b0297b..98fc0d25e6 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -377,7 +377,7 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio products_seen = Counter() for i, cp in enumerate(positions): - if not cp.item.active or (cp.variation and not cp.variation.active): + if not cp.item.is_available() or (cp.variation and not cp.variation.active): err = err or error_messages['unavailable'] cp.delete() continue diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index eb42888721..d7e646bca8 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -1502,12 +1502,26 @@ class CheckoutTestCase(TestCase): self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) + def test_confirm_no_longer_available(self): + self.ticket.available_until = now() - timedelta(days=1) + self.ticket.save() + cr1 = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10) + ) + self._set_session('payment', 'banktransfer') + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.rendered_content, "lxml") + self.assertGreaterEqual(len(doc.select(".alert-danger")), 1) + self.assertFalse(CartPosition.objects.filter(id=cr1.id).exists()) + def test_confirm_inactive(self): self.ticket.active = False self.ticket.save() cr1 = CartPosition.objects.create( event=self.event, cart_id=self.session_key, item=self.ticket, - price=23, expires=now() - timedelta(minutes=10) + price=23, expires=now() + timedelta(minutes=10) ) self._set_session('payment', 'banktransfer')