mirror of
https://github.com/netbox-community/netbox.git
synced 2026-04-20 07:51:35 +02:00
Closes #20981: Enhance JSON rendering for Custom Validators and Protection Rules in Config Revision View (#21376)
* feat(config): Add extra context to ConfigRevisionView Introduces `get_extra_context` method for `ConfigRevisionView` to format JSON-based attributes like `CUSTOM_VALIDATORS`, `DEFAULT_USER_PREFERENCES`, and `PROTECTION_RULES`. This ensures clearer rendering of configuration data in the UI. Fixes #20981 * Reduce padding on JSON blocks --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
from django import __version__ as django_version
|
from django import __version__ as django_version
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
@@ -310,6 +311,22 @@ class ConfigRevisionListView(generic.ObjectListView):
|
|||||||
class ConfigRevisionView(generic.ObjectView):
|
class ConfigRevisionView(generic.ObjectView):
|
||||||
queryset = ConfigRevision.objects.all()
|
queryset = ConfigRevision.objects.all()
|
||||||
|
|
||||||
|
def get_extra_context(self, request, instance):
|
||||||
|
"""
|
||||||
|
Retrieve additional context for a given request and instance.
|
||||||
|
"""
|
||||||
|
# Copy the revision data to avoid modifying the original
|
||||||
|
config = deepcopy(instance.data or {})
|
||||||
|
|
||||||
|
# Serialize any JSON-based classes
|
||||||
|
for attr in ['CUSTOM_VALIDATORS', 'DEFAULT_USER_PREFERENCES', 'PROTECTION_RULES']:
|
||||||
|
if attr in config:
|
||||||
|
config[attr] = json.dumps(config[attr], cls=ConfigJSONEncoder, indent=4)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'config': config,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(ConfigRevision, 'add', detail=False)
|
@register_model_view(ConfigRevision, 'add', detail=False)
|
||||||
class ConfigRevisionEditView(generic.ObjectEditView):
|
class ConfigRevisionEditView(generic.ObjectEditView):
|
||||||
@@ -617,8 +634,8 @@ class SystemView(UserPassesTestMixin, View):
|
|||||||
response['Content-Disposition'] = 'attachment; filename="netbox.json"'
|
response['Content-Disposition'] = 'attachment; filename="netbox.json"'
|
||||||
return response
|
return response
|
||||||
|
|
||||||
# Serialize any CustomValidator classes
|
# Serialize any JSON-based classes
|
||||||
for attr in ['CUSTOM_VALIDATORS', 'PROTECTION_RULES']:
|
for attr in ['CUSTOM_VALIDATORS', 'DEFAULT_USER_PREFERENCES', 'PROTECTION_RULES']:
|
||||||
if hasattr(config, attr) and getattr(config, attr, None):
|
if hasattr(config, attr) and getattr(config, attr, None):
|
||||||
setattr(config, attr, json.dumps(getattr(config, attr), cls=ConfigJSONEncoder, indent=4))
|
setattr(config, attr, json.dumps(getattr(config, attr), cls=ConfigJSONEncoder, indent=4))
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<div class="col col-md-12">
|
<div class="col col-md-12">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2 class="card-header">{% trans "Configuration Data" %}</h2>
|
<h2 class="card-header">{% trans "Configuration Data" %}</h2>
|
||||||
{% include 'core/inc/config_data.html' with config=object.data %}
|
{% include 'core/inc/config_data.html' %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row" class="ps-3">{% trans "Custom validators" %}</th>
|
<th scope="row" class="ps-3">{% trans "Custom validators" %}</th>
|
||||||
{% if config.CUSTOM_VALIDATORS %}
|
{% if config.CUSTOM_VALIDATORS %}
|
||||||
<td><pre>{{ config.CUSTOM_VALIDATORS }}</pre></td>
|
<td><pre class="p-0">{{ config.CUSTOM_VALIDATORS }}</pre></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td>{{ ''|placeholder }}</td>
|
<td>{{ ''|placeholder }}</td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row" class="border-0 ps-3">{% trans "Protection rules" %}</th>
|
<th scope="row" class="border-0 ps-3">{% trans "Protection rules" %}</th>
|
||||||
{% if config.PROTECTION_RULES %}
|
{% if config.PROTECTION_RULES %}
|
||||||
<td class="border-0"><pre>{{ config.PROTECTION_RULES }}</pre></td>
|
<td class="border-0"><pre class="p-0">{{ config.PROTECTION_RULES }}</pre></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td class="border-0">{{ ''|placeholder }}</td>
|
<td class="border-0">{{ ''|placeholder }}</td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row" class="border-0 ps-3">{% trans "Default preferences" %}</th>
|
<th scope="row" class="border-0 ps-3">{% trans "Default preferences" %}</th>
|
||||||
{% if config.DEFAULT_USER_PREFERENCES %}
|
{% if config.DEFAULT_USER_PREFERENCES %}
|
||||||
<td class="border-0"><pre>{{ config.DEFAULT_USER_PREFERENCES|json }}</pre></td>
|
<td class="border-0"><pre class="p-0">{{ config.DEFAULT_USER_PREFERENCES }}</pre></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td class="border-0">{{ ''|placeholder }}</td>
|
<td class="border-0">{{ ''|placeholder }}</td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
Reference in New Issue
Block a user