Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion netbox/core/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.core.cache import cache

from netbox.plugins import PluginConfig
from netbox.registry import registry
from utilities.datetime import datetime_from_timestamp

USER_AGENT_STRING = f'NetBox/{settings.RELEASE.version} {settings.RELEASE.edition}'
Expand Down Expand Up @@ -76,7 +77,7 @@ def get_local_plugins(plugins=None):
local_plugins = {}

# Gather all locally-installed plugins
for plugin_name in settings.PLUGINS:
for plugin_name in registry['plugins']['installed']:
plugin = importlib.import_module(plugin_name)
plugin_config: PluginConfig = plugin.config

Expand Down
3 changes: 2 additions & 1 deletion netbox/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs_from_status, requeue_rq_job, stop_rq_job
from netbox.config import get_config, PARAMS
from netbox.registry import registry
from netbox.views import generic
from netbox.views.generic.base import BaseObjectView
from netbox.views.generic.mixins import TableMixin
Expand Down Expand Up @@ -560,7 +561,7 @@ def get(self, request):
params = [param.name for param in PARAMS]
data = {
**stats,
'plugins': settings.PLUGINS,
'plugins': registry['plugins']['installed'],
'config': {
k: getattr(config, k) for k in sorted(params)
},
Expand Down
1 change: 1 addition & 0 deletions netbox/netbox/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

# Initialize plugin registry
registry['plugins'].update({
'installed': [],
'graphql_schemas': [],
'menus': [],
'menu_items': {},
Expand Down
4 changes: 2 additions & 2 deletions netbox/netbox/plugins/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from importlib import import_module

from django.apps import apps
from django.conf import settings
from django.conf.urls import include
from django.urls import path
from django.utils.module_loading import import_string, module_has_submodule

from netbox.registry import registry
from . import views

plugin_patterns = []
Expand All @@ -15,7 +15,7 @@
]

# Register base/API URL patterns for each plugin
for plugin_path in settings.PLUGINS:
for plugin_path in registry['plugins']['installed']:
plugin = import_module(plugin_path)
plugin_name = plugin_path.split('.')[-1]
app = apps.get_app_config(plugin_name)
Expand Down
4 changes: 3 additions & 1 deletion netbox/netbox/plugins/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured

from netbox.registry import registry

__all__ = (
'get_installed_plugins',
'get_plugin_config',
Expand All @@ -13,7 +15,7 @@ def get_installed_plugins():
Return a dictionary mapping the names of installed plugins to their versions.
"""
plugins = {}
for plugin_name in settings.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)
Expand Down
10 changes: 7 additions & 3 deletions netbox/netbox/plugins/views.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
from collections import OrderedDict

from django.apps import apps
from django.conf import settings
from django.urls.exceptions import NoReverseMatch
from drf_spectacular.utils import extend_schema
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.views import APIView

from netbox.registry import registry


@extend_schema(exclude=True)
class InstalledPluginsAPIView(APIView):
Expand All @@ -34,7 +35,10 @@ def _get_plugin_data(plugin_app_config):
}

def get(self, request, format=None):
return Response([self._get_plugin_data(apps.get_app_config(plugin)) for plugin in settings.PLUGINS])
return Response([
self._get_plugin_data(apps.get_app_config(plugin))
for plugin in registry['plugins']['installed']
])


@extend_schema(exclude=True)
Expand Down Expand Up @@ -64,7 +68,7 @@ def _get_plugin_entry(plugin, app_config, request, format):
def get(self, request, format=None):

entries = []
for plugin in settings.PLUGINS:
for plugin in registry['plugins']['installed']:
app_config = apps.get_app_config(plugin)
entry = self._get_plugin_entry(plugin, app_config, request, format)
if entry is not None:
Expand Down
4 changes: 4 additions & 0 deletions netbox/netbox/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from netbox.config import PARAMS as CONFIG_PARAMS
from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW
from netbox.plugins import PluginConfig
from netbox.registry import registry
from utilities.release import load_release_data
from utilities.string import trailing_slash

Expand Down Expand Up @@ -813,6 +814,9 @@ def _setting(name, default=None):
f"__init__.py file and point to the PluginConfig subclass."
)

# Register the plugin as installed successfully
registry['plugins']['installed'].append(plugin_name)

plugin_module = "{}.{}".format(plugin_config.__module__, plugin_config.__name__) # type: ignore

# Gather additional apps to load alongside this plugin
Expand Down