17034 add error handling to plugins catalog API

This commit is contained in:
Arthur Hanson 2024-07-31 14:49:08 +07:00
parent 954eadcdc5
commit f53ff24885
2 changed files with 14 additions and 7 deletions

View File

@ -5,6 +5,7 @@ from dataclasses import dataclass, field
from typing import Optional
import requests
from django.contrib import messages
from django.conf import settings
from django.core.cache import cache
from django.utils.translation import gettext_lazy as _
@ -187,15 +188,21 @@ def get_catalog_plugins():
return plugins
def get_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')
if not catalog_plugins:
catalog_plugins = get_catalog_plugins()
cache.set('plugins-catalog-feed', catalog_plugins, 3600)
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:
try:
catalog_plugins = get_catalog_plugins()
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"))
plugins = catalog_plugins
for k, v in local_plugins.items():

View File

@ -658,7 +658,7 @@ class PluginListView(UserPassesTestMixin, View):
def get(self, request):
q = request.GET.get('q', None)
plugins = get_plugins().values()
plugins = get_plugins(request).values()
if q:
plugins = [obj for obj in plugins if q.casefold() in obj.title_short.casefold()]
@ -683,7 +683,7 @@ class PluginView(UserPassesTestMixin, View):
def get(self, request, name):
plugins = get_plugins()
plugins = get_plugins(request)
if name not in plugins:
raise Http404(_("Plugin {name} not found").format(name=name))
plugin = plugins[name]