diff --git a/src/pretix/api/views/exporters.py b/src/pretix/api/views/exporters.py index 87acc5f704..c87893d2c5 100644 --- a/src/pretix/api/views/exporters.py +++ b/src/pretix/api/views/exporters.py @@ -132,7 +132,7 @@ class EventExportersViewSet(ExportersMixin, viewsets.ViewSet): def exporters(self): exporters = [] responses = register_data_exporters.send(self.request.event) - for ex in sorted([response(self.request.event) for r, response in responses], key=lambda ex: str(ex.verbose_name)): + for ex in sorted([response(self.request.event, self.request.organizer) for r, response in responses], key=lambda ex: str(ex.verbose_name)): ex._serializer = JobRunSerializer(exporter=ex) exporters.append(ex) return exporters @@ -151,7 +151,7 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet): organizer=self.request.organizer ) responses = register_multievent_data_exporters.send(self.request.organizer) - for ex in sorted([response(events) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)): + for ex in sorted([response(events, self.request.organizer) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)): ex._serializer = JobRunSerializer(exporter=ex, events=events) exporters.append(ex) return exporters diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index 9d75fa9bfe..f956e28b22 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -70,8 +70,9 @@ class BaseExporter: This is the base class for all data exporters """ - def __init__(self, event, progress_callback=lambda v: None): + def __init__(self, event, organizer, progress_callback=lambda v: None): self.event = event + self.organizer = organizer self.progress_callback = progress_callback self.is_multievent = isinstance(event, QuerySet) if isinstance(event, QuerySet): diff --git a/src/pretix/base/management/commands/export.py b/src/pretix/base/management/commands/export.py index 63c89d59d5..6552c8c278 100644 --- a/src/pretix/base/management/commands/export.py +++ b/src/pretix/base/management/commands/export.py @@ -103,7 +103,7 @@ class Command(BaseCommand): with language(locale), override(timezone): for receiver, response in signal_result: - ex = response(e, report_status) + ex = response(e, o, report_status) if ex.identifier == options['export_provider']: params = json.loads(options.get('parameters') or '{}') with open(options['output_file'], 'wb') as f: diff --git a/src/pretix/base/services/export.py b/src/pretix/base/services/export.py index 75c5a26844..d35206aab7 100644 --- a/src/pretix/base/services/export.py +++ b/src/pretix/base/services/export.py @@ -56,7 +56,7 @@ def export(self, event: Event, fileid: str, provider: str, form_data: Dict[str, with language(event.settings.locale, event.settings.region), override(event.settings.timezone): responses = register_data_exporters.send(event) for receiver, response in responses: - ex = response(event, set_progress) + ex = response(event, event.organizer, set_progress) if ex.identifier == provider: d = ex.render(form_data) if d is None: @@ -70,12 +70,15 @@ def export(self, event: Event, fileid: str, provider: str, form_data: Dict[str, @app.task(base=ProfiledOrganizerUserTask, throws=(ExportError,), bind=True) -def multiexport(self, organizer: Organizer, user: User, device: int, token: int, fileid: str, provider: str, form_data: Dict[str, Any]) -> None: +def multiexport(self, organizer: Organizer, user: User, device: int, token: int, fileid: str, provider: str, + form_data: Dict[str, Any], staff_session=False) -> None: if device: device = Device.objects.get(pk=device) if token: device = TeamAPIToken.objects.get(pk=token) allowed_events = (device or token or user).get_events_with_permission('can_view_orders') + if user and staff_session: + allowed_events = organizer.events.all() def set_progress(val): if not self.request.called_directly: @@ -100,16 +103,19 @@ def multiexport(self, organizer: Organizer, user: User, device: int, token: int, timezone = settings.TIME_ZONE region = None with language(locale, region), override(timezone): - if isinstance(form_data['events'][0], str): - events = allowed_events.filter(slug__in=form_data.get('events'), organizer=organizer) + if form_data.get('events') is not None: + if isinstance(form_data['events'][0], str): + events = allowed_events.filter(slug__in=form_data.get('events'), organizer=organizer) + else: + events = allowed_events.filter(pk__in=form_data.get('events')) else: - events = allowed_events.filter(pk__in=form_data.get('events')) + events = allowed_events responses = register_multievent_data_exporters.send(organizer) for receiver, response in responses: if not response: continue - ex = response(events, set_progress) + ex = response(events, organizer, set_progress) if ex.identifier == provider: d = ex.render(form_data) if d is None: diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index de8ae6161a..b4dd6cd3b6 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -2175,7 +2175,7 @@ class ExportMixin: def exporters(self): exporters = [] responses = register_data_exporters.send(self.request.event) - for ex in sorted([response(self.request.event) for r, response in responses], key=lambda ex: str(ex.verbose_name)): + for ex in sorted([response(self.request.event, self.request.organizer) for r, response in responses], key=lambda ex: str(ex.verbose_name)): if self.request.GET.get("identifier") and ex.identifier != self.request.GET.get("identifier"): continue diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index c98b535f91..828b25f311 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -1318,7 +1318,7 @@ class ExportMixin: ) responses = register_multievent_data_exporters.send(self.request.organizer) id = self.request.GET.get("identifier") or self.request.POST.get("exporter") - for ex in sorted([response(events) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)): + for ex in sorted([response(events, self.request.organizer) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)): if id and ex.identifier != id: continue @@ -1406,7 +1406,8 @@ class ExportDoView(OrganizerPermissionRequiredMixin, ExportMixin, AsyncAction, T provider=self.exporter.identifier, device=None, token=None, - form_data=self.exporter.form.cleaned_data + form_data=self.exporter.form.cleaned_data, + staff_session=self.request.user.has_active_staff_session(self.request.session.session_key) )