diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index 117212437..a839f2ee5 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -498,6 +498,23 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): | Q(id__in=self.teams.filter(**kwargs).values_list('limit_events__id', flat=True)) ) + @scopes_disabled() + def get_organizers_with_any_permission(self, request=None): + """ + Returns a queryset of organizers the user has any permissions to. + + :param request: The current request (optional). Required to detect staff sessions properly. + :return: Iterable of Organizers + """ + from .event import Organizer + + if request and self.has_active_staff_session(request.session.session_key): + return Organizer.objects.all() + + return Organizer.objects.filter( + id__in=self.teams.values_list('organizer', flat=True) + ) + @scopes_disabled() def get_organizers_with_permission(self, permission, request=None): """ diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 239fe31e7..a973b92fb 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -142,6 +142,18 @@ class PermissionMiddleware: return redirect(reverse('control:user.settings.2fa')) if 'event' in url.kwargs and 'organizer' in url.kwargs: + if url.kwargs['organizer'] == '-' and url.kwargs['event'] == '-': + # This is a hack that just takes the user to ANY event. It's useful to link to features in support + # or documentation. + ev = request.user.get_events_with_any_permission().order_by('-date_from').first() + if not ev: + raise Http404(_("The selected event was not found or you " + "have no permission to administrate it.")) + k = dict(url.kwargs) + k['organizer'] = ev.organizer.slug + k['event'] = ev.slug + return redirect(reverse(url.view_name, kwargs=k, args=url.args)) + with scope(organizer=None): request.event = Event.objects.filter( slug=url.kwargs['event'], @@ -157,6 +169,17 @@ class PermissionMiddleware: else: request.eventpermset = request.user.get_event_permission_set(request.organizer, request.event) elif 'organizer' in url.kwargs: + if url.kwargs['organizer'] == '-': + # This is a hack that just takes the user to ANY organizer. It's useful to link to features in support + # or documentation. + org = request.user.get_organizers_with_any_permission().first() + if not org: + raise Http404(_("The selected organizer was not found or you " + "have no permission to administrate it.")) + k = dict(url.kwargs) + k['organizer'] = org.slug + return redirect(reverse(url.view_name, kwargs=k, args=url.args)) + request.organizer = Organizer.objects.filter( slug=url.kwargs['organizer'], ).first()