Skip to content

Commit

Permalink
#12591: Add a dedicated view for the active config revision
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremystretch committed Aug 30, 2023
1 parent 210d7bb commit eb9a804
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 45 deletions.
3 changes: 3 additions & 0 deletions netbox/core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,7 @@
path('jobs/<int:pk>/', views.JobView.as_view(), name='job'),
path('jobs/<int:pk>/delete/', views.JobDeleteView.as_view(), name='job_delete'),

# Configuration
path('config/', views.ConfigView.as_view(), name='config'),

)
12 changes: 12 additions & 0 deletions netbox/core/views.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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()
6 changes: 5 additions & 1 deletion netbox/extras/forms/model_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',))
)

Expand Down Expand Up @@ -524,6 +526,8 @@ def __init__(self, *args, **kwargs):
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
Expand Down
9 changes: 5 additions & 4 deletions netbox/extras/models/models.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -12,7 +11,7 @@
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 *
Expand Down Expand Up @@ -724,7 +723,9 @@ class Meta:
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:
Expand All @@ -742,6 +743,6 @@ def activate(self):
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
2 changes: 0 additions & 2 deletions netbox/netbox/config/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,13 @@ def __init__(self, name, label, default, description='', field=None, field_kwarg
description=_("Default voltage for powerfeeds"),
field=forms.IntegerField
),

ConfigParam(
name='POWERFEED_DEFAULT_AMPERAGE',
label=_('Powerfeed amperage'),
default=15,
description=_("Default amperage for powerfeeds"),
field=forms.IntegerField
),

ConfigParam(
name='POWERFEED_DEFAULT_MAX_UTILIZATION',
label=_('Powerfeed max utilization'),
Expand Down
5 changes: 5 additions & 0 deletions netbox/netbox/navigation/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,11 @@
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'),
Expand Down
74 changes: 36 additions & 38 deletions netbox/templates/extras/configrevision.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
<div class="controls">
<div class="control-group">
{% 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 %}
</div>
<div class="control-group">
{% custom_links object %}
Expand All @@ -23,37 +30,37 @@

{% block content %}
<div class="row">
<div class="col col-md-6">
<div class="col col-md-12">
<div class="card">
<h5 class="card-header">{% trans "Rack Elevation" %}</h5>
<h5 class="card-header">{% trans "Rack Elevations" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Rack elevation default unit height" %}:</th>
<th scope="row">{% trans "Default unit height" %}</th>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT }}</td>
</tr>
<tr>
<th scope="row">{% trans "Rack elevation default unit width" %}:</th>
<th scope="row">{% trans "Default unit width" %}</th>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_WIDTH }}</td>
</tr>
</table>
</div>
</div>

<div class="card">
<h5 class="card-header">{% trans "Power" %}</h5>
<h5 class="card-header">{% trans "Power Feeds" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Powerfeed default voltage" %}:</th>
<th scope="row">{% trans "Default voltage" %}</th>
<td>{{ object.data.POWERFEED_DEFAULT_VOLTAGE }}</td>
</tr>
<tr>
<th scope="row">{% trans "Powerfeed default amperage" %}:</th>
<th scope="row">{% trans "Default amperage" %}</th>
<td>{{ object.data.POWERFEED_DEFAULT_AMPERAGE }}</td>
</tr>
<tr>
<th scope="row">{% trans "Powerfeed default max utilization" %}:</th>
<th scope="row">{% trans "Default max utilization" %}</th>
<td>{{ object.data.POWERFEED_DEFAULT_MAX_UTILIZATION }}</td>
</tr>
</table>
Expand All @@ -65,11 +72,11 @@ <h5 class="card-header">{% trans "IPAM" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Enforce global unique" %}:</th>
<th scope="row">{% trans "Enforce global unique" %}</th>
<td>{{ object.data.ENFORCE_GLOBAL_UNIQUE }}</td>
</tr>
<tr>
<th scope="row">{% trans "Prefer IPv4" %}:</th>
<th scope="row">{% trans "Prefer IPv4" %}</th>
<td>{{ object.data.PREFER_IPV4 }}</td>
</tr>
</table>
Expand All @@ -81,8 +88,8 @@ <h5 class="card-header">{% trans "Security" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Allowed URL schemes" %}:</th>
<td>{{ object.data.ALLOWED_URL_SCHEMES }}</td>
<th scope="row">{% trans "Allowed URL schemes" %}</th>
<td>{{ object.data.ALLOWED_URL_SCHEMES|join:", "|placeholder }}</td>
</tr>
</table>
</div>
Expand All @@ -93,39 +100,35 @@ <h5 class="card-header">{% trans "Banners" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Login banner" %}:</th>
<th scope="row">{% trans "Login banner" %}</th>
<td>{{ object.data.BANNER_LOGIN }}</td>
</tr>
<tr>
<th scope="row">{% trans "Maintenance banner" %}:</th>
<th scope="row">{% trans "Maintenance banner" %}</th>
<td>{{ object.data.BANNER_MAINTENANCE }}</td>
</tr>
<tr>
<th scope="row">{% trans "Top banner" %}:</th>
<th scope="row">{% trans "Top banner" %}</th>
<td>{{ object.data.BANNER_TOP }}</td>
</tr>
<tr>
<th scope="row">{% trans "Bottom banner" %}:</th>
<th scope="row">{% trans "Bottom banner" %}</th>
<td>{{ object.data.BANNER_BOTTOM }}</td>
</tr>
</table>
</div>
</div>


</div>
<div class="col col-md-6">

<div class="card">
<h5 class="card-header">{% trans "Pagination" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Paginate count" %}:</th>
<th scope="row">{% trans "Paginate count" %}</th>
<td>{{ object.data.PAGINATE_COUNT }}</td>
</tr>
<tr>
<th scope="row">{% trans "Max page size" %}:</th>
<th scope="row">{% trans "Max page size" %}</th>
<td>{{ object.data.MAX_PAGE_SIZE }}</td>
</tr>
</table>
Expand All @@ -137,8 +140,8 @@ <h5 class="card-header">{% trans "Validation" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Custom validators" %}:</th>
<td>{{ object.data.CUSTOM_VALIDATORS }}</td>
<th scope="row">{% trans "Custom validators" %}</th>
<td>{{ object.data.CUSTOM_VALIDATORS|placeholder }}</td>
</tr>
</table>
</div>
Expand All @@ -149,8 +152,8 @@ <h5 class="card-header">{% trans "User Preferences" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Default user preferences" %}:</th>
<td>{{ object.data.DEFAULT_USER_PREFERENCES }}</td>
<th scope="row">{% trans "Default user preferences" %}</th>
<td>{{ object.data.DEFAULT_USER_PREFERENCES|placeholder }}</td>
</tr>
</table>
</div>
Expand All @@ -161,38 +164,33 @@ <h5 class="card-header">{% trans "Miscellaneous" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Maintenance mode" %}:</th>
<th scope="row">{% trans "Maintenance mode" %}</th>
<td>{{ object.data.MAINTENANCE_MODE }}</td>
</tr>
<tr>
<th scope="row">{% trans "GraphQL enabled" %}:</th>
<th scope="row">{% trans "GraphQL enabled" %}</th>
<td>{{ object.data.GRAPHQL_ENABLED }}</td>
</tr>
<tr>
<th scope="row">{% trans "Changelog retention" %}:</th>
<th scope="row">{% trans "Changelog retention" %}</th>
<td>{{ object.data.CHANGELOG_RETENTION }}</td>
</tr>
<tr>
<th scope="row">{% trans "Job retention" %}:</th>
<th scope="row">{% trans "Job retention" %}</th>
<td>{{ object.data.JOB_RETENTION }}</td>
</tr>
<tr>
<th scope="row">{% trans "Maps URL" %}:</th>
<th scope="row">{% trans "Maps URL" %}</th>
<td>{{ object.data.MAPS_URL }}</td>
</tr>
</table>
</div>
</div>

<div class="card">
<h5 class="card-header">{% trans "Config Revision" %}</h5>
<h5 class="card-header">{% trans "Comment" %}</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Comment" %}:</th>
<td>{{ object.comment }}</td>
</tr>
</table>
{{ object.comment|placeholder }}
</div>
</div>

Expand Down

0 comments on commit eb9a804

Please sign in to comment.