11import typing as t
2- from abc import ABC
2+ from abc import ABC , abstractmethod
33from dataclasses import is_dataclass
44
55from pydantic import BaseModel
99from ellar .core .context import IExecutionContext
1010from ellar .core .converters import TypeDefinitionConverter
1111from ellar .exceptions import RequestValidationError
12+ from ellar .helper .modelfield import create_model_field
1213from ellar .reflect import reflect
1314from ellar .serializer import (
1415 BaseSerializer ,
@@ -64,7 +65,9 @@ def serialize(
6465
6566class BaseResponseModel (IResponseModel , ABC ):
6667 __slots__ = ("_response_type" , "media_type" , "description" , "meta" , "schema" )
68+
6769 response_type : t .Type [Response ] = Response
70+ model_schema : t .Union [ResponseModelField , t .Any ] = None
6871
6972 def __init__ (
7073 self ,
@@ -80,17 +83,34 @@ def __init__(
8083 )
8184 self .description = description
8285 self .meta = kwargs
83- self .schema = schema
8486
87+ _schema : t .Optional [ResponseModelField ] = schema or self .model_schema
88+ if _schema and not isinstance (_schema , ResponseModelField ):
89+ new_response_schema = ResponseTypeDefinitionConverter (
90+ _schema
91+ ).re_group_outer_type ()
92+
93+ _schema = t .cast (
94+ ResponseModelField ,
95+ create_model_field (
96+ name = "response_model" ,
97+ type_ = new_response_schema ,
98+ model_field_class = ResponseModelField ,
99+ ),
100+ )
101+ self .schema : t .Optional [ResponseModelField ] = _schema
102+
103+ @abstractmethod
85104 def get_model_field (self ) -> t .Optional [t .Union [ResponseModelField , t .Any ]]:
86- return self . schema
105+ pass
87106
107+ @abstractmethod
88108 def serialize (
89109 self ,
90110 response_obj : t .Any ,
91111 serializer_filter : t .Optional [SerializerFilter ] = None ,
92112 ) -> t .Union [t .List [t .Dict ], t .Dict , t .Any ]:
93- return response_obj
113+ pass
94114
95115 def create_response (
96116 self , context : IExecutionContext , response_obj : t .Any , status_code : int
@@ -131,22 +151,15 @@ def __copy__(self, memodict: t.Dict = {}) -> "BaseResponseModel":
131151
132152
133153class ResponseModel (BaseResponseModel ):
134- @classmethod
135- def create_model (
136- cls ,
137- * args : t .Any ,
138- response_type : t .Type [Response ] = None ,
139- description : str = "Successful Response" ,
140- schema : t .Union [t .Type [ResponseModelField ], t .Any ] = None ,
141- ** kwargs : t .Any ,
142- ) -> "ResponseModel" :
154+ def get_model_field (self ) -> t .Optional [t .Union [ResponseModelField , t .Any ]]:
155+ return self .schema
143156
144- return cls (
145- response_type = response_type ,
146- description = description ,
147- schema = schema ,
148- ** kwargs ,
149- )
157+ def serialize (
158+ self ,
159+ response_obj : t . Any ,
160+ serializer_filter : t . Optional [ SerializerFilter ] = None ,
161+ ) -> t . Union [ t . List [ t . Dict ], t . Dict , t . Any ]:
162+ return response_obj
150163
151164
152165class RouteResponseExecution (Exception ):
0 commit comments