14731 review changes

This commit is contained in:
Arthur Hanson 2024-07-17 15:21:32 +07:00
parent 657b12cc3e
commit 7594ecc790
4 changed files with 90 additions and 76 deletions

View File

@ -32,6 +32,8 @@ class Plugin:
tag_line: str = '' tag_line: str = ''
description_short: str = '' description_short: str = ''
author: str = '' author: str = ''
homepage_url: str = ''
license_type: str = ''
created: datetime.datetime = None created: datetime.datetime = None
updated: datetime.datetime = None updated: datetime.datetime = None
is_local: bool = False is_local: bool = False
@ -41,7 +43,8 @@ class Plugin:
versions: list[PluginVersion] = field(default_factory=list) versions: list[PluginVersion] = field(default_factory=list)
def get_local_plugins(plugins): def get_local_plugins():
plugins = {}
for plugin_name in settings.PLUGINS: for plugin_name in settings.PLUGINS:
plugin = importlib.import_module(plugin_name) plugin = importlib.import_module(plugin_name)
plugin_config: PluginConfig = plugin.config plugin_config: PluginConfig = plugin.config
@ -62,20 +65,20 @@ def get_local_plugins(plugins):
return plugins return plugins
def get_catalog_plugins(plugins): def get_catalog_plugins():
url = 'https://api.netbox.oss.netboxlabs.com/v1/plugins'
session = requests.Session() session = requests.Session()
plugins = {}
def get_pages(): def get_pages():
# TODO: pagintation is curently broken in API # TODO: pagintation is curently broken in API
payload = {'page': '1', 'per_page': '50'} payload = {'page': '1', 'per_page': '50'}
first_page = session.get(url, params=payload).json() first_page = session.get(settings.PLUGIN_CATALOG_URL, params=payload).json()
yield first_page yield first_page
num_pages = first_page['metadata']['pagination']['last_page'] num_pages = first_page['metadata']['pagination']['last_page']
for page in range(2, num_pages + 1): for page in range(2, num_pages + 1):
payload['page'] = page payload['page'] = page
next_page = session.get(url, params=payload).json() next_page = session.get(settings.PLUGIN_CATALOG_URL, params=payload).json()
yield next_page yield next_page
for page in get_pages(): for page in get_pages():
@ -96,12 +99,8 @@ def get_catalog_plugins(plugins):
is_netboxlabs_supported=version['is_netboxlabs_supported'], is_netboxlabs_supported=version['is_netboxlabs_supported'],
) )
) )
versions = sorted(versions, key=lambda x: x.date, reverse=True)
if data['slug'] in plugins:
plugins[data['slug']].is_local = False
plugins[data['slug']].is_certified = data['release_latest']['is_certified']
plugins[data['slug']].description_short = data['description_short']
else:
plugins[data['slug']] = Plugin( plugins[data['slug']] = Plugin(
slug=data['slug'], slug=data['slug'],
config_name=data['config_name'], config_name=data['config_name'],
@ -110,6 +109,8 @@ def get_catalog_plugins(plugins):
tag_line=data['tag_line'], tag_line=data['tag_line'],
description_short=data['description_short'], description_short=data['description_short'],
author=data['author']['name'] or _('Unknown Author'), author=data['author']['name'] or _('Unknown Author'),
homepage_url=data['homepage_url'],
license_type=data['license_type'],
created=datetime_from_timestamp(data['created_at']), created=datetime_from_timestamp(data['created_at']),
updated=datetime_from_timestamp(data['updated_at']), updated=datetime_from_timestamp(data['updated_at']),
is_local=False, is_local=False,
@ -123,12 +124,18 @@ def get_catalog_plugins(plugins):
def get_plugins(): def get_plugins():
if plugins := cache.get('plugins-catalog-feed'): local_plugins = get_local_plugins()
return 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)
plugins = {} plugins = catalog_plugins
plugins = get_local_plugins(plugins) for k, v in local_plugins.items():
plugins = get_catalog_plugins(plugins) if k in plugins:
plugins[k].is_local = True
plugins[k].is_installed = True
else:
plugins[k] = v
cache.set('plugins-catalog-feed', plugins, 3600)
return plugins return plugins

View File

@ -617,12 +617,6 @@ class SystemView(UserPassesTestMixin, View):
'rq_worker_count': Worker.count(get_connection('default')), 'rq_worker_count': Worker.count(get_connection('default')),
} }
# Plugins
plugins = [
# Look up app config by package name
apps.get_app_config(plugin.rsplit('.', 1)[-1]) for plugin in settings.PLUGINS
]
# Configuration # Configuration
try: try:
config = ConfigRevision.objects.get(pk=cache.get('config_version')) config = ConfigRevision.objects.get(pk=cache.get('config_version'))
@ -634,9 +628,6 @@ class SystemView(UserPassesTestMixin, View):
if 'export' in request.GET: if 'export' in request.GET:
data = { data = {
**stats, **stats,
'plugins': {
plugin.name: plugin.version for plugin in plugins
},
'config': { 'config': {
k: config.data[k] for k in sorted(config.data) k: config.data[k] for k in sorted(config.data)
}, },
@ -664,10 +655,18 @@ class PluginListView(UserPassesTestMixin, View):
q = request.GET.get('q', None) q = request.GET.get('q', None)
plugins = get_plugins() plugins = get_plugins()
if q:
plugins = [v for k, v in plugins.items() if q.casefold() in v['name'].casefold()]
else:
plugins = plugins.values() plugins = plugins.values()
if q:
plugins = [obj for obj in plugins if q.casefold() in obj.name.casefold()]
# Sort order should be:
# Installed plugins
# Certified catalog plugins
# Remaining catalog plugins
# With alphabetical sort within each traunch.
plugins = sorted(plugins, key=lambda x: x.name, reverse=False)
plugins = sorted(plugins, key=lambda x: x.is_certified, reverse=True)
plugins = sorted(plugins, key=lambda x: x.is_installed, reverse=True)
table = CatalogPluginTable(plugins, user=request.user) table = CatalogPluginTable(plugins, user=request.user)
table.configure(request) table.configure(request)

View File

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

View File

@ -15,6 +15,8 @@
{% block subtitle %} {% block subtitle %}
<div class="text-secondary fs-5"> <div class="text-secondary fs-5">
{{ plugin.tag_line }} {{ plugin.tag_line }}
<a href="{{ plugin.homepage.url }}" target="_blank">Learn more <i class="mdi mdi-launch"></i></a><br />
<strong>License:</strong> {{ plugin.license_type }}
</div> </div>
{% endblock subtitle %} {% endblock subtitle %}
@ -38,12 +40,14 @@ From
{% trans "Version history" %} {% trans "Version history" %}
</button> </button>
</li> </li>
{% if plugin.is_community %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link" id="install-tab" data-bs-toggle="tab" data-bs-target="#install" type="button" role="tab" aria-controls="object-list" aria-selected="false"> <button class="nav-link" id="install-tab" data-bs-toggle="tab" data-bs-target="#install" type="button" role="tab" aria-controls="object-list" aria-selected="false">
{% trans "Install" %} {% trans "Install" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% endif %}
</ul> </ul>
{% endblock tabs %} {% endblock tabs %}
@ -51,7 +55,7 @@ From
{% block content %} {% block content %}
<div class="tab-pane show active" id="overview" role="tabpanel" aria-labelledby="overview-tab"> <div class="tab-pane show active" id="overview" role="tabpanel" aria-labelledby="overview-tab">
{{ plugin.description_short }} {{ plugin.description_short|markdown }}
</div> </div>
{% if not plugin.is_local %} {% if not plugin.is_local %}
<div class="tab-pane" id="version-history" role="tabpanel" aria-labelledby="version-history-tab"> <div class="tab-pane" id="version-history" role="tabpanel" aria-labelledby="version-history-tab">
@ -62,9 +66,10 @@ From
</div> </div>
</div> </div>
</div> </div>
{% if plugin.is_community %}
<div class="tab-pane" id="install" role="tabpanel" aria-labelledby="install-tab"> <div class="tab-pane" id="install" role="tabpanel" aria-labelledby="install-tab">
<p>You can install this plugin from the command line with PyPi.</p> <p>You can install this plugin from the command line with PyPi.</p>
<p>The following commands may be helpful; always refer to the plugin's own documentation and the Installing a Plugin unit of the NetBox documentation.</p> <p>The following commands may be helpful; always refer to <a href="{{ plugin.homepage_url }}" target="_blank">the plugin's own documentation <i class="mdi mdi-launch"></i></a> and the <a href="https://netboxlabs.com/docs/netbox/en/stable/plugins/installation/" target="_blank">Installing a Plugin unit <i class="mdi mdi-launch"></i></a> of the NetBox documentation.</p>
<p>1. Enter the NetBox virtual environment and install the plugin package:</p> <p>1. Enter the NetBox virtual environment and install the plugin package:</p>
<pre class="block"><code> <pre class="block"><code>
@ -88,4 +93,5 @@ sudo systemctl restart netbox netbox-rq
</code></pre> </code></pre>
</div> </div>
{% endif %} {% endif %}
{% endif %}
{% endblock content %} {% endblock content %}