From 764b9dda7efaaafab4d9a8b1ebfb1b6aa84b02df Mon Sep 17 00:00:00 2001 From: Ben Hagan Date: Wed, 1 Nov 2017 16:05:10 -0500 Subject: [PATCH] Fix #489 -- Handle Vouchers With Unavailable Items (#659) * Fix #489 -- Handle Vouchers With Unavailable Items * Add regression test --- src/pretix/base/services/cart.py | 2 ++ src/pretix/presale/views/cart.py | 2 ++ src/tests/presale/test_cart.py | 11 ++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 44e9593138..58b0405971 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -61,6 +61,8 @@ error_messages = { 'cart if you want to use it for a different product.'), 'voucher_expired': _('This voucher is expired.'), 'voucher_invalid_item': _('This voucher is not valid for this product.'), + 'voucher_item_not_available': _( + 'Your voucher is valid for a product that is currently not for sale.'), 'voucher_invalid_subevent': pgettext_lazy('subevent', 'This voucher is not valid for this event date.'), 'voucher_required': _('You need a valid voucher code to order this product.'), 'inactive_subevent': pgettext_lazy('subevent', 'The selected event date is not active.'), diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 8b1a82adae..9c8a159124 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -395,6 +395,8 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, TemplateView): err = error_messages['voucher_redeemed'] if self.voucher.valid_until is not None and self.voucher.valid_until < now(): err = error_messages['voucher_expired'] + if self.voucher.item is not None and self.voucher.item.is_available() is False: + err = error_messages['voucher_item_not_available'] redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index a5c3a32d08..1a9a174289 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -15,7 +15,7 @@ from pretix.base.models import ( from pretix.base.models.items import ( ItemAddOn, SubEventItem, SubEventItemVariation, ) -from pretix.base.services.cart import CartError, CartManager +from pretix.base.services.cart import CartError, CartManager, error_messages from pretix.testutils.sessions import get_cart_session_key @@ -967,6 +967,15 @@ class CartTest(CartTestMixin, TestCase): objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event)) self.assertEqual(len(objs), 0) + def test_voucher_item_not_available_error(self): + v = Voucher.objects.create(item=self.ticket, event=self.event) + self.ticket.available_until = now() - timedelta(days=2) + self.ticket.save() + response = self.client.get('/%s/%s/redeem' % (self.orga.slug, self.event.slug), + {'voucher': v.code}, + follow=True) + assert error_messages['voucher_item_not_available'] in response.rendered_content + def test_voucher_price(self): v = Voucher.objects.create(item=self.ticket, value=Decimal('12.00'), event=self.event, price_mode='set') self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {