From eb9a804914ec2e1a550a19e13b0a24747c93a2ea Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 30 Aug 2023 11:13:56 -0400 Subject: [PATCH] #12591: Add a dedicated view for the active config revision --- netbox/core/urls.py | 3 + netbox/core/views.py | 12 ++++ netbox/extras/forms/model_forms.py | 6 +- netbox/extras/models/models.py | 9 +-- netbox/netbox/config/parameters.py | 2 - netbox/netbox/navigation/menu.py | 5 ++ netbox/templates/extras/configrevision.html | 74 ++++++++++----------- 7 files changed, 66 insertions(+), 45 deletions(-) diff --git a/netbox/core/urls.py b/netbox/core/urls.py index 1bd56c92b..f17a50c81 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -25,4 +25,7 @@ urlpatterns = ( path('jobs//', views.JobView.as_view(), name='job'), path('jobs//delete/', views.JobDeleteView.as_view(), name='job_delete'), + # Configuration + path('config/', views.ConfigView.as_view(), name='config'), + ) diff --git a/netbox/core/views.py b/netbox/core/views.py index d3dc2b1c2..c7c593770 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -1,6 +1,7 @@ from django.contrib import messages from django.shortcuts import get_object_or_404, redirect +from extras.models import ConfigRevision from netbox.views import generic from netbox.views.generic.base import BaseObjectView from utilities.utils import count_related @@ -141,3 +142,14 @@ class JobBulkDeleteView(generic.BulkDeleteView): queryset = Job.objects.all() filterset = filtersets.JobFilterSet table = tables.JobTable + + +# +# Config Revisions +# + +class ConfigView(generic.ObjectView): + queryset = ConfigRevision.objects.all() + + def get_object(self, **kwargs): + return self.queryset.first() diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 47bde65f9..d4e59c170 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -490,7 +490,9 @@ class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMe (_('Pagination'), ('PAGINATE_COUNT', 'MAX_PAGE_SIZE')), (_('Validation'), ('CUSTOM_VALIDATORS',)), (_('User Preferences'), ('DEFAULT_USER_PREFERENCES',)), - (_('Miscellaneous'), ('MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', 'MAPS_URL')), + (_('Miscellaneous'), ( + 'MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', 'MAPS_URL', + )), (_('Config Revision'), ('comment',)) ) @@ -524,6 +526,8 @@ class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMe elif value == param.default: help_text += _(' (default)') self.fields[param.name].help_text = help_text + if type(value) in (tuple, list): + value = ', '.join(value) self.fields[param.name].initial = value if is_static: self.fields[param.name].disabled = True diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 54832b3ba..91940d66e 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -1,7 +1,6 @@ import json import urllib.parse -from django.contrib import admin from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -12,7 +11,7 @@ from django.http import HttpResponse from django.urls import reverse from django.utils import timezone from django.utils.formats import date_format -from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from rest_framework.utils.encoders import JSONEncoder from extras.choices import * @@ -724,7 +723,9 @@ class ConfigRevision(models.Model): verbose_name_plural = _('config revisions') def __str__(self): - return f'Config revision #{self.pk} ({self.created})' + if self.is_active: + return gettext('Current configuration') + return gettext('Config revision #{id}').format(id=self.pk) def __getattr__(self, item): if item in self.data: @@ -742,6 +743,6 @@ class ConfigRevision(models.Model): cache.set('config_version', self.pk, None) activate.alters_data = True - @admin.display(boolean=True) + @property def is_active(self): return cache.get('config_version') == self.pk diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index 9c613217c..8be5c97a9 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -102,7 +102,6 @@ PARAMS = ( description=_("Default voltage for powerfeeds"), field=forms.IntegerField ), - ConfigParam( name='POWERFEED_DEFAULT_AMPERAGE', label=_('Powerfeed amperage'), @@ -110,7 +109,6 @@ PARAMS = ( description=_("Default amperage for powerfeeds"), field=forms.IntegerField ), - ConfigParam( name='POWERFEED_DEFAULT_MAX_UTILIZATION', label=_('Powerfeed max utilization'), diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 6b883c838..5c7502a03 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -406,6 +406,11 @@ ADMIN_MENU = Menu( MenuGroup( label=_('Configuration'), items=( + MenuItem( + link='core:config', + link_text=_('Current Config'), + permissions=['extras.view_configrevision'] + ), MenuItem( link='extras:configrevision_list', link_text=_('Config Revisions'), diff --git a/netbox/templates/extras/configrevision.html b/netbox/templates/extras/configrevision.html index ea3962b20..5937e842a 100644 --- a/netbox/templates/extras/configrevision.html +++ b/netbox/templates/extras/configrevision.html @@ -14,6 +14,13 @@
{% plugin_buttons object %} + {% if object.is_active and perms.extras.add_configrevision %} + {% url 'extras:configrevision_add' as edit_url %} + {% include "buttons/edit.html" with url=edit_url %} + {% endif %} + {% if not object.is_active and perms.extras.delete_configrevision %} + {% delete_button object %} + {% endif %}
{% custom_links object %} @@ -23,17 +30,17 @@ {% block content %}
-
+
-
{% trans "Rack Elevation" %}
+
{% trans "Rack Elevations" %}
- + - +
{% trans "Rack elevation default unit height" %}:{% trans "Default unit height" %} {{ object.data.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT }}
{% trans "Rack elevation default unit width" %}:{% trans "Default unit width" %} {{ object.data.RACK_ELEVATION_DEFAULT_UNIT_WIDTH }}
@@ -41,19 +48,19 @@
-
{% trans "Power" %}
+
{% trans "Power Feeds" %}
- + - + - +
{% trans "Powerfeed default voltage" %}:{% trans "Default voltage" %} {{ object.data.POWERFEED_DEFAULT_VOLTAGE }}
{% trans "Powerfeed default amperage" %}:{% trans "Default amperage" %} {{ object.data.POWERFEED_DEFAULT_AMPERAGE }}
{% trans "Powerfeed default max utilization" %}:{% trans "Default max utilization" %} {{ object.data.POWERFEED_DEFAULT_MAX_UTILIZATION }}
@@ -65,11 +72,11 @@
- + - +
{% trans "Enforce global unique" %}:{% trans "Enforce global unique" %} {{ object.data.ENFORCE_GLOBAL_UNIQUE }}
{% trans "Prefer IPv4" %}:{% trans "Prefer IPv4" %} {{ object.data.PREFER_IPV4 }}
@@ -81,8 +88,8 @@
- - + +
{% trans "Allowed URL schemes" %}:{{ object.data.ALLOWED_URL_SCHEMES }}{% trans "Allowed URL schemes" %}{{ object.data.ALLOWED_URL_SCHEMES|join:", "|placeholder }}
@@ -93,39 +100,35 @@
- + - + - + - +
{% trans "Login banner" %}:{% trans "Login banner" %} {{ object.data.BANNER_LOGIN }}
{% trans "Maintenance banner" %}:{% trans "Maintenance banner" %} {{ object.data.BANNER_MAINTENANCE }}
{% trans "Top banner" %}:{% trans "Top banner" %} {{ object.data.BANNER_TOP }}
{% trans "Bottom banner" %}:{% trans "Bottom banner" %} {{ object.data.BANNER_BOTTOM }}
- -
-
-
{% trans "Pagination" %}
- + - +
{% trans "Paginate count" %}:{% trans "Paginate count" %} {{ object.data.PAGINATE_COUNT }}
{% trans "Max page size" %}:{% trans "Max page size" %} {{ object.data.MAX_PAGE_SIZE }}
@@ -137,8 +140,8 @@
- - + +
{% trans "Custom validators" %}:{{ object.data.CUSTOM_VALIDATORS }}{% trans "Custom validators" %}{{ object.data.CUSTOM_VALIDATORS|placeholder }}
@@ -149,8 +152,8 @@
- - + +
{% trans "Default user preferences" %}:{{ object.data.DEFAULT_USER_PREFERENCES }}{% trans "Default user preferences" %}{{ object.data.DEFAULT_USER_PREFERENCES|placeholder }}
@@ -161,23 +164,23 @@
- + - + - + - + - +
{% trans "Maintenance mode" %}:{% trans "Maintenance mode" %} {{ object.data.MAINTENANCE_MODE }}
{% trans "GraphQL enabled" %}:{% trans "GraphQL enabled" %} {{ object.data.GRAPHQL_ENABLED }}
{% trans "Changelog retention" %}:{% trans "Changelog retention" %} {{ object.data.CHANGELOG_RETENTION }}
{% trans "Job retention" %}:{% trans "Job retention" %} {{ object.data.JOB_RETENTION }}
{% trans "Maps URL" %}:{% trans "Maps URL" %} {{ object.data.MAPS_URL }}
@@ -185,14 +188,9 @@
-
{% trans "Config Revision" %}
+
{% trans "Comment" %}
- - - - - -
{% trans "Comment" %}:{{ object.comment }}
+ {{ object.comment|placeholder }}