From b704ae198370afdac3b1dcaa838471c195fb1c39 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Aug 2025 09:54:25 -0400 Subject: [PATCH] Closes #19773: Extend system view --- netbox/core/tests/test_views.py | 6 + netbox/core/views.py | 24 +++- netbox/templates/core/system.html | 183 ++++++++++++++++++++---------- 3 files changed, 146 insertions(+), 67 deletions(-) diff --git a/netbox/core/tests/test_views.py b/netbox/core/tests/test_views.py index 96a4292df..1001243eb 100644 --- a/netbox/core/tests/test_views.py +++ b/netbox/core/tests/test_views.py @@ -1,3 +1,4 @@ +import json import urllib.parse import uuid from datetime import datetime @@ -366,6 +367,11 @@ class SystemTestCase(TestCase): # Test export response = self.client.get(f"{reverse('core:system')}?export=true") self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertIn('netbox_release', data) + self.assertIn('plugins', data) + self.assertIn('config', data) + self.assertIn('objects', data) def test_system_view_with_config_revision(self): ConfigRevision.objects.create() diff --git a/netbox/core/views.py b/netbox/core/views.py index 31d60dee6..2044e56c7 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -1,7 +1,7 @@ import json import platform -from django import __version__ as DJANGO_VERSION +from django import __version__ as django_version from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import UserPassesTestMixin @@ -23,7 +23,7 @@ from rq.worker_registration import clean_worker_registry from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs_from_status, requeue_rq_job, stop_rq_job from netbox.config import get_config, PARAMS from netbox.object_actions import AddObject, BulkDelete, BulkExport, DeleteObject -from netbox.registry import registry +from netbox.plugins.utils import get_installed_plugins from netbox.views import generic from netbox.views.generic.base import BaseObjectView from netbox.views.generic.mixins import TableMixin @@ -546,7 +546,7 @@ class SystemView(UserPassesTestMixin, View): def get(self, request): - # System stats + # System status psql_version = db_name = db_size = None try: with connection.cursor() as cursor: @@ -561,7 +561,7 @@ class SystemView(UserPassesTestMixin, View): pass stats = { 'netbox_release': settings.RELEASE, - 'django_version': DJANGO_VERSION, + 'django_version': django_version, 'python_version': platform.python_version(), 'postgresql_version': psql_version, 'database_name': db_name, @@ -572,16 +572,28 @@ class SystemView(UserPassesTestMixin, View): # Configuration config = get_config() + # Plugins + plugins = get_installed_plugins() + + # Object counts + objects = {} + for ot in ObjectType.objects.public().order_by('app_label', 'model'): + if model := ot.model_class(): + objects[ot] = model.objects.count() + # Raw data export if 'export' in request.GET: stats['netbox_release'] = stats['netbox_release'].asdict() params = [param.name for param in PARAMS] data = { **stats, - 'plugins': registry['plugins']['installed'], + 'plugins': plugins, 'config': { k: getattr(config, k) for k in sorted(params) }, + 'objects': { + f'{ot.app_label}.{ot.model}': count for ot, count in objects.items() + }, } response = HttpResponse(json.dumps(data, cls=ConfigJSONEncoder, indent=4), content_type='text/json') response['Content-Disposition'] = 'attachment; filename="netbox.json"' @@ -595,6 +607,8 @@ class SystemView(UserPassesTestMixin, View): return render(request, 'core/system.html', { 'stats': stats, 'config': config, + 'plugins': plugins, + 'objects': objects, }) diff --git a/netbox/templates/core/system.html b/netbox/templates/core/system.html index fce91f601..1e2914b3c 100644 --- a/netbox/templates/core/system.html +++ b/netbox/templates/core/system.html @@ -8,82 +8,141 @@ {% block controls %} - {% trans "Export" %} + {% trans "Export All" %} {% endblock controls %} {% block tabs %} -