Widget: Keep language in no-cookie-flow

This commit is contained in:
Raphael Michel
2023-02-17 09:58:47 +01:00
parent 72aaf24a40
commit 50f9cfd402
3 changed files with 26 additions and 13 deletions

View File

@@ -35,6 +35,7 @@
import json import json
import mimetypes import mimetypes
import os import os
import urllib
from decimal import Decimal from decimal import Decimal
from urllib.parse import quote from urllib.parse import quote
@@ -90,16 +91,22 @@ class CartActionMixin:
if 'cart_namespace' in self.kwargs: if 'cart_namespace' in self.kwargs:
kwargs['cart_namespace'] = self.kwargs['cart_namespace'] kwargs['cart_namespace'] = self.kwargs['cart_namespace']
u = eventreverse(self.request.event, 'presale:event.index', kwargs=kwargs) u = eventreverse(self.request.event, 'presale:event.index', kwargs=kwargs)
if '?' in u:
u += '&require_cookie=true' query = {'require_cookie': 'true'}
else:
u += '?require_cookie=true' if 'locale' in self.request.GET:
query['locale'] = self.request.GET['locale']
disclose_cart_id = ( disclose_cart_id = (
'iframe' in self.request.GET or settings.SESSION_COOKIE_NAME not in self.request.COOKIES 'iframe' in self.request.GET or settings.SESSION_COOKIE_NAME not in self.request.COOKIES
) and self.kwargs.get('cart_namespace') ) and self.kwargs.get('cart_namespace')
if disclose_cart_id: if disclose_cart_id:
cart_id = get_or_create_cart_id(self.request) 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 return u
def get_success_url(self, value=None): 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) u = super().get_check_url(task_id, ajax)
if "next" in self.request.GET: if "next" in self.request.GET:
u += "&next=" + quote(self.request.GET.get('next')) 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: if "next_error" in self.request.GET:
u += "&next_error=" + quote(self.request.GET.get('next_error')) u += "&next_error=" + quote(self.request.GET.get('next_error'))
if ajax: if ajax:

View File

@@ -35,6 +35,7 @@
import calendar import calendar
import hashlib import hashlib
import sys import sys
import urllib.parse
from collections import defaultdict from collections import defaultdict
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from decimal import Decimal 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: 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 # 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) get_or_create_cart_id(request)
return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs) + '?require_cookie=true&cart_id={}'.format( return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs) + '?' + urllib.parse.urlencode({
request.GET.get('take_cart_id') '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: 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. # We've been passed data from a widget, we need to create a cart session to store it.
get_or_create_cart_id(request) get_or_create_cart_id(request)
@@ -434,10 +437,11 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
r = render(request, 'pretixpresale/event/cookies.html', { r = render(request, 'pretixpresale/event/cookies.html', {
'url': eventreverse( 'url': eventreverse(
request.event, "presale:event.index", kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''} request.event, "presale:event.index", kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''}
) + ( ) + "?" + urllib.parse.urlencode({
"?src=widget&take_cart_id={}".format(request.GET.get('cart_id')) "src": "widget",
if "cart_id" in request.GET else "" **({"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 r._csp_ignore = True
return r return r

View File

@@ -80,7 +80,7 @@ class WaitingView(EventViewMixin, FormView):
r = render(request, 'pretixpresale/event/cookies.html', { r = render(request, 'pretixpresale/event/cookies.html', {
'url': eventreverse( 'url': eventreverse(
request.event, "presale:event.waitinglist", kwargs={'cart_namespace': kwargs.get('cart_namespace')} 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 r._csp_ignore = True
return r return r