12591 config params admin (#12904)

* 12591 initial commit

* 12591 detail view

* 12591 add/edit view

* 12591 edit button

* 12591 base views and forms

* 12591 form cleanup

* 12591 form cleanup

* 12591 form cleanup

* 12591 review changes

* 12591 move check for restrictedqueryset

* 12591 restore view

* 12591 restore page styling

* 12591 remove admin

* Remove edit view for ConfigRevision instances

* Order ConfigRevisions by creation time

* Correct permission name

* Use RestrictedQuerySet for ConfigRevision

* Fix redirect URL

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson
2023-06-22 11:04:24 -07:00
committed by GitHub
parent a2db92e297
commit 3edabd27d1
16 changed files with 567 additions and 252 deletions

View File

@@ -1,37 +0,0 @@
{% extends "admin/base_site.html" %}
{% load static %}
{% block content %}
<p>Restore configuration #{{ object.pk }} from <strong>{{ object.created }}</strong>?</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Current Value</th>
<th>New Value</th>
<th></th>
</tr>
</thead>
<tbody>
{% for param, current, new in params %}
<tr{% if current != new %} style="color: #d7a50d"{% endif %}>
<td>{{ param }}</td>
<td>{{ current }}</td>
<td>{{ new }}</td>
<td>{% if current != new %}<img src="{% static 'admin/img/icon-changelink.svg' %}" alt="*" title="Changed">{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
<form method="post">
{% csrf_token %}
<div class="submit-row" style="margin-top: 20px">
<input type="submit" name="restore" value="Restore" class="default" style="float: left" />
<a href="{% url 'admin:extras_configrevision_changelist' %}" style="float: left; margin: 2px 0; padding: 10px 15px">Cancel</a>
</div>
</form>
{% endblock content %}

View File

@@ -0,0 +1,200 @@
{% extends 'generic/object.html' %}
{% load buttons %}
{% load custom_links %}
{% load helpers %}
{% load perms %}
{% load plugins %}
{% load static %}
{% block breadcrumbs %}
{% endblock %}
{% block controls %}
<div class="controls">
<div class="control-group">
{% plugin_buttons object %}
</div>
<div class="control-group">
{% custom_links object %}
</div>
</div>
{% endblock controls %}
{% block content %}
<div class="row">
<div class="col col-md-6">
<div class="card">
<h5 class="card-header">Rack Elevation</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Rack elevation default unit height:</th>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT }}</td>
</tr>
<tr>
<th scope="row">Rack elevation default unit width:</th>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_WIDTH }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Power</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Powerfeed default voltage:</th>
<td>{{ object.data.POWERFEED_DEFAULT_VOLTAGE }}</td>
</tr>
<tr>
<th scope="row">Powerfeed default amperage:</th>
<td>{{ object.data.POWERFEED_DEFAULT_AMPERAGE }}</td>
</tr>
<tr>
<th scope="row">Powerfeed default max utilization:</th>
<td>{{ object.data.POWERFEED_DEFAULT_MAX_UTILIZATION }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">IPAM</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">IPAM enforce global unique:</th>
<td>{{ object.data.ENFORCE_GLOBAL_UNIQUE }}</td>
</tr>
<tr>
<th scope="row">IPAM prefer IPV4:</th>
<td>{{ object.data.PREFER_IPV4 }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Security</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Allowed URL schemes:</th>
<td>{{ object.data.ALLOWED_URL_SCHEMES }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Banners</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Login banner:</th>
<td>{{ object.data.BANNER_LOGIN }}</td>
</tr>
<tr>
<th scope="row">Maintenance banner:</th>
<td>{{ object.data.BANNER_MAINTENANCE }}</td>
</tr>
<tr>
<th scope="row">Top banner:</th>
<td>{{ object.data.BANNER_TOP }}</td>
</tr>
<tr>
<th scope="row">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">Pagination</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Paginate count:</th>
<td>{{ object.data.PAGINATE_COUNT }}</td>
</tr>
<tr>
<th scope="row">Max page size:</th>
<td>{{ object.data.MAX_PAGE_SIZE }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Validation</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Custom validators:</th>
<td>{{ object.data.CUSTOM_VALIDATORS }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">User Preferences</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Default user preferences:</th>
<td>{{ object.data.DEFAULT_USER_PREFERENCES }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Miscellaneous</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Maintenance mode:</th>
<td>{{ object.data.MAINTENANCE_MODE }}</td>
</tr>
<tr>
<th scope="row">GraphQL enabled:</th>
<td>{{ object.data.GRAPHQL_ENABLED }}</td>
</tr>
<tr>
<th scope="row">Changelog retention:</th>
<td>{{ object.data.CHANGELOG_RETENTION }}</td>
</tr>
<tr>
<th scope="row">Job retention:</th>
<td>{{ object.data.JOB_RETENTION }}</td>
</tr>
<tr>
<th scope="row">Maps URL:</th>
<td>{{ object.data.MAPS_URL }}</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">Config Revision</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Comment:</th>
<td>{{ object.comment }}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,88 @@
{% extends 'base/layout.html' %}
{% load helpers %}
{% load buttons %}
{% load perms %}
{% load static %}
{% block title %}Restore: {{ object }}{% endblock %}
{% block subtitle %}
<div class="object-subtitle">
<span>Created {{ object.created|annotated_date }}</span>
</div>
{% endblock %}
{% block header %}
<div class="row noprint">
<div class="col col-md-12">
<nav class="breadcrumb-container px-3" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{% url 'extras:configrevision_list' %}">Config revisions</a></li>
<li class="breadcrumb-item"><a href="{% url 'extras:configrevision' pk=object.pk %}">{{ object }}</a></li>
</ol>
</nav>
</div>
</div>
{{ block.super }}
{% endblock header %}
{% block controls %}
<div class="controls">
<div class="control-group">
{% if request.user|can_delete:job %}
{% delete_button job %}
{% endif %}
</div>
</div>
{% endblock controls %}
{% block tabs %}
<ul class="nav nav-tabs px-3" role="tablist">
<li class="nav-item" role="presentation">
<a href="#log" role="tab" data-bs-toggle="tab" class="nav-link active">Restore</a>
</li>
</ul>
{% endblock %}
{% block content %}
<div class="row">
<div class="col-12">
<table class="table table-striped table-hover">
<thead>
<tr>
<th scope="col">Parameter</th>
<th scope="col">Current Value</th>
<th scope="col">New Value</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% for param, current, new in params %}
<tr{% if current != new %} class="table-warning"{% endif %}>
<td>{{ param }}</td>
<td>{{ current }}</td>
<td>{{ new }}</td>
<td>{% if current != new %}<img src="{% static 'admin/img/icon-changelink.svg' %}" alt="*" title="Changed">{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<form method="post">
{% csrf_token %}
<div class="submit-row" style="margin-top: 20px">
<div class="controls">
<div class="control-group">
<button type="submit" name="restore" class="btn btn-primary">Restore</button>
<a href="{% url 'extras:configrevision_list' %}" id="cancel" name="cancel" class="btn btn-outline-danger">Cancel</a>
</div>
</div>
</div>
</form>
{% endblock content %}
{% block modals %}
{% endblock modals %}

View File

@@ -38,7 +38,7 @@ Context:
</div>
</div>
{{ block.super }}
{% endblock %}
{% endblock header %}
{% block title %}{{ object }}{% endblock %}
@@ -48,7 +48,7 @@ Context:
<span class="separator">&middot;</span>
<span>Updated <span title="{{ object.last_updated }}">{{ object.last_updated|timesince }}</span> ago</span>
</div>
{% endblock %}
{% endblock subtitle %}
{% block controls %}
{# Clone/Edit/Delete Buttons #}