From 7a8f90478ada57cbb697a7ba3e7fb97d65d6e715 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 20 Jan 2021 17:26:47 +0100 Subject: [PATCH] CartAdd with subevents: Useful redirect in error case --- .../templates/pretixpresale/event/index.html | 2 +- src/pretix/presale/views/cart.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index e29f343263..5dbca0addf 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -252,7 +252,7 @@ data-asynctask-headline="{% trans "We're now trying to reserve this for you!" %}" data-asynctask-text="{% blocktrans with time=event.settings.reservation_time %}Once the items are in your cart, you will have {{ time }} minutes to complete your purchase.{% endblocktrans %}" class="{% if event.seating_plan_id %}has-seating{% endif %}" - action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ cart_redirect|urlencode }}"> + action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ cart_redirect|urlencode }}&next_error={{ request.path|urlencode }}"> {% csrf_token %} {% if ev.seating_plan_id and event.settings.seating_choice %} diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 517ca3690a..f188a0df5e 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -71,6 +71,19 @@ class CartActionMixin: return self.get_next_url() def get_error_url(self): + if "next_error" in self.request.GET and is_safe_url(self.request.GET.get("next_error"), allowed_hosts=None): + u = self.request.GET.get('next_error') + if '?' in u: + u += '&require_cookie=true' + else: + u += '?require_cookie=true' + disclose_cart_id = ( + 'iframe' in self.request.GET or settings.SESSION_COOKIE_NAME not in self.request.COOKIES + ) and self.kwargs.get('cart_namespace') + if disclose_cart_id: + cart_id = get_or_create_cart_id(self.request) + u += '&cart_id={}'.format(cart_id) + return u return self.get_next_url() @cached_property @@ -413,6 +426,8 @@ class CartAdd(EventViewMixin, CartActionMixin, AsyncAction, View): u = super().get_check_url(task_id, ajax) if "next" in self.request.GET: u += "&next=" + quote(self.request.GET.get('next')) + if "next_error" in self.request.GET: + u += "&next_error=" + quote(self.request.GET.get('next_error')) if ajax: cart_id = get_or_create_cart_id(self.request) u += '&take_cart_id=' + cart_id