diff --git a/biosimdb_interface/form/utils.py b/biosimdb_interface/form/utils.py index f77ea72..0a54e8d 100644 --- a/biosimdb_interface/form/utils.py +++ b/biosimdb_interface/form/utils.py @@ -165,12 +165,12 @@ def form_to_json(form): value = bool(value) converted_values.append(value) - # For repeated keys keep list (after dropping empty placeholders); - # for single keys keep scalar to preserve existing behavior. - if len(converted_values) > 1: - value_out = [v for v in converted_values if v != ""] - else: - value_out = converted_values[0] if converted_values else "" + # HTML names ending in [] represent schema multivalued fields, even when + # the user selects only one option. + if key.endswith("[]"): + value_out = [value for value in converted_values if value != ""] + else: + value_out = converted_values[0] if converted_values else "" _set_nested(data, parts, value_out) return data diff --git a/biosimdb_interface/form/webform.py b/biosimdb_interface/form/webform.py index 773d0a7..6c461ed 100644 --- a/biosimdb_interface/form/webform.py +++ b/biosimdb_interface/form/webform.py @@ -117,7 +117,7 @@ def webform(): if action == "save": json_form["files"] = extract_uploaded_file_metadata(tmpdir) - + print(json_form) biosimschema_path = os.getenv("BIOSIM_SCHEMA_PATH", "") validation_errors = [] diff --git a/tests/test_form/test_utils.py b/tests/test_form/test_utils.py index 8068292..df75e2d 100644 --- a/tests/test_form/test_utils.py +++ b/tests/test_form/test_utils.py @@ -63,3 +63,14 @@ def test_form_to_json_direct_list_assignment(): d = {} _set_nested(d, ["items", "1"], "val") assert d == {"items": ["val"]} + + +def test_form_to_json_multiselect_single_value_stays_list(): + """A single selection from a multivalued HTML field remains a list.""" + result = form_to_json( + {"stages[minimisation][1][minimisation_algorithm][]": "Steepest Descent"} + ) + + assert result == { + "stages": {"minimisation": [{"minimisation_algorithm": ["Steepest Descent"]}]} + }