2
0
Эх сурвалжийг харах

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>
Arthur Hanson 1 жил өмнө
parent
commit
d23b9370f6

+ 7 - 1
netbox/core/views.py

@@ -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,

+ 1 - 1
netbox/templates/core/inc/config_data.html

@@ -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 %}

+ 14 - 0
netbox/utilities/json.py

@@ -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)