diff --git a/src/octoprint/plugin/__init__.py b/src/octoprint/plugin/__init__.py index a8736c4c..bab1350a 100644 --- a/src/octoprint/plugin/__init__.py +++ b/src/octoprint/plugin/__init__.py @@ -145,7 +145,7 @@ def plugin_settings(plugin_key, defaults=None, get_preprocessors=None, set_prepr Arguments: plugin_key (string): The plugin identifier for which to create the settings instance. - defaults (dict): The default settings for the plugin. + defaults (dict): The default settings for the plugin, if different from get_settings_defaults. get_preprocessors (dict): The getter preprocessors for the plugin. set_preprocessors (dict): The setter preprocessors for the plugin. settings (octoprint.settings.Settings): The settings instance to use. @@ -180,13 +180,12 @@ def plugin_settings_for_settings_plugin(plugin_key, instance, settings=None): return None try: - defaults = instance.get_settings_defaults() get_preprocessors, set_preprocessors = instance.get_settings_preprocessors() except: - logging.getLogger(__name__).exception("Error while retrieving defaults or preprocessors for plugin {}".format(plugin_key)) + logging.getLogger(__name__).exception("Error while retrieving preprocessors for plugin {}".format(plugin_key)) return None - return plugin_settings(plugin_key, defaults=defaults, get_preprocessors=get_preprocessors, set_preprocessors=set_preprocessors, settings=settings) + return plugin_settings(plugin_key, get_preprocessors=get_preprocessors, set_preprocessors=set_preprocessors, settings=settings) def call_plugin(types, method, args=None, kwargs=None, callback=None, error_callback=None, sorting_context=None): @@ -315,11 +314,12 @@ class PluginSettings(object): self.settings = settings self.plugin_key = plugin_key - if defaults is None: - defaults = dict() - self.defaults = dict(plugins=dict()) - self.defaults["plugins"][plugin_key] = defaults - self.defaults["plugins"][plugin_key]["_config_version"] = None + if defaults is not None: + self.defaults = dict(plugins=dict()) + self.defaults["plugins"][plugin_key] = defaults + self.defaults["plugins"][plugin_key]["_config_version"] = None + else: + self.defaults = None if get_preprocessors is None: get_preprocessors = dict() @@ -345,14 +345,14 @@ class PluginSettings(object): return result def add_getter_kwargs(kwargs): - if not "defaults" in kwargs: + if not "defaults" in kwargs and self.defaults is not None: kwargs.update(defaults=self.defaults) if not "preprocessors" in kwargs: kwargs.update(preprocessors=self.get_preprocessors) return kwargs def add_setter_kwargs(kwargs): - if not "defaults" in kwargs: + if not "defaults" in kwargs and self.defaults is not None: kwargs.update(defaults=self.defaults) if not "preprocessors" in kwargs: kwargs.update(preprocessors=self.set_preprocessors) diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index b90ab21e..14009965 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -245,7 +245,14 @@ class Server(object): return props def settings_plugin_inject_factory(name, implementation): - """Factory for additional injections depending on plugin type""" + """Factory for additional injections/initializations depending on plugin type""" + if not isinstance(implementation, octoprint.plugin.SettingsPlugin): + return + + default_settings_overlay = dict(plugins=dict()) + default_settings_overlay["plugins"][name] = implementation.get_settings_defaults() + self._settings.add_overlay(default_settings_overlay, at_end=True) + plugin_settings = octoprint.plugin.plugin_settings_for_settings_plugin(name, implementation) if plugin_settings is None: return @@ -272,7 +279,8 @@ class Server(object): implementation.on_settings_initialized() - pluginManager.implementation_inject_factories=[octoprint_plugin_inject_factory, settings_plugin_inject_factory] + pluginManager.implementation_inject_factories=[octoprint_plugin_inject_factory, + settings_plugin_inject_factory] pluginManager.initialize_implementations() settingsPlugins = pluginManager.get_implementations(octoprint.plugin.SettingsPlugin) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 23f03066..d5f8dd2e 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -829,8 +829,12 @@ class Settings(object): self._migrate_config(config) return config - def add_overlay(self, overlay): - self._map.maps.insert(1, overlay) + def add_overlay(self, overlay, at_end=False): + if at_end: + pos = len(self._map.maps) - 1 + self._map.maps.insert(pos, overlay) + else: + self._map.maps.insert(1, overlay) def _migrate_config(self, config=None): if config is None: