diff --git a/doc/development/api/plugins.rst b/doc/development/api/plugins.rst index 78112c2bd..614846d76 100644 --- a/doc/development/api/plugins.rst +++ b/doc/development/api/plugins.rst @@ -79,6 +79,9 @@ human-readable error messages. We recommend using the ``django.utils.functional. decorator, as it might get called a lot. You can also implement ``compatibility_warnings``, those will be displayed but not block the plugin execution. +The ``AppConfig`` class may implement a method ``is_available(event)`` that checks if a plugin +is available for a specific event. If not, it will not be shown in the plugin list of that event. + Plugin registration ------------------- diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index 6511869b0..e51d8272c 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -95,7 +95,7 @@ class EventSerializer(I18nAwareModelSerializer): from pretix.base.plugins import get_all_plugins plugins_available = { - p.module for p in get_all_plugins() + p.module for p in get_all_plugins(self.instance) if not p.name.startswith('.') and getattr(p, 'visible', True) } diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 3792d63ab..608b1e4a4 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -759,7 +759,7 @@ class Event(EventMixin, LoggedModel): plugins_active = self.get_plugins() plugins_available = { - p.module: p for p in get_all_plugins() + p.module: p for p in get_all_plugins(self) if not p.name.startswith('.') and getattr(p, 'visible', True) } diff --git a/src/pretix/base/plugins.py b/src/pretix/base/plugins.py index c46d7bc28..9bf684afc 100644 --- a/src/pretix/base/plugins.py +++ b/src/pretix/base/plugins.py @@ -17,7 +17,7 @@ class PluginType(Enum): EXPORT = 4 -def get_all_plugins() -> List[type]: +def get_all_plugins(event=None) -> List[type]: """ Returns the PretixPluginMeta classes of all plugins found in the installed Django apps. """ @@ -29,6 +29,11 @@ def get_all_plugins() -> List[type]: meta.app = app if app.name in settings.PRETIX_PLUGINS_EXCLUDE: continue + + if hasattr(app, 'is_available') and event: + if not app.is_available(event): + continue + plugins.append(meta) return sorted( plugins, diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 33be8d961..cfdf0cdaa 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -188,7 +188,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat from pretix.base.plugins import get_all_plugins context = super().get_context_data(*args, **kwargs) - context['plugins'] = [p for p in get_all_plugins() if not p.name.startswith('.') + context['plugins'] = [p for p in get_all_plugins(self.object) if not p.name.startswith('.') and getattr(p, 'visible', True)] context['plugins_active'] = self.object.get_plugins() return context @@ -204,7 +204,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat self.object = self.get_object() plugins_available = { - p.module: p for p in get_all_plugins() + p.module: p for p in get_all_plugins(self.object) if not p.name.startswith('.') and getattr(p, 'visible', True) }