def post(self, request, *args, **kwargs): self.request = request is_valid = True data = [] for f in self.forms: for c in f['categories']: is_valid = is_valid and c['form'].is_valid() if c['form'].is_valid(): for k, v in c['form'].cleaned_data.items(): itemid = int(k[5:]) if v is True: data.append({ 'addon_to': f['cartpos'].pk, 'item': itemid, 'variation': None }) elif v: data.append({ 'addon_to': f['cartpos'].pk, 'item': itemid, 'variation': int(v) }) if not is_valid: return self.get(request, *args, **kwargs) return self.do(self.request.event.id, data, get_or_create_cart_id(self.request), invoice_address=self.invoice_address.pk, locale=get_language(), sales_channel=request.sales_channel)
def cart_exists(request): from pretix.presale.views.cart import get_or_create_cart_id if not hasattr(request, '_cart_cache'): return CartPosition.objects.filter( cart_id=get_or_create_cart_id(request), event=request.event ).exists() return bool(request._cart_cache)
def get_cart_total(request): from pretix.presale.views.cart import get_or_create_cart_id if not hasattr(request, '_cart_total_cache'): if hasattr(request, '_cart_cache'): request._cart_total_cache = sum(i.price for i in request._cart_cache) else: request._cart_total_cache = CartPosition.objects.filter( cart_id=get_or_create_cart_id(request), event=request.event ).aggregate(sum=Sum('price'))['sum'] or 0 return request._cart_total_cache
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool: """ You can use this method to disable this payment provider for certain groups of users, products or other criteria. If this method returns ``False``, the user will not be able to select this payment method. This will only be called during checkout, not on retrying. The default implementation checks for the _availability_date setting to be either unset or in the future and for the _total_max and _total_min requirements to be met. It also checks the ``_restrict_countries`` setting. :param total: The total value without the payment method fee, after taxes. .. versionchanged:: 1.17.0 The ``total`` parameter has been added. For backwards compatibility, this method is called again without this parameter if it raises a ``TypeError`` on first try. """ timing = self._is_still_available(cart_id=get_or_create_cart_id(request)) pricing = True if (self.settings._total_max is not None or self.settings._total_min is not None) and total is None: raise ImproperlyConfigured('This payment provider does not support maximum or minimum amounts.') if self.settings._total_max is not None: pricing = pricing and total <= Decimal(self.settings._total_max) if self.settings._total_min is not None: pricing = pricing and total >= Decimal(self.settings._total_min) def get_invoice_address(): if not hasattr(request, '_checkout_flow_invoice_address'): cs = cart_session(request) iapk = cs.get('invoice_address') if not iapk: request._checkout_flow_invoice_address = InvoiceAddress() else: try: request._checkout_flow_invoice_address = InvoiceAddress.objects.get(pk=iapk, order__isnull=True) except InvoiceAddress.DoesNotExist: request._checkout_flow_invoice_address = InvoiceAddress() return request._checkout_flow_invoice_address if self.event.settings.invoice_address_required: restricted_countries = self.settings.get('_restricted_countries', as_type=list) if restricted_countries: ia = get_invoice_address() if str(ia.country) not in restricted_countries: return False return timing and pricing
def get_cart(request): from pretix.presale.views.cart import get_or_create_cart_id if not hasattr(request, '_cart_cache'): 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' ) for cp in request._cart_cache: cp.event = request.event # Populate field with known value to save queries return request._cart_cache
def post(self, request): self.request = request failed = not self.save() or not self.contact_form.is_valid() if request.event.settings.invoice_address_asked or self.request.event.settings.invoice_name_required: failed = failed or not self.invoice_form.is_valid() if failed: messages.error(request, _("We had difficulties processing your input. Please review the errors below.")) return self.render() self.cart_session['email'] = self.contact_form.cleaned_data['email'] self.cart_session['contact_form_data'] = self.contact_form.cleaned_data if request.event.settings.invoice_address_asked or self.request.event.settings.invoice_name_required: addr = self.invoice_form.save() self.cart_session['invoice_address'] = addr.pk update_tax_rates( event=request.event, cart_id=get_or_create_cart_id(request), invoice_address=self.invoice_form.instance ) return redirect(self.get_next_url(request))
def post(self, request): self.request = request failed = not self.save() or not self.contact_form.is_valid() if request.event.settings.invoice_address_asked: failed = failed or not self.invoice_form.is_valid() if failed: messages.error( request, _("We had difficulties processing your input. Please review the errors below." )) return self.render() self.cart_session['email'] = self.contact_form.cleaned_data['email'] if request.event.settings.invoice_address_asked: addr = self.invoice_form.save() self.cart_session['invoice_address'] = addr.pk self.cart_session[ 'contact_form_data'] = self.contact_form.cleaned_data update_tax_rates(event=request.event, cart_id=get_or_create_cart_id(request), invoice_address=self.invoice_form.instance) return redirect(self.get_next_url(request))
def post(self, request, *args, **kwargs): self.request = request data = [] for f in self.forms: for c in f['categories']: try: selected = self._clean_category(f, c) except ValidationError as e: messages.error(request, e.message % e.params if e.params else e.message) return self.get(request, *args, **kwargs) for (i, v), (c, price) in selected.items(): data.append({ 'addon_to': f['cartpos'].pk, 'item': i.pk, 'variation': v.pk if v else None, 'count': c, 'price': price, }) return self.do(self.request.event.id, data, get_or_create_cart_id(self.request), invoice_address=self.invoice_address.pk, locale=get_language(), sales_channel=request.sales_channel.identifier)
def post(self, request): self.request = request failed = not self.save() or not self.contact_form.is_valid() if self.address_asked or self.request.event.settings.invoice_name_required: failed = failed or not self.invoice_form.is_valid() if failed: messages.error( request, _("We had difficulties processing your input. Please review the errors below." )) return self.render() self.cart_session['email'] = self.contact_form.cleaned_data['email'] self.cart_session['contact_form_data'] = self.contact_form.cleaned_data if self.address_asked or self.request.event.settings.invoice_name_required: addr = self.invoice_form.save() try: diff = update_tax_rates(event=request.event, cart_id=get_or_create_cart_id(request), invoice_address=addr) except TaxRule.SaleNotAllowed: messages.error( request, _("Unfortunately, based on the invoice address you entered, we're not able to sell you " "the selected products for tax-related legal reasons.")) return self.render() self.cart_session['invoice_address'] = addr.pk if abs(diff) > Decimal('0.001'): messages.info( request, _('Due to the invoice address you entered, we need to apply a different tax ' 'rate to your purchase and the price of the products in your cart has ' 'changed accordingly.')) return redirect(self.get_next_url(request) + '?open_cart=true') return redirect(self.get_next_url(request))
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: # User has clicked "Open in a new tab" link in widget get_or_create_cart_id(request) return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs)) 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') )) 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) elif 'require_cookie' in request.GET and settings.SESSION_COOKIE_NAME not in request.COOKIES: # Cookies are in fact not supported 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 "" ) }) r._csp_ignore = True return r if request.event.has_subevents: if 'subevent' in kwargs: self.subevent = request.event.subevents.using(settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first() if not self.subevent: raise Http404() return super().get(request, *args, **kwargs) else: return super().get(request, *args, **kwargs) else: if 'subevent' in kwargs: return redirect(self.get_index_url()) else: return super().get(request, *args, **kwargs)
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: # User has clicked "Open in a new tab" link in widget get_or_create_cart_id(request) return redirect(eventreverse(request.event, 'presale:event.index', kwargs=kwargs)) 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') )) 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) elif 'require_cookie' in request.GET and settings.SESSION_COOKIE_NAME not in request.COOKIES: # Cookies are in fact not supported 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 "" ) }) r._csp_ignore = True return r if request.event.has_subevents: if 'subevent' in kwargs: self.subevent = request.event.subevents.using(settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first() if not self.subevent: raise Http404() return super().get(request, *args, **kwargs) else: return super().get(request, *args, **kwargs) else: if 'subevent' in kwargs: return redirect(self.get_index_url()) else: return super().get(request, *args, **kwargs)
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: # User has clicked "Open in a new tab" link in widget get_or_create_cart_id(request) return redirect( eventreverse(request.event, 'presale:event.seatingplan', kwargs=kwargs)) 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.seatingplan', kwargs=kwargs) + '?require_cookie=true&cart_id={}'.format( request.GET.get('take_cart_id'))) 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) if request.event.has_subevents: if 'subevent' in kwargs: self.subevent = request.event.subevents.using( settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first() if not self.subevent or not self.subevent.seating_plan: raise Http404() return super().get(request, *args, **kwargs) else: raise Http404() else: if 'subevent' in kwargs or not request.event.seating_plan: raise Http404() else: return super().get(request, *args, **kwargs)
def _get_event_view(self, request, **kwargs): cache_key = ':'.join([ 'widget.py', 'event', request.organizer.slug, request.event.slug, str(self.subevent.pk) if self.subevent else "", request.GET.urlencode(), get_language(), request.sales_channel.identifier, ]) if "cart_id" not in request.GET: cached_data = cache.get(cache_key) if cached_data: return self.response(cached_data) data = { 'currency': request.event.currency, 'display_net_prices': request.event.settings.display_net_prices, 'show_variations_expanded': request.event.settings.show_variations_expanded, 'waiting_list_enabled': request.event.settings.waiting_list_enabled, 'voucher_explanation_text': str(request.event.settings.voucher_explanation_text), 'error': None, 'cart_exists': False } if 'cart_id' in request.GET and CartPosition.objects.filter( event=request.event, cart_id=request.GET.get('cart_id')).exists(): data['cart_exists'] = True ev = self.subevent or request.event data['name'] = str(ev.name) if self.subevent: data['frontpage_text'] = str( rich_text(self.subevent.frontpage_text, safelinks=False)) else: data['frontpage_text'] = str( rich_text(request.event.settings.frontpage_text, safelinks=False)) data['date_range'] = self._get_date_range(ev, request.event) fail = False if not ev.presale_is_running: if ev.presale_has_ended: if request.event.settings.presale_has_ended_text: data['error'] = str( request.event.settings.presale_has_ended_text) else: data['error'] = gettext( 'The presale period for this event is over.') elif request.event.settings.presale_start_show_date: data['error'] = gettext( 'The presale for this event will start on %(date)s at %(time)s.' ) % { 'date': date_format( ev.effective_presale_start.astimezone( request.event.timezone), "SHORT_DATE_FORMAT"), 'time': date_format( ev.effective_presale_start.astimezone( request.event.timezone), "TIME_FORMAT"), } else: data['error'] = gettext( 'The presale for this event has not yet started.') self.voucher = None if 'voucher' in request.GET: try: self.voucher = request.event.vouchers.get( code__iexact=request.GET.get('voucher').strip()) if self.voucher.redeemed >= self.voucher.max_usages: data['error'] = error_messages['voucher_redeemed'] fail = True if self.voucher.valid_until is not None and self.voucher.valid_until < now( ): data['error'] = error_messages['voucher_expired'] fail = True cart_id = get_or_create_cart_id(request, create=False) if cart_id: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & (Q(expires__gte=now()) | Q(cart_id=get_or_create_cart_id(request)))) else: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & Q(expires__gte=now())) v_avail = self.voucher.max_usages - self.voucher.redeemed - redeemed_in_carts.count( ) if v_avail < 1: data['error'] = error_messages['voucher_redeemed'] fail = True except Voucher.DoesNotExist: data['error'] = error_messages['voucher_invalid'] fail = True if not fail and ( ev.presale_is_running or request.event.settings.show_items_outside_presale_period): data['items_by_category'], data['display_add_to_cart'], data[ 'itemnum'] = self._get_items() data['display_add_to_cart'] = data[ 'display_add_to_cart'] and ev.presale_is_running else: data['items_by_category'] = [] data['display_add_to_cart'] = False data['itemnum'] = 0 data['has_seating_plan'] = ev.seating_plan is not None vouchers_exist = self.request.event.get_cache().get('vouchers_exist') if vouchers_exist is None: vouchers_exist = self.request.event.vouchers.exists() self.request.event.get_cache().set('vouchers_exist', vouchers_exist) data['vouchers_exist'] = vouchers_exist if "cart_id" not in request.GET: cache.set(cache_key, data, 10) # These pages are cached for a really short duration – this should make them pretty accurate with # regards to availability display, while still providing some protection against burst traffic. return self.response(data)
def get(self, request, **kwargs): data = { 'currency': request.event.currency, 'display_net_prices': request.event.settings.display_net_prices, 'show_variations_expanded': request.event.settings.show_variations_expanded, 'waiting_list_enabled': request.event.settings.waiting_list_enabled, 'error': None, 'cart_exists': False } if 'cart_id' in request.GET and CartPosition.objects.filter(event=request.event, cart_id=request.GET.get('cart_id')).exists(): data['cart_exists'] = True ev = self.subevent or request.event fail = False if not ev.presale_is_running: if ev.presale_has_ended: data['error'] = gettext('The presale period for this event is over.') elif request.event.settings.presale_start_show_date: data['error'] = gettext('The presale for this event will start on %(date)s at %(time)s.') % { 'date': date_format(ev.presale_start.astimezone(request.event.timezone), "SHORT_DATE_FORMAT"), 'time': date_format(ev.presale_start.astimezone(request.event.timezone), "TIME_FORMAT"), } else: data['error'] = gettext('The presale for this event has not yet started.') self.voucher = None if 'voucher' in request.GET: try: self.voucher = request.event.vouchers.get(code__iexact=request.GET.get('voucher').strip()) if self.voucher.redeemed >= self.voucher.max_usages: data['error'] = error_messages['voucher_redeemed'] fail = True if self.voucher.valid_until is not None and self.voucher.valid_until < now(): data['error'] = error_messages['voucher_expired'] fail = True cart_id = get_or_create_cart_id(request, create=False) if cart_id: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & (Q(expires__gte=now()) | Q(cart_id=get_or_create_cart_id(request))) ) else: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & Q(expires__gte=now()) ) v_avail = self.voucher.max_usages - self.voucher.redeemed - redeemed_in_carts.count() if v_avail < 1: data['error'] = error_messages['voucher_redeemed'] fail = True except Voucher.DoesNotExist: data['error'] = error_messages['voucher_invalid'] fail = True if not fail and (ev.presale_is_running or request.event.settings.show_items_outside_presale_period): data['items_by_category'], data['display_add_to_cart'], data['itemnum'] = self._get_items() data['display_add_to_cart'] = data['display_add_to_cart'] and ev.presale_is_running else: data['items_by_category'] = [] data['display_add_to_cart'] = False data['itemnum'] = 0 vouchers_exist = self.request.event.get_cache().get('vouchers_exist') if vouchers_exist is None: vouchers_exist = self.request.event.vouchers.exists() self.request.event.get_cache().set('vouchers_exist', vouchers_exist) data['vouchers_exist'] = vouchers_exist resp = JsonResponse(data) resp['Access-Control-Allow-Origin'] = '*' return resp
def get(self, request, *args, **kwargs): # redirect old month-year-URLs to new date-URLs keys = ("month", "year") if all(k in request.GET for k in keys): get_params = { k: v for k, v in request.GET.items() if k not in keys } get_params["date"] = "%s-%s" % (request.GET.get("year"), request.GET.get("month")) return redirect(self.request.path + "?" + urlencode(get_params)) # redirect old week-year-URLs to new date-URLs keys = ("week", "year") if all(k in request.GET for k in keys): get_params = { k: v for k, v in request.GET.items() if k not in keys } get_params["date"] = "%s-W%s" % (request.GET.get("year"), request.GET.get("week")) return redirect(self.request.path + "?" + urlencode(get_params)) 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: # User has clicked "Open in a new tab" link in widget get_or_create_cart_id(request) return redirect( eventreverse(request.event, 'presale:event.index', kwargs=kwargs)) 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'))) 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) elif 'require_cookie' in request.GET and settings.SESSION_COOKIE_NAME not in request.COOKIES: # Cookies are in fact not supported 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 "") }) r._csp_ignore = True return r if request.sales_channel.identifier not in request.event.sales_channels: raise Http404( _('Tickets for this event cannot be purchased on this sales channel.' )) if request.event.has_subevents: if 'subevent' in kwargs: self.subevent = request.event.subevents.using( settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first() if not self.subevent: raise Http404() return super().get(request, *args, **kwargs) else: return super().get(request, *args, **kwargs) else: if 'subevent' in kwargs: return redirect(self.get_index_url()) else: return super().get(request, *args, **kwargs)
def _get_event_view(self, request, **kwargs): cache_key = ':'.join([ 'widget.py', 'event', request.organizer.slug, request.event.slug, str(self.subevent.pk) if self.subevent else "", request.GET.get("voucher") or "-", get_language(), ]) if "cart_id" not in request.GET: cached_data = cache.get(cache_key) if cached_data: return self.response(cached_data) data = { 'currency': request.event.currency, 'display_net_prices': request.event.settings.display_net_prices, 'show_variations_expanded': request.event.settings.show_variations_expanded, 'waiting_list_enabled': request.event.settings.waiting_list_enabled, 'voucher_explanation_text': str(request.event.settings.voucher_explanation_text), 'error': None, 'cart_exists': False } if 'cart_id' in request.GET and CartPosition.objects.filter(event=request.event, cart_id=request.GET.get('cart_id')).exists(): data['cart_exists'] = True ev = self.subevent or request.event data['name'] = str(ev.name) fail = False if not ev.presale_is_running: if ev.presale_has_ended: if request.event.settings.presale_has_ended_text: data['error'] = str(request.event.settings.presale_has_ended_text) else: data['error'] = ugettext('The presale period for this event is over.') elif request.event.settings.presale_start_show_date: data['error'] = ugettext('The presale for this event will start on %(date)s at %(time)s.') % { 'date': date_format(ev.presale_start.astimezone(request.event.timezone), "SHORT_DATE_FORMAT"), 'time': date_format(ev.presale_start.astimezone(request.event.timezone), "TIME_FORMAT"), } else: data['error'] = ugettext('The presale for this event has not yet started.') self.voucher = None if 'voucher' in request.GET: try: self.voucher = request.event.vouchers.get(code__iexact=request.GET.get('voucher').strip()) if self.voucher.redeemed >= self.voucher.max_usages: data['error'] = error_messages['voucher_redeemed'] fail = True if self.voucher.valid_until is not None and self.voucher.valid_until < now(): data['error'] = error_messages['voucher_expired'] fail = True cart_id = get_or_create_cart_id(request, create=False) if cart_id: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & (Q(expires__gte=now()) | Q(cart_id=get_or_create_cart_id(request))) ) else: redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & Q(expires__gte=now()) ) v_avail = self.voucher.max_usages - self.voucher.redeemed - redeemed_in_carts.count() if v_avail < 1: data['error'] = error_messages['voucher_redeemed'] fail = True except Voucher.DoesNotExist: data['error'] = error_messages['voucher_invalid'] fail = True if not fail and (ev.presale_is_running or request.event.settings.show_items_outside_presale_period): data['items_by_category'], data['display_add_to_cart'], data['itemnum'] = self._get_items() data['display_add_to_cart'] = data['display_add_to_cart'] and ev.presale_is_running else: data['items_by_category'] = [] data['display_add_to_cart'] = False data['itemnum'] = 0 vouchers_exist = self.request.event.get_cache().get('vouchers_exist') if vouchers_exist is None: vouchers_exist = self.request.event.vouchers.exists() self.request.event.get_cache().set('vouchers_exist', vouchers_exist) data['vouchers_exist'] = vouchers_exist if "cart_id" not in request.GET: cache.set(cache_key, data, 10) # These pages are cached for a really short duration – this should make them pretty accurate with # regards to availability display, while still providing some protection against burst traffic. return self.response(data)
def get(self, request, **kwargs): data = { 'currency': request.event.currency, 'display_net_prices': request.event.settings.display_net_prices, 'show_variations_expanded': request.event.settings.show_variations_expanded, 'waiting_list_enabled': request.event.settings.waiting_list_enabled, 'error': None, 'cart_exists': False } if 'cart_id' in request.GET and CartPosition.objects.filter(event=request.event, cart_id=request.GET.get('cart_id')).exists(): data['cart_exists'] = True ev = self.subevent or request.event fail = False if not ev.presale_is_running: if ev.presale_has_ended: data['error'] = 'The presale period for this event is over.' elif request.event.settings.presale_start_show_date: data['error'] = 'The presale for this event will start on %(date)s at %(time)s.' % { 'date': date_format(ev.presale_start, "SHORT_DATE_FORMAT"), 'time': date_format(ev.presale_start, "TIME_FORMAT"), } else: data['error'] = 'The presale for this event has not yet started.' self.voucher = None if 'voucher' in request.GET: try: self.voucher = request.event.vouchers.get(code=request.GET.get('voucher').strip()) if self.voucher.redeemed >= self.voucher.max_usages: data['error'] = error_messages['voucher_redeemed'] fail = True if self.voucher.valid_until is not None and self.voucher.valid_until < now(): data['error'] = error_messages['voucher_expired'] fail = True redeemed_in_carts = CartPosition.objects.filter( Q(voucher=self.voucher) & Q(event=request.event) & (Q(expires__gte=now()) | Q(cart_id=get_or_create_cart_id(request))) ) v_avail = self.voucher.max_usages - self.voucher.redeemed - redeemed_in_carts.count() if v_avail < 1: data['error'] = error_messages['voucher_redeemed'] fail = True except Voucher.DoesNotExist: data['error'] = error_messages['voucher_invalid'] fail = True if not fail and (ev.presale_is_running or request.event.settings.show_items_outside_presale_period): data['items_by_category'], data['display_add_to_cart'] = self._get_items() data['display_add_to_cart'] = data['display_add_to_cart'] and ev.presale_is_running else: data['items_by_category'] = [] data['display_add_to_cart'] = False vouchers_exist = self.request.event.get_cache().get('vouchers_exist') if vouchers_exist is None: vouchers_exist = self.request.event.vouchers.exists() self.request.event.get_cache().set('vouchers_exist', vouchers_exist) data['vouchers_exist'] = vouchers_exist resp = JsonResponse(data) resp['Access-Control-Allow-Origin'] = '*' return resp