17034 refactor from review feedback

This commit is contained in:
Arthur Hanson 2024-07-31 20:46:58 +07:00
parent f53ff24885
commit 0440e7e7b9
3 changed files with 96 additions and 92 deletions

View File

@ -69,16 +69,16 @@ class Plugin:
installed_version: str = ''
def get_local_plugins():
def get_local_plugins(plugins):
"""
Return a dictionary of all locally-installed plugins, mapped by name.
"""
plugins = {}
local_plugins = {}
for plugin_name in settings.PLUGINS:
plugin = importlib.import_module(plugin_name)
plugin_config: PluginConfig = plugin.config
plugins[plugin_config.name] = Plugin(
local_plugins[plugin_config.name] = Plugin(
slug=plugin_config.name,
title_short=plugin_config.verbose_name,
tag_line=plugin_config.description,
@ -88,6 +88,13 @@ def get_local_plugins():
installed_version=plugin_config.version,
)
for k, v in local_plugins.items():
if k in plugins:
plugins[k].is_local = True
plugins[k].is_installed = True
else:
plugins[k] = v
return plugins
@ -96,7 +103,6 @@ def get_catalog_plugins():
Return a dictionary of all entries in the plugins catalog, mapped by name.
"""
session = requests.Session()
plugins = {}
def get_pages():
# TODO: pagination is currently broken in API
@ -122,6 +128,9 @@ def get_catalog_plugins():
).json()
yield next_page
def make_plugin_dict():
plugins = {}
for page in get_pages():
for data in page['data']:
@ -187,29 +196,12 @@ def get_catalog_plugins():
return plugins
def get_plugins(request):
"""
Return a dictionary of all plugins (both catalog and locally installed), mapped by name.
"""
local_plugins = get_local_plugins()
catalog_plugins = cache.get('plugins-catalog-feed', default={})
catalog_plugins_error = cache.get('plugins-catalog-error', default=False)
if not catalog_plugins and not catalog_plugins_error:
if not catalog_plugins:
try:
catalog_plugins = get_catalog_plugins()
catalog_plugins = make_plugin_dict()
cache.set('plugins-catalog-feed', catalog_plugins, 3600)
except requests.exceptions.RequestException:
# Cache for 15 minutes to avoid spamming connection
cache.set('plugins-catalog-error', True, 900)
messages.warning(request, _("Plugins catalog could not be loaded"))
pass
plugins = catalog_plugins
for k, v in local_plugins.items():
if k in plugins:
plugins[k].is_local = True
plugins[k].is_installed = True
else:
plugins[k] = v
return plugins
return catalog_plugins

View File

@ -37,7 +37,7 @@ from . import filtersets, forms, tables
from .choices import DataSourceStatusChoices
from .jobs import SyncDataSourceJob
from .models import *
from .plugins import get_plugins
from .plugins import get_catalog_plugins, get_local_plugins
from .tables import CatalogPluginTable, PluginVersionTable
@ -650,15 +650,30 @@ class SystemView(UserPassesTestMixin, View):
# Plugins
#
class PluginListView(UserPassesTestMixin, View):
class BasePluginView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.is_staff
def get_cached_plugins(self, request):
catalog_plugins = {}
catalog_plugins_error = cache.get('plugins-catalog-error', default=False)
if not catalog_plugins_error:
catalog_plugins = get_catalog_plugins()
if not catalog_plugins:
# Cache for 5 minutes to avoid spamming connection
cache.set('plugins-catalog-error', True, 300)
messages.warning(request, _("Plugins catalog could not be loaded"))
return get_local_plugins(catalog_plugins)
class PluginListView(BasePluginView):
def get(self, request):
q = request.GET.get('q', None)
plugins = get_plugins(request).values()
plugins = self.get_cached_plugins(request).values()
if q:
plugins = [obj for obj in plugins if q.casefold() in obj.title_short.casefold()]
@ -676,14 +691,11 @@ class PluginListView(UserPassesTestMixin, View):
})
class PluginView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.is_staff
class PluginView(BasePluginView):
def get(self, request, name):
plugins = get_plugins(request)
plugins = self.get_cached_plugins(request)
if name not in plugins:
raise Http404(_("Plugin {name} not found").format(name=name))
plugin = plugins[name]

View File

@ -774,7 +774,7 @@ STRAWBERRY_DJANGO = {
# Plugins
#
PLUGIN_CATALOG_URL = 'https://api.netbox.oss.netboxlabs.com/v1/plugins'
PLUGIN_CATALOG_URL = 'httpxs://api.netbox.oss.netboxlabs.com/v1/plugins'
# Register any configured plugins
for plugin_name in PLUGINS: