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