From f5dd7d853ab557ce1b74207fb256d0dcc4030283 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Wed, 20 Sep 2023 11:11:25 -0700 Subject: [PATCH] 13809 fix ConfigRevision edit if custom validators (#13825) * 13809 fix ConfigRevision edit, check if custom validator JSON serializable * 13809 check json rendering for all fields * Refactor field initialization logic to more cleanly handle statically configured values --------- Co-authored-by: Jeremy Stretch --- netbox/extras/forms/model_forms.py | 40 +++++++++++++++++++----------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 7bc83b715..83a346420 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -518,22 +518,34 @@ class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMe 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 + + # 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): - value = ', '.join(value) - self.fields[param.name].initial = value - if is_static: + 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)