From 7514b9bab2a62111e6e1976ffd0970735c2c159e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 28 Jul 2016 21:02:29 +0200 Subject: [PATCH] Added a signal for processing event requests --- doc/development/api/general.rst | 6 ++++++ src/pretix/presale/signals.py | 16 ++++++++++++++++ src/pretix/presale/utils.py | 5 +++++ 3 files changed, 27 insertions(+) diff --git a/doc/development/api/general.rst b/doc/development/api/general.rst index 85cb03572..2d68935d0 100644 --- a/doc/development/api/general.rst +++ b/doc/development/api/general.rst @@ -72,3 +72,9 @@ Periodic tasks .. automodule:: pretix.base.signals :members: periodic_task + +Request flow +------------ + +.. automodule:: pretix.presale.signals + :members: process_request diff --git a/src/pretix/presale/signals.py b/src/pretix/presale/signals.py index 91bb95dd5..0eff0e927 100644 --- a/src/pretix/presale/signals.py +++ b/src/pretix/presale/signals.py @@ -45,3 +45,19 @@ This signal is sent out to display additional information on the order detail pa As with all plugin signals, the ``sender`` keyword argument will contain the event. """ + +process_request = EventPluginSignal( + providing_args=["request"] +) +""" +This signal is sent out whenever a request is made to a event presale page. Most of the +time, this will be called from the middleware layer (except on plugin-provided pages +this will be caled by the @event_view decorator). Similarly to Django's process_request +middleware method, if you return a Response, that response will be used and the request +won't be processed any further down the stack. + +WARNING: Be very careful about using this signal as listening to it makes it really +easy to cause serious performance problems. + +As with all plugin signals, the ``sender`` keyword argument will contain the event. +""" diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 99553d8d1..29423a392 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -9,6 +9,7 @@ from django.utils.translation import ugettext_lazy as _ from pretix.base.middleware import LocaleMiddleware from pretix.base.models import Event, EventPermission, Organizer from pretix.multidomain.urlreverse import get_domain +from pretix.presale.signals import process_request def _detect_event(request): @@ -63,6 +64,10 @@ def _detect_event(request): event=request.event, user=request.user).exists(): 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: