def _detect_event(request, require_live=True, require_plugin=None): if hasattr(request, '_event_detected'): return db = 'default' if request.method == 'GET': db = settings.DATABASE_REPLICA url = resolve(request.path_info) try: if hasattr(request, 'event_domain'): # We are on an event's custom domain pass elif hasattr(request, 'organizer_domain'): # We are on an organizer's custom domain if 'organizer' in url.kwargs and url.kwargs['organizer']: if url.kwargs['organizer'] != request.organizer.slug: raise Http404(_('The selected event was not found.')) path = "/" + request.get_full_path().split("/", 2)[-1] return redirect(path) request.event = request.organizer.events.using(db).get( slug=url.kwargs['event'], organizer=request.organizer, ) request.organizer = request.organizer # If this event has a custom domain, send the user there domain = get_event_domain(request.event) if domain: if request.port and request.port not in (80, 443): domain = '%s:%d' % (domain, request.port) path = request.get_full_path().split("/", 2)[-1] r = redirect( urljoin('%s://%s' % (request.scheme, domain), path)) r['Access-Control-Allow-Origin'] = '*' return r else: # We are on our main domain if 'event' in url.kwargs and 'organizer' in url.kwargs: request.event = Event.objects\ .select_related('organizer')\ .using(db)\ .get( slug=url.kwargs['event'], organizer__slug=url.kwargs['organizer'] ) request.organizer = request.event.organizer # If this event has a custom domain, send the user there domain = get_event_domain(request.event) if domain: if request.port and request.port not in (80, 443): domain = '%s:%d' % (domain, request.port) path = request.get_full_path().split("/", 3)[-1] r = redirect( urljoin('%s://%s' % (request.scheme, domain), path)) r['Access-Control-Allow-Origin'] = '*' return r elif 'organizer' in url.kwargs: request.organizer = Organizer.objects.using(db).get( slug=url.kwargs['organizer']) else: raise Http404() # If this organizer has a custom domain, send the user there domain = get_organizer_domain(request.organizer) if domain: if request.port and request.port not in (80, 443): domain = '%s:%d' % (domain, request.port) path = request.get_full_path().split("/", 2)[-1] r = redirect( urljoin('%s://%s' % (request.scheme, domain), path)) r['Access-Control-Allow-Origin'] = '*' return r if hasattr(request, 'event'): # Restrict locales to the ones available for this event LocaleMiddleware().process_request(request) if require_live and not request.event.live: can_access = ( url.url_name == 'event.auth' or (request.user.is_authenticated and request.user.has_event_permission( request.organizer, request.event, request=request))) if not can_access and 'pretix_event_access_{}'.format( request.event.pk) in request.session: sparent = SessionStore( request.session.get('pretix_event_access_{}'.format( request.event.pk))) try: parentdata = sparent.load() except: pass else: can_access = 'event_access' in parentdata if not can_access: # Directly construct view instead of just calling `raise` since this case is so common that we # don't want it to show in our log files. return permission_denied( request, PermissionDenied( _('The selected ticket shop is currently not available.' ))) if require_plugin: is_core = any( require_plugin.startswith(m) for m in settings.CORE_MODULES) if require_plugin not in request.event.get_plugins( ) and not is_core: raise Http404(_('This feature is not enabled.')) for receiver, response in process_request.send(request.event, request=request): if response: return response except Event.DoesNotExist: try: if hasattr(request, 'organizer_domain'): event = request.organizer.events.get( slug__iexact=url.kwargs['event'], organizer=request.organizer, ) pathparts = request.get_full_path().split('/') pathparts[1] = event.slug return redirect('/'.join(pathparts)) else: if 'event' in url.kwargs and 'organizer' in url.kwargs: event = Event.objects.select_related('organizer').get( slug__iexact=url.kwargs['event'], organizer__slug__iexact=url.kwargs['organizer']) pathparts = request.get_full_path().split('/') pathparts[1] = event.organizer.slug pathparts[2] = event.slug return redirect('/'.join(pathparts)) except Event.DoesNotExist: raise Http404(_('The selected event was not found.')) raise Http404(_('The selected event was not found.')) except Organizer.DoesNotExist: if 'organizer' in url.kwargs: try: organizer = Organizer.objects.get( slug__iexact=url.kwargs['organizer']) except Organizer.DoesNotExist: raise Http404(_('The selected organizer was not found.')) pathparts = request.get_full_path().split('/') pathparts[1] = organizer.slug return redirect('/'.join(pathparts)) raise Http404(_('The selected organizer was not found.')) request._event_detected = True
def _detect_event(request, require_live=True): url = resolve(request.path_info) try: if hasattr(request, 'organizer'): # We are on an organizer's custom domain if 'organizer' in url.kwargs and url.kwargs['organizer']: if url.kwargs['organizer'] != request.organizer.slug: raise Http404(_('The selected event was not found.')) path = "/" + request.get_full_path().split("/", 2)[-1] return redirect(path) request.event = request.organizer.events\ .get( slug=url.kwargs['event'], organizer=request.organizer, ) request.organizer = request.organizer else: # We are on our main domain if 'event' in url.kwargs and 'organizer' in url.kwargs: request.event = Event.objects\ .select_related('organizer')\ .get( slug=url.kwargs['event'], organizer__slug=url.kwargs['organizer'] ) request.organizer = request.event.organizer elif 'organizer' in url.kwargs: request.organizer = Organizer.objects.get( slug=url.kwargs['organizer']) else: raise Http404() # If this organizer has a custom domain, send the user there domain = get_domain(request.organizer) if domain: if request.port and request.port not in (80, 443): domain = '%s:%d' % (domain, request.port) path = request.get_full_path().split("/", 2)[-1] return redirect( urljoin('%s://%s' % (request.scheme, domain), path)) if hasattr(request, 'event'): # Restrict locales to the ones available for this event LocaleMiddleware().process_request(request) if require_live and not request.event.live: can_access = ( url.url_name == 'event.auth' or (request.user.is_authenticated and EventPermission.objects.filter( event=request.event, user=request.user).exists())) if not can_access and 'pretix_event_access_{}'.format( request.event.pk) in request.session: sparent = SessionStore( request.session.get('pretix_event_access_{}'.format( request.event.pk))) try: parentdata = sparent.load() except: pass else: can_access = 'event_access' in parentdata if not can_access: raise PermissionDenied( _('The selected ticket shop is currently not available.' )) for receiver, response in process_request.send(request.event, request=request): if response: return response except Event.DoesNotExist: raise Http404(_('The selected event was not found.')) except Organizer.DoesNotExist: raise Http404(_('The selected organizer was not found.'))