From 52ee793bb0f1e44f7b45509cbfca2872e32074f1 Mon Sep 17 00:00:00 2001 From: Pierre Halleux Date: Tue, 4 Mar 2025 13:29:30 +0100 Subject: [PATCH] [IMP] base_rest_pydantic: Add support for `anyOf` and `oneOf` in OpenAPI query parameters Ensures proper schema generation for fields that accept multiple types --- base_rest_pydantic/restapi.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/base_rest_pydantic/restapi.py b/base_rest_pydantic/restapi.py index 4764f0232..245ec96a8 100644 --- a/base_rest_pydantic/restapi.py +++ b/base_rest_pydantic/restapi.py @@ -70,19 +70,28 @@ def to_openapi_query_parameters(self, servic, spec): "required": prop in json_schema.get("required", []), "allowEmptyValue": spec.get("nullable", False), "default": spec.get("default"), + "schema": {}, } - if spec.get("schema"): - params["schema"] = spec.get("schema") - else: - params["schema"] = {"type": spec["type"]} - if spec.get("items"): - params["schema"]["items"] = spec.get("items") + if "anyOf" in spec: + params["schema"]["anyOf"] = spec["anyOf"] + elif "oneOf" in spec: + params["schema"]["oneOf"] = spec["oneOf"] + elif "type" in spec: + params["schema"]["type"] = spec["type"] + if spec.get("nullable", False): + if "type" in params["schema"]: + params["schema"]["type"] = ["null", params["schema"]["type"]] + elif "anyOf" in params["schema"]: + params["schema"]["anyOf"].append({"type": "null"}) + elif "oneOf" in params["schema"]: + params["schema"]["oneOf"].append({"type": "null"}) + if "enum" in spec: params["schema"]["enum"] = spec["enum"] parameters.append(params) - if spec["type"] == "array": + if spec.get("type") == "array": # To correctly handle array into the url query string, # the name must ends with [] params["name"] = params["name"] + "[]"