diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index 4fb46f2318..998b831a83 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -27,6 +27,8 @@ from pretix.presale.views.questions import QuestionsViewMixin class BaseCheckoutFlowStep: + requires_valid_cart = True + def __init__(self, event): self.event = event self.request = None @@ -135,6 +137,7 @@ class AddOnsStep(CartMixin, AsyncAction, TemplateFlowStep): template_name = "pretixpresale/event/checkout_addons.html" task = set_cart_addons known_errortypes = ['CartError'] + requires_valid_cart = False def is_applicable(self, request): return get_cart(request).filter(item__addons__isnull=False).exists() diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index 76c5623ea2..93abab4330 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -22,16 +22,22 @@ class CheckoutView(View): messages.error(request, _("Your cart is empty")) return redirect(eventreverse(self.request.event, 'presale:event.index')) + cart_error = None try: validate_cart.send(sender=self.request.event, positions=cart_pos) except CartError as e: - messages.error(request, str(e)) - return redirect(eventreverse(self.request.event, 'presale:event.index')) + cart_error = e flow = get_checkout_flow(self.request.event) + previous_step = None for step in flow: if not step.is_applicable(request): continue + if step.requires_valid_cart and cart_error: + messages.error(request, str(cart_error)) + return redirect(previous_step.get_step_url() if previous_step + else eventreverse(self.request.event, 'presale:event.index')) + if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) @@ -43,4 +49,6 @@ class CheckoutView(View): else: handler = self.http_method_not_allowed return handler(request) + else: + previous_step = step raise Http404()