diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index e2e529cafb..d581f74c5e 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -35,6 +35,7 @@ import json import mimetypes import os +import urllib from decimal import Decimal from urllib.parse import quote @@ -90,16 +91,22 @@ class CartActionMixin: if 'cart_namespace' in self.kwargs: kwargs['cart_namespace'] = self.kwargs['cart_namespace'] u = eventreverse(self.request.event, 'presale:event.index', kwargs=kwargs) - if '?' in u: - u += '&require_cookie=true' - else: - u += '?require_cookie=true' + + query = {'require_cookie': 'true'} + + if 'locale' in self.request.GET: + query['locale'] = self.request.GET['locale'] 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) + query['cart_id'] = cart_id + + if '?' in u: + u += '&' + urllib.parse.urlencode(query) + else: + u += '?' + urllib.parse.urlencode(query) return u def get_success_url(self, value=None): @@ -489,6 +496,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 "locale" in self.request.GET and "locale=" not in u: + u += "&locale=" + quote(self.request.GET.get('locale')) if "next_error" in self.request.GET: u += "&next_error=" + quote(self.request.GET.get('next_error')) if ajax: diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index a250a27aad..a1d90822f4 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -35,6 +35,7 @@ import calendar import hashlib import sys +import urllib.parse from collections import defaultdict from datetime import date, datetime, timedelta from decimal import Decimal @@ -423,9 +424,11 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView): elif request.GET.get('iframe', '') == '1' and 'take_cart_id' in request.GET: # Widget just opened, a cart already exists. Let's to a stupid redirect to check if cookies are disabled get_or_create_cart_id(request) - return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs) + '?require_cookie=true&cart_id={}'.format( - request.GET.get('take_cart_id') - )) + return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs) + '?' + urllib.parse.urlencode({ + 'require_cookie': 'true', + 'cart_id': request.GET.get('take_cart_id'), + **({"locale": request.GET.get('locale')} if request.GET.get('locale') else {}), + })) elif request.GET.get('iframe', '') == '1' and len(self.request.GET.get('widget_data', '{}')) > 3: # We've been passed data from a widget, we need to create a cart session to store it. get_or_create_cart_id(request) @@ -434,10 +437,11 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView): r = render(request, 'pretixpresale/event/cookies.html', { 'url': eventreverse( request.event, "presale:event.index", kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''} - ) + ( - "?src=widget&take_cart_id={}".format(request.GET.get('cart_id')) - if "cart_id" in request.GET else "" - ) + ) + "?" + urllib.parse.urlencode({ + "src": "widget", + **({"locale": request.GET.get('locale')} if request.GET.get('locale') else {}), + **({"take_cart_id": request.GET.get('cart_id')} if request.GET.get('cart_id') else {}), + }) }) r._csp_ignore = True return r diff --git a/src/pretix/presale/views/waiting.py b/src/pretix/presale/views/waiting.py index 4644a7d37b..c39e56eede 100644 --- a/src/pretix/presale/views/waiting.py +++ b/src/pretix/presale/views/waiting.py @@ -80,7 +80,7 @@ class WaitingView(EventViewMixin, FormView): r = render(request, 'pretixpresale/event/cookies.html', { 'url': eventreverse( request.event, "presale:event.waitinglist", kwargs={'cart_namespace': kwargs.get('cart_namespace')} - ) + '?' + url_replace(request, 'require_cookie', '', 'iframe', '') + ) + '?' + url_replace(request, 'require_cookie', '', 'iframe', '', 'locale', request.GET.get('locale', get_language_without_region())) }) r._csp_ignore = True return r