diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 81592b7dea..b2840e6b43 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -115,7 +115,8 @@ browser settings. {% endblocktrans %}
- + {% trans "Open ticket shop in new tab" %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/voucher.html b/src/pretix/presale/templates/pretixpresale/event/voucher.html index cb2bcdb986..8123c4c3d0 100644 --- a/src/pretix/presale/templates/pretixpresale/event/voucher.html +++ b/src/pretix/presale/templates/pretixpresale/event/voucher.html @@ -20,10 +20,11 @@

{% if event.presale_is_running or event.settings.show_items_outside_presale_period %}
+ action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={% eventurl request.event "presale:event.index" cart_namespace=cart_namespace %}{% if "iframe" in request.GET %}&iframe={{ request.GET.iframe }}{% endif %}"> {% csrf_token %} + {% for tup in items_by_category %}
{% if tup.0 %} diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index ccd92cd53c..b9c047f3d4 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -47,6 +47,9 @@ class CartActionMixin: u += '&require_cookie=true' else: u += '?require_cookie=true' + if 'iframe' in self.request.GET: + cart_id = get_or_create_cart_id(self.request) + u += '&cart_id={}'.format(cart_id) return u def get_success_url(self, value=None): diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index 1295dd8886..bf00778275 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -1,3 +1,5 @@ +from urllib.parse import quote + from django.contrib import messages from django.http import Http404 from django.shortcuts import redirect @@ -30,11 +32,11 @@ class CheckoutView(View): if not cart_exists(request) and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) - return redirect(self.get_index_url(self.request)) + return self.redirect(self.get_index_url(self.request)) if not request.event.presale_is_running: messages.error(request, _("The presale for this event is over or has not yet started.")) - return redirect(self.get_index_url(self.request)) + return self.redirect(self.get_index_url(self.request)) cart_error = None try: @@ -49,14 +51,13 @@ class CheckoutView(View): continue if step.requires_valid_cart and cart_error: messages.error(request, str(cart_error)) - return redirect(previous_step.get_step_url(request) if previous_step - else self.get_index_url(request)) + return self.redirect(previous_step.get_step_url(request) if previous_step else self.get_index_url(request)) if 'step' not in kwargs: - return redirect(step.get_step_url(request)) + return self.redirect(step.get_step_url(request)) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed(request, warn=not is_selected): - return redirect(step.get_step_url(request)) + return self.redirect(step.get_step_url(request)) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) @@ -68,3 +69,8 @@ class CheckoutView(View): step.c_is_before = True step.c_resolved_url = step.get_step_url(request) raise Http404() + + def redirect(self, url): + if 'cart_id' in self.request.GET: + url += ('&' if '?' in url else '?') + 'cart_id=' + quote(self.request.GET.get('cart_id')) + return redirect(url) diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 04dcb85c11..d5e73e85a7 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -10,6 +10,7 @@ from django.core.exceptions import PermissionDenied from django.db.models import Count, Prefetch, Q from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.timezone import now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ @@ -176,7 +177,12 @@ class EventIndex(EventViewMixin, CartMixin, TemplateView): template_name = "pretixpresale/event/index.html" def get(self, request, *args, **kwargs): + from pretix.presale.views.cart import get_or_create_cart_id + self.subevent = None + if request.GET.get('src', '') == 'widget' and 'take_cart_id' in request.GET: + get_or_create_cart_id(request) + return redirect(reverse('presale:event.index', kwargs=kwargs)) if request.event.has_subevents: if 'subevent' in kwargs: self.subevent = request.event.subevents.filter(pk=kwargs['subevent'], active=True).first() diff --git a/src/pretix/static/pretixpresale/js/widget/widget.js b/src/pretix/static/pretixpresale/js/widget/widget.js index 622819eb21..a69c253c13 100644 --- a/src/pretix/static/pretixpresale/js/widget/widget.js +++ b/src/pretix/static/pretixpresale/js/widget/widget.js @@ -696,7 +696,7 @@ var shared_root_computed = { if (!this.$root.cart_exists) { checkout_url += "checkout/start"; } - var form_target = this.event_url + 'w/' + widget_id + '/cart/add?iframe=1&next=' + checkout_url; + var form_target = this.event_url + 'w/' + widget_id + '/cart/add?iframe=1&next=' + encodeURIComponent(checkout_url); if (getCookie(this.cookieName)) { form_target += "&take_cart_id=" + getCookie(this.cookieName); }