diff --git a/src/servala/core/forms.py b/src/servala/core/forms.py index 076a9d9..2b283f2 100644 --- a/src/servala/core/forms.py +++ b/src/servala/core/forms.py @@ -161,9 +161,6 @@ class ServiceDefinitionAdminForm(forms.ModelForm): form_config = cleaned_data.get("form_config") if form_config: - form_config = self._normalize_form_config_types(form_config) - cleaned_data["form_config"] = form_config - try: jsonschema.validate( instance=form_config, schema=self.form_config_schema @@ -185,42 +182,6 @@ class ServiceDefinitionAdminForm(forms.ModelForm): return cleaned_data - def _normalize_form_config_types(self, form_config): - """ - Normalize form_config by converting string representations of numbers - to actual integers/floats. The JSON form widget sends all values - as strings, but the schema expects proper types. - """ - if not isinstance(form_config, dict): - return form_config - - integer_fields = ["max_length", "rows", "min_values", "max_values"] - number_fields = ["min_value", "max_value"] - - for fieldset in form_config.get("fieldsets", []): - for field in fieldset.get("fields", []): - for field_name in integer_fields: - if field_name in field and field[field_name] is not None: - value = field[field_name] - if isinstance(value, str): - try: - field[field_name] = int(value) if value else None - except (ValueError, TypeError): - pass - - for field_name in number_fields: - if field_name in field and field[field_name] is not None: - value = field[field_name] - if isinstance(value, str): - try: - field[field_name] = ( - int(value) if "." not in value else float(value) - ) - except (ValueError, TypeError): - pass - - return form_config - def _validate_field_mappings(self, form_config, cleaned_data): if not self.instance.pk: return @@ -278,32 +239,6 @@ class ServiceDefinitionAdminForm(forms.ModelForm): if not mapping: return - field_name = field.get("label", mapping) - custom_choices = field.get("choices", []) - - # Single-element choices [value] are transformed to [value, value] - for i, choice in enumerate(custom_choices): - if not isinstance(choice, (list, tuple)): - errors.append( - _( - "Field '{}': Choice at index {} must be a list or tuple, " - "but got: {}" - ).format(field_name, i, repr(choice)) - ) - return - - choice_len = len(choice) - if choice_len == 1: - custom_choices[i] = [choice[0], choice[0]] - elif choice_len == 0 or choice_len > 2: - errors.append( - _( - "Field '{}': Choice at index {} must have 1 or 2 elements " - "(got {}): {}" - ).format(field_name, i, choice_len, repr(choice)) - ) - return - field_schema = self._get_field_schema(spec_schema, mapping, prefix) if not field_schema: return @@ -312,6 +247,7 @@ class ServiceDefinitionAdminForm(forms.ModelForm): if not control_plane_choices: return + custom_choices = field.get("choices", []) custom_choice_values = [choice[0] for choice in custom_choices] invalid_choices = [ @@ -321,6 +257,7 @@ class ServiceDefinitionAdminForm(forms.ModelForm): ] if invalid_choices: + field_name = field.get("label", mapping) errors.append( _( "Field '{}' has invalid choice values: {}. " diff --git a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html index ace05af..d07b4e3 100644 --- a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html +++ b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html @@ -7,11 +7,12 @@ {% csrf_token %} {% include "frontend/forms/errors.html" %} {% if form %} -
- {% translate "Show Expert Mode" %} +
+
{% endif %}
0 - assert "must have 1 or 2 elements" in str(errors[0]) - - -def test_three_plus_element_choices_fail_validation(): - form = ServiceDefinitionAdminForm() - config_with_long_choice = { - "fieldsets": [ - { - "fields": [ - { - "type": "choice", - "label": "Version", - "controlplane_field_mapping": "spec.version", - "choices": [ - ["6.2", "Version 6.2", "Extra"] - ], # 3 elements - invalid - }, - ] - } - ] - } - - errors = [] - - for field in config_with_long_choice["fieldsets"][0]["fields"]: - if field.get("type") == "choice": - form._validate_choice_field( - field, field["controlplane_field_mapping"], {}, "spec", errors - ) - - assert len(errors) > 0 - assert "must have 1 or 2 elements" in str(errors[0])