Skip to content

Commit f180aa0

Browse files
[python] Fix unnamed dicts with additional properties (#16779)
* test: Add two extra models for testing * Fix unnamed dicts with additional properties Closes #16630
1 parent 7af4593 commit f180aa0

45 files changed

Lines changed: 1500 additions & 3 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/main/resources/python/model_generic.mustache

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,17 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
182182
{{/isArray}}
183183
{{#isMap}}
184184
{{#items.isArray}}
185+
{{^items.items.isPrimitiveType}}
185186
# override the default output from pydantic by calling `to_dict()` of each value in {{{name}}} (dict of array)
186187
_field_dict_of_array = {}
187188
if self.{{{name}}}:
188189
for _key in self.{{{name}}}:
189-
if self.{{{name}}}[_key]:
190+
if self.{{{name}}}[_key] is not None:
190191
_field_dict_of_array[_key] = [
191192
_item.to_dict() for _item in self.{{{name}}}[_key]
192193
]
193194
_dict['{{{baseName}}}'] = _field_dict_of_array
195+
{{/items.items.isPrimitiveType}}
194196
{{/items.isArray}}
195197
{{^items.isArray}}
196198
{{^items.isPrimitiveType}}

modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,3 +2351,21 @@ components:
23512351
title: ListOfObjects
23522352
items:
23532353
$ref: "#/components/schemas/Tag"
2354+
UnnamedDictWithAdditionalStringListProperties:
2355+
type: object
2356+
properties:
2357+
dictProperty:
2358+
type: object
2359+
additionalProperties:
2360+
type: array
2361+
items:
2362+
type: string
2363+
UnnamedDictWithAdditionalModelListProperties:
2364+
type: object
2365+
properties:
2366+
dictProperty:
2367+
type: object
2368+
additionalProperties:
2369+
type: array
2370+
items:
2371+
$ref: "#/components/schemas/CreatureInfo"

samples/openapi3/client/petstore/python-aiohttp/.openapi-generator/FILES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ docs/StoreApi.md
8686
docs/Tag.md
8787
docs/TestInlineFreeformAdditionalPropertiesRequest.md
8888
docs/Tiger.md
89+
docs/UnnamedDictWithAdditionalModelListProperties.md
90+
docs/UnnamedDictWithAdditionalStringListProperties.md
8991
docs/User.md
9092
docs/UserApi.md
9193
docs/WithNestedOneOf.md
@@ -181,6 +183,8 @@ petstore_api/models/special_name.py
181183
petstore_api/models/tag.py
182184
petstore_api/models/test_inline_freeform_additional_properties_request.py
183185
petstore_api/models/tiger.py
186+
petstore_api/models/unnamed_dict_with_additional_model_list_properties.py
187+
petstore_api/models/unnamed_dict_with_additional_string_list_properties.py
184188
petstore_api/models/user.py
185189
petstore_api/models/with_nested_one_of.py
186190
petstore_api/py.typed

samples/openapi3/client/petstore/python-aiohttp/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ Class | Method | HTTP request | Description
212212
- [Tag](docs/Tag.md)
213213
- [TestInlineFreeformAdditionalPropertiesRequest](docs/TestInlineFreeformAdditionalPropertiesRequest.md)
214214
- [Tiger](docs/Tiger.md)
215+
- [UnnamedDictWithAdditionalModelListProperties](docs/UnnamedDictWithAdditionalModelListProperties.md)
216+
- [UnnamedDictWithAdditionalStringListProperties](docs/UnnamedDictWithAdditionalStringListProperties.md)
215217
- [User](docs/User.md)
216218
- [WithNestedOneOf](docs/WithNestedOneOf.md)
217219

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# UnnamedDictWithAdditionalModelListProperties
2+
3+
4+
## Properties
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**dict_property** | **Dict[str, List[CreatureInfo]]** | | [optional]
8+
9+
## Example
10+
11+
```python
12+
from petstore_api.models.unnamed_dict_with_additional_model_list_properties import UnnamedDictWithAdditionalModelListProperties
13+
14+
# TODO update the JSON string below
15+
json = "{}"
16+
# create an instance of UnnamedDictWithAdditionalModelListProperties from a JSON string
17+
unnamed_dict_with_additional_model_list_properties_instance = UnnamedDictWithAdditionalModelListProperties.from_json(json)
18+
# print the JSON string representation of the object
19+
print UnnamedDictWithAdditionalModelListProperties.to_json()
20+
21+
# convert the object into a dict
22+
unnamed_dict_with_additional_model_list_properties_dict = unnamed_dict_with_additional_model_list_properties_instance.to_dict()
23+
# create an instance of UnnamedDictWithAdditionalModelListProperties from a dict
24+
unnamed_dict_with_additional_model_list_properties_form_dict = unnamed_dict_with_additional_model_list_properties.from_dict(unnamed_dict_with_additional_model_list_properties_dict)
25+
```
26+
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
27+
28+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# UnnamedDictWithAdditionalStringListProperties
2+
3+
4+
## Properties
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**dict_property** | **Dict[str, List[str]]** | | [optional]
8+
9+
## Example
10+
11+
```python
12+
from petstore_api.models.unnamed_dict_with_additional_string_list_properties import UnnamedDictWithAdditionalStringListProperties
13+
14+
# TODO update the JSON string below
15+
json = "{}"
16+
# create an instance of UnnamedDictWithAdditionalStringListProperties from a JSON string
17+
unnamed_dict_with_additional_string_list_properties_instance = UnnamedDictWithAdditionalStringListProperties.from_json(json)
18+
# print the JSON string representation of the object
19+
print UnnamedDictWithAdditionalStringListProperties.to_json()
20+
21+
# convert the object into a dict
22+
unnamed_dict_with_additional_string_list_properties_dict = unnamed_dict_with_additional_string_list_properties_instance.to_dict()
23+
# create an instance of UnnamedDictWithAdditionalStringListProperties from a dict
24+
unnamed_dict_with_additional_string_list_properties_form_dict = unnamed_dict_with_additional_string_list_properties.from_dict(unnamed_dict_with_additional_string_list_properties_dict)
25+
```
26+
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
27+
28+

samples/openapi3/client/petstore/python-aiohttp/petstore_api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,7 @@
115115
from petstore_api.models.tag import Tag
116116
from petstore_api.models.test_inline_freeform_additional_properties_request import TestInlineFreeformAdditionalPropertiesRequest
117117
from petstore_api.models.tiger import Tiger
118+
from petstore_api.models.unnamed_dict_with_additional_model_list_properties import UnnamedDictWithAdditionalModelListProperties
119+
from petstore_api.models.unnamed_dict_with_additional_string_list_properties import UnnamedDictWithAdditionalStringListProperties
118120
from petstore_api.models.user import User
119121
from petstore_api.models.with_nested_one_of import WithNestedOneOf

samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,7 @@
9191
from petstore_api.models.tag import Tag
9292
from petstore_api.models.test_inline_freeform_additional_properties_request import TestInlineFreeformAdditionalPropertiesRequest
9393
from petstore_api.models.tiger import Tiger
94+
from petstore_api.models.unnamed_dict_with_additional_model_list_properties import UnnamedDictWithAdditionalModelListProperties
95+
from petstore_api.models.unnamed_dict_with_additional_string_list_properties import UnnamedDictWithAdditionalStringListProperties
9496
from petstore_api.models.user import User
9597
from petstore_api.models.with_nested_one_of import WithNestedOneOf

samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/map_of_array_of_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def to_dict(self) -> Dict[str, Any]:
7575
_field_dict_of_array = {}
7676
if self.shop_id_to_org_online_lip_map:
7777
for _key in self.shop_id_to_org_online_lip_map:
78-
if self.shop_id_to_org_online_lip_map[_key]:
78+
if self.shop_id_to_org_online_lip_map[_key] is not None:
7979
_field_dict_of_array[_key] = [
8080
_item.to_dict() for _item in self.shop_id_to_org_online_lip_map[_key]
8181
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# coding: utf-8
2+
3+
"""
4+
OpenAPI Petstore
5+
6+
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Generated by OpenAPI Generator (https://openapi-generator.tech)
10+
11+
Do not edit the class manually.
12+
""" # noqa: E501
13+
14+
15+
from __future__ import annotations
16+
import pprint
17+
import re # noqa: F401
18+
import json
19+
20+
21+
from typing import Dict, List, Optional
22+
from pydantic import BaseModel
23+
from pydantic import Field
24+
from petstore_api.models.creature_info import CreatureInfo
25+
from typing import Dict, Any
26+
try:
27+
from typing import Self
28+
except ImportError:
29+
from typing_extensions import Self
30+
31+
class UnnamedDictWithAdditionalModelListProperties(BaseModel):
32+
"""
33+
UnnamedDictWithAdditionalModelListProperties
34+
"""
35+
dict_property: Optional[Dict[str, List[CreatureInfo]]] = Field(default=None, alias="dictProperty")
36+
__properties: ClassVar[List[str]] = ["dictProperty"]
37+
38+
model_config = {
39+
"populate_by_name": True,
40+
"validate_assignment": True
41+
}
42+
43+
44+
def to_str(self) -> str:
45+
"""Returns the string representation of the model using alias"""
46+
return pprint.pformat(self.model_dump(by_alias=True))
47+
48+
def to_json(self) -> str:
49+
"""Returns the JSON representation of the model using alias"""
50+
# TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
51+
return json.dumps(self.to_dict())
52+
53+
@classmethod
54+
def from_json(cls, json_str: str) -> Self:
55+
"""Create an instance of UnnamedDictWithAdditionalModelListProperties from a JSON string"""
56+
return cls.from_dict(json.loads(json_str))
57+
58+
def to_dict(self):
59+
"""Returns the dictionary representation of the model using alias"""
60+
_dict = self.model_dump(by_alias=True,
61+
exclude={
62+
},
63+
exclude_none=True)
64+
# override the default output from pydantic by calling `to_dict()` of each value in dict_property (dict of array)
65+
_field_dict_of_array = {}
66+
if self.dict_property:
67+
for _key in self.dict_property:
68+
if self.dict_property[_key] is not None:
69+
_field_dict_of_array[_key] = [
70+
_item.to_dict() for _item in self.dict_property[_key]
71+
]
72+
_dict['dictProperty'] = _field_dict_of_array
73+
return _dict
74+
75+
@classmethod
76+
def from_dict(cls, obj: dict) -> Self:
77+
"""Create an instance of UnnamedDictWithAdditionalModelListProperties from a dict"""
78+
if obj is None:
79+
return None
80+
81+
if not isinstance(obj, dict):
82+
return cls.model_validate(obj)
83+
84+
_obj = cls.model_validate({
85+
"dictProperty": dict(
86+
(_k,
87+
[CreatureInfo.from_dict(_item) for _item in _v]
88+
if _v is not None
89+
else None
90+
)
91+
for _k, _v in obj.get("dictProperty").items()
92+
)
93+
})
94+
return _obj
95+
96+

0 commit comments

Comments
 (0)