2323from fastapi_rest_jsonapi .data_layers .tortoise_orm_engine import TortoiseORMEngine
2424from fastapi_rest_jsonapi .exceptions .json_api import UnsupportedFeatureORM
2525from fastapi_rest_jsonapi .querystring import QueryStringManager
26- from fastapi_rest_jsonapi .signature import (
27- is_necessary_request ,
28- update_signature ,
29- )
26+ from fastapi_rest_jsonapi .signature import update_signature
3027
3128
3229def get_detail_jsonapi (
@@ -41,13 +38,16 @@ def get_detail_jsonapi(
4138 def inner (func : Callable ) -> Callable :
4239 async def wrapper (request : Request , obj_id : int , ** kwargs ):
4340 query_params = QueryStringManager (request = request , schema = schema )
44- data_dict : dict = dict (query_params = query_params , obj_id = obj_id )
45- if is_necessary_request (func ):
46- data_dict ["request" ] = request
47-
48- params_function = OrderedDict (signature (func ).parameters )
49- data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
50- data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
41+ data_dict = {"obj_id" : obj_id }
42+ func_signature = signature (func ).parameters
43+ for i_name , i_type in OrderedDict (func_signature ).items ():
44+ if i_type .annotation is Request :
45+ data_dict [i_name ] = request
46+ elif i_type .annotation is QueryStringManager :
47+ data_dict [i_name ] = query_params
48+
49+ data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in func_signature })
50+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in func_signature }
5151 data_schema : Any = await func (** data_dict )
5252 return schema_resp (
5353 data = {
@@ -86,13 +86,18 @@ def patch_detail_jsonapi(
8686 def inner (func : Callable ) -> Callable :
8787 async def wrapper (request : Request , obj_id : int , data : schema_in , ** kwargs ): # type: ignore
8888 query_params = QueryStringManager (request = request , schema = schema )
89- data_dict : dict = dict (query_params = query_params , obj_id = obj_id , data = getattr (data , "attributes" , data ))
90- if is_necessary_request (func ):
91- data_dict ["request" ] = request
92-
93- params_function = OrderedDict (signature (func ).parameters )
94- data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
95- data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
89+ data_dict = {"obj_id" : obj_id }
90+ func_signature = signature (func ).parameters
91+ for i_name , i_type in OrderedDict (func_signature ).items ():
92+ if i_type .annotation is schema_in .__fields__ ["attributes" ].type_ :
93+ data_dict [i_name ] = getattr (data , 'attributes' , data )
94+ elif i_type .annotation is Request :
95+ data_dict [i_name ] = request
96+ elif i_type .annotation is QueryStringManager :
97+ data_dict [i_name ] = query_params
98+
99+ data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in func_signature })
100+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in func_signature }
96101 data_schema : Any = await func (** data_dict )
97102 return schema_resp (
98103 data = {
@@ -122,13 +127,16 @@ def delete_detail_jsonapi(
122127 def inner (func : Callable ) -> Callable :
123128 async def wrapper (request : Request , obj_id : int , ** kwargs ): # type: ignore
124129 query_params = QueryStringManager (request = request , schema = schema )
125- data_dict : dict = dict (query_params = query_params , obj_id = obj_id )
126- if is_necessary_request (func ):
127- data_dict ["request" ] = request
128-
129- params_function = OrderedDict (signature (func ).parameters )
130- data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
131- data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
130+ data_dict = {"obj_id" : obj_id }
131+ func_signature = signature (func ).parameters
132+ for i_name , i_type in OrderedDict (func_signature ).items ():
133+ if i_type .annotation is Request :
134+ data_dict [i_name ] = request
135+ elif i_type .annotation is QueryStringManager :
136+ data_dict [i_name ] = query_params
137+
138+ data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in func_signature })
139+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in func_signature }
132140 await func (** data_dict )
133141 return Response (status_code = status .HTTP_204_NO_CONTENT )
134142
@@ -163,9 +171,13 @@ async def wrapper(
163171 ** kwargs ,
164172 ):
165173 query_params = QueryStringManager (request = request , schema = schema )
166- data_dict : dict = dict (query_params = query_params )
167- if is_necessary_request (func ):
168- data_dict ["request" ] = request
174+ data_dict = {}
175+ func_signature = signature (func ).parameters
176+ for i_name , i_type in OrderedDict (func_signature ).items ():
177+ if i_type .annotation is Request :
178+ data_dict [i_name ] = request
179+ elif i_type .annotation is QueryStringManager :
180+ data_dict [i_name ] = query_params
169181
170182 params_function = OrderedDict (signature (func ).parameters )
171183 data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
@@ -238,22 +250,21 @@ async def wrapper(
238250 ** kwargs ,
239251 ):
240252 query_params = QueryStringManager (request = request , schema = schema )
241- data = {
242- i_name : query_params
243- for i_name , i_param in OrderedDict (signature (func ).parameters ).items ()
244- if i_param .annotation is QueryStringManager
245- }
246- if is_necessary_request (func ):
247- data ["request" ] = request
248-
249- params_function = OrderedDict (signature (func ).parameters )
250- data .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
251- data = {i_k : i_v for i_k , i_v in data .items () if i_k in params_function }
252- query = await func (** data )
253+ data_dict = {}
254+ func_signature = signature (func ).parameters
255+ for i_name , i_type in OrderedDict (func_signature ).items ():
256+ if i_type .annotation is Request :
257+ data_dict [i_name ] = request
258+ elif i_type .annotation is QueryStringManager :
259+ data_dict [i_name ] = query_params
260+
261+ data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in func_signature })
262+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in func_signature }
263+ query = await func (** data_dict )
253264
254265 if engine is DBORMType .sqlalchemy :
255266 # Для SQLAlchemy нужно указывать session, для Tortoise достаточно модели
256- session_list = [i_v for i_k , i_v in params_function .items () if isinstance (i_v , AsyncSession )]
267+ session_list = [i_v for i_k , i_v in func_signature .items () if isinstance (i_v , AsyncSession )]
257268 session : Optional [AsyncSession ] = session_list and session_list [0 ] or None
258269 else :
259270 session = None
@@ -303,11 +314,17 @@ def post_list_jsonapi(
303314 def inner (func : Callable ) -> Callable :
304315 async def wrapper (request : Request , data : schema_in , ** kwargs ): # type: ignore
305316 query_params = QueryStringManager (request = request , schema = schema )
306- data_dict : dict = dict (query_params = query_params , data = getattr (data , 'attributes' , data ))
307- if is_necessary_request (func ):
308- data_dict ["request" ] = request
309-
310- params_function = OrderedDict (signature (func ).parameters )
317+ data_dict = {}
318+ func_signature = signature (func ).parameters
319+ for i_name , i_type in OrderedDict (func_signature ).items ():
320+ if i_type .annotation is schema_in .__fields__ ["attributes" ].type_ :
321+ data_dict [i_name ] = getattr (data , 'attributes' , data )
322+ elif i_type .annotation is Request :
323+ data_dict [i_name ] = request
324+ elif i_type .annotation is QueryStringManager :
325+ data_dict [i_name ] = query_params
326+
327+ params_function = OrderedDict (func_signature )
311328 data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
312329 data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
313330 data_pydantic : Any = await func (** data_dict )
0 commit comments