Skip to content

Commit 77311c3

Browse files
authored
[python-nextgen] Fix allOf missing imports (OpenAPITools#16217)
* [python-nextgen] fix allOf missing imports Signed-off-by: ふぁ <[email protected]> * [python-nextgen] update samples Signed-off-by: ふぁ <[email protected]> * [python-nextgen] remove circular import Signed-off-by: ふぁ <[email protected]> * [python-nextgen] Fix circular refs Signed-off-by: ふぁ <[email protected]> --------- Signed-off-by: ふぁ <[email protected]>
1 parent c6a100c commit 77311c3

File tree

4 files changed

+32
-12
lines changed

4 files changed

+32
-12
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,27 @@ private ModelsMap postProcessModelsMap(ModelsMap objs) {
12691269
pydanticImports.add("validator");
12701270
} else { // typical model
12711271
codegenProperties = model.vars;
1272+
1273+
// if super class
1274+
if (model.getDiscriminator() != null && model.getDiscriminator().getMappedModels() != null) {
1275+
typingImports.add("Union");
1276+
Set<CodegenDiscriminator.MappedModel> discriminator = model.getDiscriminator().getMappedModels();
1277+
for (CodegenDiscriminator.MappedModel mappedModel : discriminator) {
1278+
postponedModelImports.add(mappedModel.getMappingName());
1279+
}
1280+
}
1281+
}
1282+
1283+
if (!model.allOf.isEmpty()) { // allOf
1284+
for (CodegenProperty cp : model.allVars) {
1285+
if (!cp.isPrimitiveType || cp.isModel) {
1286+
if (cp.isArray){ // if array
1287+
modelImports.add(cp.items.dataType);
1288+
}else{ // if model
1289+
modelImports.add(cp.dataType);
1290+
}
1291+
}
1292+
}
12721293
}
12731294

12741295
// if model_generic.mustache is used and support additionalProperties

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ from __future__ import annotations
22
import pprint
33
import re # noqa: F401
44
import json
5-
{{#hasChildren}}
6-
{{#discriminator}}
7-
import {{{modelPackage}}}
8-
{{/discriminator}}
9-
{{/hasChildren}}
105

116
{{#vendorExtensions.x-py-datetime-imports}}{{#-first}}from datetime import{{/-first}} {{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-py-datetime-imports}}
127
{{#vendorExtensions.x-py-typing-imports}}{{#-first}}from typing import{{/-first}} {{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-py-typing-imports}}
@@ -228,7 +223,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
228223
# look up the object type based on discriminator mapping
229224
object_type = cls.get_discriminator_value(obj)
230225
if object_type:
231-
klass = getattr({{modelPackage}}, object_type)
226+
klass = globals()[object_type]
232227
return klass.from_dict(obj)
233228
else:
234229
raise ValueError("{{{classname}}} failed to lookup discriminator value from " +

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
import pprint
1717
import re # noqa: F401
1818
import json
19-
import petstore_api.models
2019

2120

22-
from typing import Optional
21+
from typing import Optional, Union
2322
from pydantic import BaseModel, Field, StrictStr
2423

2524
class Animal(BaseModel):
@@ -80,11 +79,14 @@ def from_dict(cls, obj: dict) -> Union(Cat, Dog):
8079
# look up the object type based on discriminator mapping
8180
object_type = cls.get_discriminator_value(obj)
8281
if object_type:
83-
klass = getattr(petstore_api.models, object_type)
82+
klass = globals()[object_type]
8483
return klass.from_dict(obj)
8584
else:
8685
raise ValueError("Animal failed to lookup discriminator value from " +
8786
json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name +
8887
", mapping: " + json.dumps(cls.__discriminator_value_class_map))
8988

89+
from petstore_api.models.cat import Cat
90+
from petstore_api.models.dog import Dog
91+
Animal.update_forward_refs()
9092

samples/openapi3/client/petstore/python/petstore_api/models/animal.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
import pprint
1717
import re # noqa: F401
1818
import json
19-
import petstore_api.models
2019

2120

22-
from typing import Any, Dict, Optional
21+
from typing import Any, Dict, Optional, Union
2322
from pydantic import BaseModel, Field, StrictStr
2423

2524
class Animal(BaseModel):
@@ -87,11 +86,14 @@ def from_dict(cls, obj: dict) -> Union(Cat, Dog):
8786
# look up the object type based on discriminator mapping
8887
object_type = cls.get_discriminator_value(obj)
8988
if object_type:
90-
klass = getattr(petstore_api.models, object_type)
89+
klass = globals()[object_type]
9190
return klass.from_dict(obj)
9291
else:
9392
raise ValueError("Animal failed to lookup discriminator value from " +
9493
json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name +
9594
", mapping: " + json.dumps(cls.__discriminator_value_class_map))
9695

96+
from petstore_api.models.cat import Cat
97+
from petstore_api.models.dog import Dog
98+
Animal.update_forward_refs()
9799

0 commit comments

Comments
 (0)