diff --git a/netbox/core/tables/plugins.py b/netbox/core/tables/plugins.py index 29b251897..4f1d6b83a 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): title_short = tables.Column( @@ -50,19 +47,19 @@ class CatalogPluginTable(BaseTable): accessor=tables.A('author.name'), 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_at = tables.Column( + created_at = columns.DateTimeColumn( verbose_name=_('Published') ) - updated_at = tables.Column( + updated_at = columns.DateTimeColumn( verbose_name=_('Updated') ) @@ -74,3 +71,6 @@ class CatalogPluginTable(BaseTable): default_columns = ( 'title_short', 'author', 'is_local', 'is_installed', 'is_certified', 'created_at', 'updated_at', ) + # 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 e96b8bc48..88821de75 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 @@ -584,7 +582,7 @@ class WorkerView(BaseRQView): # -# Plugins +# System # class SystemView(UserPassesTestMixin, View): @@ -649,25 +647,15 @@ 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) - 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.title_short, 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)