forked from CGM_Public/pretix_original
Add BaseExporter.available_for_user()
This commit is contained in:
@@ -133,7 +133,12 @@ class EventExportersViewSet(ExportersMixin, viewsets.ViewSet):
|
|||||||
def exporters(self):
|
def exporters(self):
|
||||||
exporters = []
|
exporters = []
|
||||||
responses = register_data_exporters.send(self.request.event)
|
responses = register_data_exporters.send(self.request.event)
|
||||||
for ex in sorted([response(self.request.event, self.request.organizer) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)):
|
raw_exporters = [response(self.request.event, self.request.organizer) for r, response in responses if response]
|
||||||
|
raw_exporters = [
|
||||||
|
ex for ex in raw_exporters
|
||||||
|
if ex.available_for_user(self.request.user if self.request.user and self.request.user.is_authenticated else None)
|
||||||
|
]
|
||||||
|
for ex in sorted(raw_exporters, key=lambda ex: str(ex.verbose_name)):
|
||||||
ex._serializer = JobRunSerializer(exporter=ex)
|
ex._serializer = JobRunSerializer(exporter=ex)
|
||||||
exporters.append(ex)
|
exporters.append(ex)
|
||||||
return exporters
|
return exporters
|
||||||
@@ -166,7 +171,7 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
|
|||||||
if (
|
if (
|
||||||
not isinstance(ex, OrganizerLevelExportMixin) or
|
not isinstance(ex, OrganizerLevelExportMixin) or
|
||||||
perm_holder.has_organizer_permission(self.request.organizer, ex.organizer_required_permission, self.request)
|
perm_holder.has_organizer_permission(self.request.organizer, ex.organizer_required_permission, self.request)
|
||||||
)
|
) and ex.available_for_user(self.request.user if self.request.user and self.request.user.is_authenticated else None)
|
||||||
]
|
]
|
||||||
for ex in sorted(raw_exporters, key=lambda ex: str(ex.verbose_name)):
|
for ex in sorted(raw_exporters, key=lambda ex: str(ex.verbose_name)):
|
||||||
ex._serializer = JobRunSerializer(exporter=ex, events=events)
|
ex._serializer = JobRunSerializer(exporter=ex, events=events)
|
||||||
|
|||||||
@@ -157,6 +157,13 @@ class BaseExporter:
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError() # NOQA
|
raise NotImplementedError() # NOQA
|
||||||
|
|
||||||
|
def available_for_user(self, user) -> bool:
|
||||||
|
"""
|
||||||
|
Allows to do additional checks whether an exporter is available based on the user who calls it. Note that
|
||||||
|
``user`` may be ``None`` e.g. during API usage.
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class OrganizerLevelExportMixin:
|
class OrganizerLevelExportMixin:
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -290,6 +290,8 @@ def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> Non
|
|||||||
if isinstance(exporter, OrganizerLevelExportMixin):
|
if isinstance(exporter, OrganizerLevelExportMixin):
|
||||||
if not schedule.owner.has_organizer_permission(organizer, exporter.organizer_required_permission):
|
if not schedule.owner.has_organizer_permission(organizer, exporter.organizer_required_permission):
|
||||||
has_permission = False
|
has_permission = False
|
||||||
|
if exporter and not exporter.available_for_user(schedule.owner):
|
||||||
|
has_permission = False
|
||||||
|
|
||||||
_run_scheduled_export(
|
_run_scheduled_export(
|
||||||
schedule,
|
schedule,
|
||||||
|
|||||||
@@ -2261,8 +2261,13 @@ class ExportMixin:
|
|||||||
@cached_property
|
@cached_property
|
||||||
def exporters(self):
|
def exporters(self):
|
||||||
responses = register_data_exporters.send(self.request.event)
|
responses = register_data_exporters.send(self.request.event)
|
||||||
|
raw_exporters = [response(self.request.event, self.request.organizer) for r, response in responses if response]
|
||||||
|
raw_exporters = [
|
||||||
|
ex for ex in raw_exporters
|
||||||
|
if ex.available_for_user(self.request.user if self.request.user and self.request.user.is_authenticated else None)
|
||||||
|
]
|
||||||
return sorted(
|
return sorted(
|
||||||
[response(self.request.event, self.request.organizer) for r, response in responses if response],
|
raw_exporters,
|
||||||
key=lambda ex: (0 if ex.category else 1, ex.category or "", 0 if ex.featured else 1, str(ex.verbose_name).lower())
|
key=lambda ex: (0 if ex.category else 1, ex.category or "", 0 if ex.featured else 1, str(ex.verbose_name).lower())
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1694,7 +1694,7 @@ class ExportMixin:
|
|||||||
not isinstance(ex, OrganizerLevelExportMixin) or
|
not isinstance(ex, OrganizerLevelExportMixin) or
|
||||||
self.request.user.has_organizer_permission(self.request.organizer, ex.organizer_required_permission,
|
self.request.user.has_organizer_permission(self.request.organizer, ex.organizer_required_permission,
|
||||||
self.request)
|
self.request)
|
||||||
)
|
) and ex.available_for_user(self.request.user if self.request.user and self.request.user.is_authenticated else None)
|
||||||
]
|
]
|
||||||
return sorted(
|
return sorted(
|
||||||
raw_exporters,
|
raw_exporters,
|
||||||
|
|||||||
Reference in New Issue
Block a user