diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index cad77c7fe..dcbad9d8d 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -117,11 +117,11 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored. !!! tip "Accessing Config Parameters" - Plugin configuration parameters can be accessed in `settings.PLUGINS_CONFIG`, mapped by plugin name. For example: + Plugin configuration parameters can be accessed using the `get_plugin_config()` function. For example: ```python - from django.conf import settings - settings.PLUGINS_CONFIG['myplugin']['verbose_name'] + from extras.plugins import get_plugin_config + get_plugin_config('my_plugin', 'verbose_name') ``` #### Important Notes About `django_apps` diff --git a/netbox/extras/plugins/__init__.py b/netbox/extras/plugins/__init__.py index 6fa22c4a3..7694a1fbe 100644 --- a/netbox/extras/plugins/__init__.py +++ b/netbox/extras/plugins/__init__.py @@ -1,6 +1,7 @@ import collections from django.apps import AppConfig +from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.utils.module_loading import import_string from packaging import version @@ -140,3 +141,23 @@ class PluginConfig(AppConfig): for setting, value in cls.default_settings.items(): if setting not in user_config: user_config[setting] = value + + +# +# Utilities +# + +def get_plugin_config(plugin_name, parameter, default=None): + """ + Return the value of the specified plugin configuration parameter. + + Args: + plugin_name: The name of the plugin + parameter: The name of the configuration parameter + default: The value to return if the parameter is not defined (default: None) + """ + try: + plugin_config = settings.PLUGINS_CONFIG[plugin_name] + return plugin_config.get(parameter, default) + except KeyError: + raise ImproperlyConfigured(f"Plugin {plugin_name} is not registered.") diff --git a/netbox/extras/tests/test_plugins.py b/netbox/extras/tests/test_plugins.py index b65d32702..e20dccbd9 100644 --- a/netbox/extras/tests/test_plugins.py +++ b/netbox/extras/tests/test_plugins.py @@ -5,7 +5,7 @@ from django.core.exceptions import ImproperlyConfigured from django.test import Client, TestCase, override_settings from django.urls import reverse -from extras.plugins import PluginMenu +from extras.plugins import PluginMenu, get_plugin_config from extras.tests.dummy_plugin import config as dummy_config from netbox.graphql.schema import Query from netbox.registry import registry @@ -173,3 +173,13 @@ class PluginTest(TestCase): self.assertIn(DummyQuery, registry['plugins']['graphql_schemas']) self.assertTrue(issubclass(Query, DummyQuery)) + + @override_settings(PLUGINS_CONFIG={'extras.tests.dummy_plugin': {'foo': 123}}) + def test_get_plugin_config(self): + """ + Validate that get_plugin_config() returns config parameters correctly. + """ + plugin = 'extras.tests.dummy_plugin' + self.assertEqual(get_plugin_config(plugin, 'foo'), 123) + self.assertEqual(get_plugin_config(plugin, 'bar'), None) + self.assertEqual(get_plugin_config(plugin, 'bar', default=456), 456)