From 75417c9cd5a9775b072855827baca43786d5b53e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 3 Feb 2025 13:37:58 -0500 Subject: [PATCH] Closes #17587: Add release_track attribute to PluginConfig --- docs/plugins/development/index.md | 1 + netbox/core/plugins.py | 5 ++++- netbox/netbox/plugins/__init__.py | 1 + netbox/netbox/plugins/utils.py | 5 ++++- netbox/netbox/plugins/views.py | 3 ++- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index 246816349..ee8ba1118 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -103,6 +103,7 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i | `name` | Raw plugin name; same as the plugin's source directory | | `verbose_name` | Human-friendly name for the plugin | | `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | +| `release_track` | An alternate release track (e.g. `dev` or `beta`) to which a release belongs | | `description` | Brief description of the plugin's purpose | | `author` | Name of plugin's author | | `author_email` | Author's public email address | diff --git a/netbox/core/plugins.py b/netbox/core/plugins.py index 7da197a70..e6d09711f 100644 --- a/netbox/core/plugins.py +++ b/netbox/core/plugins.py @@ -80,6 +80,9 @@ def get_local_plugins(plugins=None): for plugin_name in registry['plugins']['installed']: plugin = importlib.import_module(plugin_name) plugin_config: PluginConfig = plugin.config + installed_version = plugin_config.version + if plugin_config.release_track: + installed_version = f'{installed_version}-{plugin_config.release_track}' local_plugins[plugin_config.name] = Plugin( config_name=plugin_config.name, @@ -89,7 +92,7 @@ def get_local_plugins(plugins=None): description_short=plugin_config.description, is_local=True, is_installed=True, - installed_version=plugin_config.version, + installed_version=installed_version, ) # Update catalog entries for local plugins, or add them to the list if not listed diff --git a/netbox/netbox/plugins/__init__.py b/netbox/netbox/plugins/__init__.py index f339f9d51..bb3280ac4 100644 --- a/netbox/netbox/plugins/__init__.py +++ b/netbox/netbox/plugins/__init__.py @@ -48,6 +48,7 @@ class PluginConfig(AppConfig): author_email = '' description = '' version = '' + release_track = '' # Root URL path under /plugins. If not set, the plugin's label will be used. base_url = None diff --git a/netbox/netbox/plugins/utils.py b/netbox/netbox/plugins/utils.py index 435afff6f..886292274 100644 --- a/netbox/netbox/plugins/utils.py +++ b/netbox/netbox/plugins/utils.py @@ -18,7 +18,10 @@ def get_installed_plugins(): for plugin_name in registry['plugins']['installed']: plugin_name = plugin_name.rsplit('.', 1)[-1] plugin_config = apps.get_app_config(plugin_name) - plugins[plugin_name] = getattr(plugin_config, 'version', None) + if plugin_config.release_track: + plugins[plugin_name] = f'{plugin_config.version}-{plugin_config.release_track}' + else: + plugins[plugin_name] = plugin_config.version or None return dict(sorted(plugins.items())) diff --git a/netbox/netbox/plugins/views.py b/netbox/netbox/plugins/views.py index 7044b6ea0..feee78e82 100644 --- a/netbox/netbox/plugins/views.py +++ b/netbox/netbox/plugins/views.py @@ -31,7 +31,8 @@ class InstalledPluginsAPIView(APIView): 'author': plugin_app_config.author, 'author_email': plugin_app_config.author_email, 'description': plugin_app_config.description, - 'version': plugin_app_config.version + 'version': plugin_app_config.version, + 'release_track': plugin_app_config.release_track, } def get(self, request, format=None):