17034 Add error handling to Plugins Catalog API (#17035)

* 17034 add error handling to plugins catalog API

* 17034 refactor from review feedback

* 17034 refactor from review feedback

* Misc cleanup

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson
2024-08-01 21:30:41 +07:00
committed by GitHub
parent bf17485290
commit e32cfdf88c
2 changed files with 104 additions and 89 deletions

View File

@@ -38,7 +38,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
@@ -654,15 +654,31 @@ class SystemView(UserPassesTestMixin, View):
# Plugins
#
class PluginListView(UserPassesTestMixin, View):
class BasePluginView(UserPassesTestMixin, View):
CACHE_KEY_CATALOG_ERROR = 'plugins-catalog-error'
def test_func(self):
return self.request.user.is_staff
def get_cached_plugins(self, request):
catalog_plugins = {}
catalog_plugins_error = cache.get(self.CACHE_KEY_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(self.CACHE_KEY_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().values()
plugins = self.get_cached_plugins(request).values()
if q:
plugins = [obj for obj in plugins if q.casefold() in obj.title_short.casefold()]
@@ -680,14 +696,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()
plugins = self.get_cached_plugins(request)
if name not in plugins:
raise Http404(_("Plugin {name} not found").format(name=name))
plugin = plugins[name]