diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index f8ca0369e8..39cda62954 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -1480,17 +1480,22 @@ class Event(EventMixin, LoggedModel): return get_all_plugins_map(event=self, only_visible=True) def set_active_plugins(self, modules, allow_restricted=frozenset()): - plugins_active = self.get_plugins() plugins_available = self.get_available_plugins() + plugins_current = set(self.get_plugins()) + plugins_new = set(modules) - enable = [m for m in modules if m not in plugins_active and m in plugins_available] - - for module in enable: + for module in plugins_new - plugins_current: + if module not in plugins_available: + continue if getattr(plugins_available[module].app, 'restricted', False) and module not in allow_restricted: modules.remove(module) elif hasattr(plugins_available[module].app, 'installed'): getattr(plugins_available[module].app, 'installed')(self) + for module in plugins_current - plugins_new: + if module in plugins_available and hasattr(plugins_available[module].app, 'uninstalled'): + getattr(plugins_available[module].app, 'uninstalled')(self) + self.plugins = ",".join(modules) def enable_plugin(self, module, allow_restricted=frozenset()): @@ -1505,7 +1510,7 @@ class Event(EventMixin, LoggedModel): def disable_plugin(self, module): """ - Adds a plugin to the list of plugins, calling its ``uninstalled`` hook (if available). + Removes a plugin from the list of plugins, calling its ``uninstalled`` hook (if available). It is the caller's responsibility to save the event object. """ plugins_active = self.get_plugins() @@ -1513,10 +1518,6 @@ class Event(EventMixin, LoggedModel): plugins_active.remove(module) self.set_active_plugins(plugins_active) - plugins_available = self.get_available_plugins() - if module in plugins_available and hasattr(plugins_available[module].app, 'uninstalled'): - getattr(plugins_available[module].app, 'uninstalled')(self) - @staticmethod def clean_has_subevents(event, has_subevents): if event is not None and event.has_subevents is not None: diff --git a/src/pretix/base/models/organizer.py b/src/pretix/base/models/organizer.py index 8704d69c2c..b3ac5f0146 100644 --- a/src/pretix/base/models/organizer.py +++ b/src/pretix/base/models/organizer.py @@ -180,17 +180,22 @@ class Organizer(LoggedModel): return get_all_plugins_map(organizer=self, only_visible=True) def set_active_plugins(self, modules, allow_restricted=frozenset()): - plugins_active = self.get_plugins() plugins_available = self.get_available_plugins() + plugins_current = set(self.get_plugins()) + plugins_new = set(modules) - enable = [m for m in modules if m not in plugins_active and m in plugins_available] - - for module in enable: + for module in plugins_new - plugins_current: + if module not in plugins_available: + continue if getattr(plugins_available[module].app, 'restricted', False) and module not in allow_restricted: modules.remove(module) elif hasattr(plugins_available[module].app, 'installed'): getattr(plugins_available[module].app, 'installed')(self) + for module in plugins_current - plugins_new: + if module in plugins_available and hasattr(plugins_available[module].app, 'uninstalled'): + getattr(plugins_available[module].app, 'uninstalled')(self) + self.plugins = ",".join(modules) def enable_plugin(self, module, allow_restricted=frozenset()): @@ -214,10 +219,6 @@ class Organizer(LoggedModel): plugins_active.remove(module) self.set_active_plugins(plugins_active) - plugins_available = self.get_available_plugins() - if module in plugins_available and hasattr(plugins_available[module].app, 'uninstalled'): - getattr(plugins_available[module].app, 'uninstalled')(self) - @property def timezone(self): return pytz_deprecation_shim.timezone(self.settings.timezone)