From fcbb8c9112ce1da30116ce7464c0e012ee21e263 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jul 2024 10:03:12 -0400 Subject: [PATCH 1/3] Tweak table columns --- netbox/core/tables/plugins.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/netbox/core/tables/plugins.py b/netbox/core/tables/plugins.py index 04f7e6219..f88eba9b8 100644 --- a/netbox/core/tables/plugins.py +++ b/netbox/core/tables/plugins.py @@ -1,8 +1,7 @@ -from datetime import datetime import django_tables2 as tables -from django.contrib.humanize.templatetags.humanize import naturalday from django.utils.translation import gettext_lazy as _ -from netbox.tables import BaseTable + +from netbox.tables import BaseTable, columns __all__ = ( 'CatalogPluginTable', @@ -14,8 +13,9 @@ class PluginVersionTable(BaseTable): version = tables.Column( verbose_name=_('Version') ) - last_updated = tables.Column( + last_updated = columns.DateTimeColumn( accessor=tables.A('date'), + timespec='minutes', verbose_name=_('Last Updated') ) min_version = tables.Column( @@ -37,9 +37,6 @@ class PluginVersionTable(BaseTable): ) orderable = False - def render_last_updated(self, value, record): - return naturalday(value) - class CatalogPluginTable(BaseTable): name = tables.Column( @@ -49,19 +46,19 @@ class CatalogPluginTable(BaseTable): author = tables.Column( verbose_name=_('Author') ) - is_local = tables.BooleanColumn( + is_local = columns.BooleanColumn( verbose_name=_('Local') ) - is_installed = tables.BooleanColumn( + is_installed = columns.BooleanColumn( verbose_name=_('Installed') ) - is_certified = tables.BooleanColumn( + is_certified = columns.BooleanColumn( verbose_name=_('Certified') ) - created = tables.Column( + created = columns.DateTimeColumn( verbose_name=_('Published') ) - updated = tables.Column( + updated = columns.DateTimeColumn( verbose_name=_('Updated') ) From 62287662d53fc9bdc5456b07525983aa8797f08c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jul 2024 10:09:48 -0400 Subject: [PATCH 2/3] Use is_staff (for now) to evaluate user permission for plugin views --- netbox/core/views.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index fa8c18a1b..1c743da29 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -2,7 +2,6 @@ import json import platform from django import __version__ as DJANGO_VERSION -from django.apps import apps from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import UserPassesTestMixin @@ -26,7 +25,6 @@ from rq.worker import Worker from rq.worker_registration import clean_worker_registry from netbox.config import get_config, PARAMS -from netbox.plugins import PluginConfig from netbox.views import generic from netbox.views.generic.base import BaseObjectView from netbox.views.generic.mixins import TableMixin @@ -649,7 +647,7 @@ class SystemView(UserPassesTestMixin, View): class PluginListView(UserPassesTestMixin, View): def test_func(self): - return self.request.user.is_superuser + return self.request.user.is_staff def get(self, request): q = request.GET.get('q', None) From b31eb0371d50019e103994dac47131d288b84f66 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jul 2024 10:28:35 -0400 Subject: [PATCH 3/3] Use table for ordering --- netbox/core/tables/plugins.py | 3 +++ netbox/core/views.py | 14 ++------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/netbox/core/tables/plugins.py b/netbox/core/tables/plugins.py index f88eba9b8..623638607 100644 --- a/netbox/core/tables/plugins.py +++ b/netbox/core/tables/plugins.py @@ -70,3 +70,6 @@ class CatalogPluginTable(BaseTable): default_columns = ( 'name', 'author', 'is_local', 'is_installed', 'is_certified', 'created', 'updated', ) + # List installed plugins first, then certified plugins, then + # everything else (with each tranche ordered alphabetically) + order_by = ('-is_installed', '-is_certified', 'name') diff --git a/netbox/core/views.py b/netbox/core/views.py index 1c743da29..761a83daf 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -582,7 +582,7 @@ class WorkerView(BaseRQView): # -# Plugins +# System # class SystemView(UserPassesTestMixin, View): @@ -652,20 +652,10 @@ class PluginListView(UserPassesTestMixin, View): def get(self, request): q = request.GET.get('q', None) - plugins = get_plugins() - plugins = plugins.values() + plugins = get_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.configure(request)