From 2e2851dc13d73352530dd4495c7e05603b2e520d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 23:38:38 +0200 Subject: Adding upstream version 2.1.2~dev0+20240219. Signed-off-by: Daniel Baumann --- deluge/ui/web/pluginmanager.py | 153 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 deluge/ui/web/pluginmanager.py (limited to 'deluge/ui/web/pluginmanager.py') diff --git a/deluge/ui/web/pluginmanager.py b/deluge/ui/web/pluginmanager.py new file mode 100644 index 0000000..2da5b61 --- /dev/null +++ b/deluge/ui/web/pluginmanager.py @@ -0,0 +1,153 @@ +# +# Copyright (C) 2009 Damien Churchill +# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. +# + +import logging +import os + +from deluge import component +from deluge.configmanager import ConfigManager +from deluge.pluginmanagerbase import PluginManagerBase +from deluge.ui.client import client + +log = logging.getLogger(__name__) + + +def gather_info(plugin): + # Get the scripts for the plugin + scripts = getattr(plugin, 'scripts', ()) + debug_scripts = getattr(plugin, 'debug_scripts') or scripts + + directories = [] + for script in scripts + debug_scripts: + if os.path.dirname(script) not in directories: + directories.append(os.path.dirname(script)) + + return { + 'scripts': scripts, + 'debug_scripts': debug_scripts, + 'script_directories': directories, + } + + +class PluginManager(PluginManagerBase, component.Component): + def __init__(self): + component.Component.__init__(self, 'Web.PluginManager') + self.config = ConfigManager('web.conf') + PluginManagerBase.__init__(self, 'web.conf', 'deluge.plugin.web') + + client.register_event_handler( + 'PluginEnabledEvent', self._on_plugin_enabled_event + ) + client.register_event_handler( + 'PluginDisabledEvent', self._on_plugin_disabled_event + ) + + def _on_get_enabled_plugins(self, plugins): + for plugin in plugins: + self.enable_plugin(plugin) + + def _on_plugin_enabled_event(self, name): + self.enable_plugin(name) + + def _on_plugin_disabled_event(self, name): + self.disable_plugin(name) + + def disable_plugin(self, name): + # Get the plugin instance + try: + plugin = component.get('WebPlugin.' + name) + except KeyError: + log.debug( + '%s plugin contains no WebUI code, ignoring WebUI disable call.', name + ) + return + + info = gather_info(plugin) + + scripts = component.get('Scripts') + for script in info['scripts']: + scripts.remove_script(f'{name.lower()}/{os.path.basename(script).lower()}') + + for script in info['debug_scripts']: + scripts.remove_script( + f'{name.lower()}/{os.path.basename(script).lower()}', 'debug' + ) + scripts.remove_script( + f'{name.lower()}/{os.path.basename(script).lower()}', 'dev' + ) + + super().disable_plugin(name) + + def enable_plugin(self, name): + super().enable_plugin(name) + + # Get the plugin instance + try: + plugin = component.get('WebPlugin.' + name) + except KeyError: + log.info( + '%s plugin contains no WebUI code, ignoring WebUI enable call.', name + ) + return + + info = gather_info(plugin) + + scripts = component.get('Scripts') + for script in info['scripts']: + log.debug('adding script %s for %s', name, os.path.basename(script)) + scripts.add_script(f'{name.lower()}/{os.path.basename(script)}', script) + + for script in info['debug_scripts']: + log.debug('adding debug script %s for %s', name, os.path.basename(script)) + scripts.add_script( + f'{name.lower()}/{os.path.basename(script)}', script, 'debug' + ) + scripts.add_script( + f'{name.lower()}/{os.path.basename(script)}', script, 'dev' + ) + + def start(self): + """ + Start up the plugin manager + """ + # Update the enabled plugins from the core + d = client.core.get_enabled_plugins() + d.addCallback(self._on_get_enabled_plugins) + + def stop(self): + """ + Stop the plugin manager + """ + self.disable_plugins() + client.deregister_event_handler( + 'PluginEnabledEvent', self._on_plugin_enabled_event + ) + client.deregister_event_handler( + 'PluginDisabledEvent', self._on_plugin_disabled_event + ) + + def update(self): + pass + + def get_plugin_resources(self, name): + # Get the plugin instance + try: + plugin = component.get('WebPlugin.' + name) + except KeyError: + log.info('Plugin has no web ui') + return + info = gather_info(plugin) + info['name'] = name + info['scripts'] = [ + f'js/{name.lower()}/{os.path.basename(s)}' for s in info['scripts'] + ] + info['debug_scripts'] = [ + f'js/{name.lower()}/{os.path.basename(s)}' for s in info['debug_scripts'] + ] + del info['script_directories'] + return info -- cgit v1.2.3