From d414304168278f33959fff37f19ff25e0b4062f9 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 19 Sep 2023 12:51:57 -0700 Subject: [PATCH 1/3] 13809 fix ConfigRevision edit, check if custom validator JSON serializable --- netbox/extras/forms/model_forms.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index c8afeb090ae..a1ecb61ad50 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -531,6 +531,15 @@ def __init__(self, *args, **kwargs): if type(value) in (tuple, list): value = ', '.join(value) self.fields[param.name].initial = value + + if param.name == 'CUSTOM_VALIDATORS': + # custom validators can be either dict or functions + try: + json.dumps(value) + except TypeError: + self.fields[param.name].initial = None + self.fields[param.name].disabled = True + if is_static: self.fields[param.name].disabled = True From 4e930a80ed1eabbabf04cb72bb76d8677b6012f6 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 20 Sep 2023 07:28:23 -0700 Subject: [PATCH 2/3] 13809 check json rendering for all fields --- netbox/extras/forms/model_forms.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index a1ecb61ad50..99cddf07a12 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -532,13 +532,11 @@ def __init__(self, *args, **kwargs): value = ', '.join(value) self.fields[param.name].initial = value - if param.name == 'CUSTOM_VALIDATORS': - # custom validators can be either dict or functions - try: - json.dumps(value) - except TypeError: - self.fields[param.name].initial = None - self.fields[param.name].disabled = True + try: + json.dumps(value) + except TypeError: + self.fields[param.name].initial = None + self.fields[param.name].disabled = True if is_static: self.fields[param.name].disabled = True From f625c0de49e72de939408654e5141ab6a2a64060 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 20 Sep 2023 11:29:27 -0400 Subject: [PATCH 3/3] Refactor field initialization logic to more cleanly handle statically configured values --- netbox/extras/forms/model_forms.py | 47 +++++++++++++++++------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 99cddf07a12..400b232622f 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -517,29 +517,34 @@ def __init__(self, *args, **kwargs): config = get_config() for param in PARAMS: value = getattr(config, param.name) - is_static = hasattr(settings, param.name) - if value: - help_text = self.fields[param.name].help_text - if help_text: - help_text += '
' # Line break - help_text += _('Current value: {value}').format(value=value) - if is_static: - help_text += _(' (defined statically)') - 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 - - try: - json.dumps(value) - except TypeError: - self.fields[param.name].initial = None - self.fields[param.name].disabled = True - if is_static: + # Set the field's initial value, if it can be serialized. (This may not be the case e.g. for + # CUSTOM_VALIDATORS, which may reference Python objects.) + try: + json.dumps(value) + if type(value) in (tuple, list): + self.fields[param.name].initial = ', '.join(value) + else: + self.fields[param.name].initial = value + except TypeError: + pass + + # Check whether this parameter is statically configured (e.g. in configuration.py) + if hasattr(settings, param.name): self.fields[param.name].disabled = True + self.fields[param.name].help_text = _( + 'This parameter has been defined statically and cannot be modified.' + ) + continue + + # Set the field's help text + help_text = self.fields[param.name].help_text + if help_text: + help_text += '
' # Line break + help_text += _('Current value: {value}').format(value=value or '—') + if value == param.default: + help_text += _(' (default)') + self.fields[param.name].help_text = help_text def save(self, commit=True): instance = super().save(commit=False)