diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 8307e1ca0..5f13ec248 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -124,8 +124,10 @@ class CartMixin: if order: fees = order.fees.all() - else: + elif positions: fees = get_fees(self.request.event, self.request, total, self.invoice_address, self.cart_session.get('payment')) + else: + fees = [] total += sum([f.value for f in fees]) net_total += sum([f.net_value for f in fees]) @@ -169,14 +171,18 @@ def get_cart(request): from pretix.presale.views.cart import get_or_create_cart_id if not hasattr(request, '_cart_cache'): - request._cart_cache = CartPosition.objects.filter( - cart_id=get_or_create_cart_id(request), event=request.event - ).order_by( - 'item', 'variation' - ).select_related( - 'item', 'variation', 'subevent', 'subevent__event', 'subevent__event__organizer', - 'item__tax_rule' - ) + cart_id = get_or_create_cart_id(request, create=False) + if not cart_id: + request._cart_cache = CartPosition.objects.none() + else: + request._cart_cache = CartPosition.objects.filter( + cart_id=cart_id, event=request.event + ).order_by( + 'item', 'variation' + ).select_related( + 'item', 'variation', 'subevent', 'subevent__event', 'subevent__event__organizer', + 'item__tax_rule' + ) return request._cart_cache diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 83b48f191..a41e4b914 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -184,7 +184,7 @@ def create_empty_cart_id(request, replace_current=True): return new_id -def get_or_create_cart_id(request): +def get_or_create_cart_id(request, create=True): """ This method returns the cart ID in use for this request or creates a new cart ID if required. @@ -232,6 +232,8 @@ def get_or_create_cart_id(request): This method migrates legacy sessions created before the upgrade to 1.8.0 on a best-effort basis, meaning that the migration does not respect plugin-specific data and works best if the user only used the session for one event at the time of migration. + + If ``create`` is ``False`` and no session currently exists, ``None`` will be returned. """ session_keyname = 'current_cart_event_{}'.format(request.event.pk) prefix = '' @@ -254,6 +256,8 @@ def get_or_create_cart_id(request): if prefix and 'take_cart_id' in request.GET and current_id: new_id = current_id else: + if not create: + return None new_id = generate_cart_id(prefix=prefix) # Migrate legacy data