diff --git a/doc/development/api/customview.rst b/doc/development/api/customview.rst index d8d8b5ebfa..50022e14ef 100644 --- a/doc/development/api/customview.rst +++ b/doc/development/api/customview.rst @@ -84,13 +84,14 @@ view if you want pretix's default behavior:: from pretix.presale.utils import event_view @event_view - def event_view(request, *args, **kwargs): + def some_event_view(request, *args, **kwargs): ... This decorator will check the URL arguments for their ``event`` and ``organizer`` parameters and correctly ensure that: -* The requested event exists and is activated +* The requested event exists +* The requested event is activated (can be overridden by decorating with ``@event_view(require_live=False)``) * The event is accessed via the domain it should be accessed * The ``request.event`` attribute contains the correct ``Event`` object * The ``request.organizer`` attribute contains the correct ``Organizer`` object diff --git a/src/pretix/plugins/stripe/views.py b/src/pretix/plugins/stripe/views.py index f707692765..3d2722c08b 100644 --- a/src/pretix/plugins/stripe/views.py +++ b/src/pretix/plugins/stripe/views.py @@ -16,7 +16,7 @@ logger = logging.getLogger('pretix.plugins.stripe') @csrf_exempt @require_POST -@event_view +@event_view(require_live=False) def webhook(request, *args, **kwargs): event_json = json.loads(request.body.decode('utf-8')) diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 264717ae4e..05acf84e05 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -12,7 +12,7 @@ from pretix.multidomain.urlreverse import get_domain from pretix.presale.signals import process_request, process_response -def _detect_event(request): +def _detect_event(request, require_live=True): url = resolve(request.path_info) try: if hasattr(request, 'organizer'): @@ -58,7 +58,7 @@ def _detect_event(request): # Restrict locales to the ones available for this event LocaleMiddleware().process_request(request) - if not request.event.live: + if require_live and not request.event.live: if not request.user.is_authenticated or not EventPermission.objects.filter( event=request.event, user=request.user).exists(): raise PermissionDenied(_('The selected ticket shop is currently not available.')) @@ -73,14 +73,19 @@ def _detect_event(request): raise Http404(_('The selected organizer was not found.')) -def event_view(func): - def wrap(request, *args, **kwargs): - ret = _detect_event(request) - if ret: - return ret - else: - response = func(request=request, *args, **kwargs) - for receiver, r in process_response.send(request.event, request=request, response=response): - response = r - return response - return wrap +def event_view(function=None, require_live=True): + def event_view_wrapper(func, require_live=require_live): + def wrap(request, *args, **kwargs): + ret = _detect_event(request, require_live=require_live) + if ret: + return ret + else: + response = func(request=request, *args, **kwargs) + for receiver, r in process_response.send(request.event, request=request, response=response): + response = r + return response + return wrap + + if function: + return event_view_wrapper(function, require_live=require_live) + return event_view_wrapper