17219 fix custom validator display if function (#17247)

* 17219 fix custom validator display if function

* 17219 fix custom validator display if function

* 17219 use custom json encoder

* Fix system config export

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson 2024-08-27 11:19:16 -07:00 committed by GitHub
parent c2d67fa17e
commit d23b9370f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 2 deletions

View File

@ -25,12 +25,14 @@ from rq.registry import (
from rq.worker import Worker from rq.worker import Worker
from rq.worker_registration import clean_worker_registry from rq.worker_registration import clean_worker_registry
from extras.validators import CustomValidator
from netbox.config import get_config, PARAMS from netbox.config import get_config, PARAMS
from netbox.views import generic from netbox.views import generic
from netbox.views.generic.base import BaseObjectView from netbox.views.generic.base import BaseObjectView
from netbox.views.generic.mixins import TableMixin from netbox.views.generic.mixins import TableMixin
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.htmx import htmx_partial from utilities.htmx import htmx_partial
from utilities.json import ConfigJSONEncoder
from utilities.query import count_related from utilities.query import count_related
from utilities.views import ContentTypePermissionRequiredMixin, GetRelatedModelsMixin, register_model_view from utilities.views import ContentTypePermissionRequiredMixin, GetRelatedModelsMixin, register_model_view
from . import filtersets, forms, tables from . import filtersets, forms, tables
@ -572,13 +574,17 @@ class SystemView(UserPassesTestMixin, View):
k: getattr(config, k) for k in sorted(params) k: getattr(config, k) for k in sorted(params)
}, },
} }
response = HttpResponse(json.dumps(data, indent=4), content_type='text/json') response = HttpResponse(json.dumps(data, cls=ConfigJSONEncoder, indent=4), content_type='text/json')
response['Content-Disposition'] = 'attachment; filename="netbox.json"' response['Content-Disposition'] = 'attachment; filename="netbox.json"'
return response return response
plugins_table = tables.PluginTable(plugins, orderable=False) plugins_table = tables.PluginTable(plugins, orderable=False)
plugins_table.configure(request) plugins_table.configure(request)
# Serialize any CustomValidator classes
if hasattr(config, 'CUSTOM_VALIDATORS') and config.CUSTOM_VALIDATORS:
config.CUSTOM_VALIDATORS = json.dumps(config.CUSTOM_VALIDATORS, cls=ConfigJSONEncoder, indent=4)
return render(request, 'core/system.html', { return render(request, 'core/system.html', {
'stats': stats, 'stats': stats,
'plugins_table': plugins_table, 'plugins_table': plugins_table,

View File

@ -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|json }}</pre></td> <td><pre>{{ config.CUSTOM_VALIDATORS }}</pre></td>
{% else %} {% else %}
<td>{{ ''|placeholder }}</td> <td>{{ ''|placeholder }}</td>
{% endif %} {% endif %}

View File

@ -3,6 +3,7 @@ import decimal
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
__all__ = ( __all__ = (
'ConfigJSONEncoder',
'CustomFieldJSONEncoder', 'CustomFieldJSONEncoder',
) )
@ -15,3 +16,16 @@ class CustomFieldJSONEncoder(DjangoJSONEncoder):
if isinstance(o, decimal.Decimal): if isinstance(o, decimal.Decimal):
return float(o) return float(o)
return super().default(o) return super().default(o)
class ConfigJSONEncoder(DjangoJSONEncoder):
"""
Override Django's built-in JSON encoder to serialize CustomValidator classes as strings.
"""
def default(self, o):
from extras.validators import CustomValidator
if issubclass(type(o), CustomValidator):
return type(o).__name__
return super().default(o)