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,12 +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 })
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 }
5051 data_schema : Any = await func (** data_dict )
5152 return schema_resp (
5253 data = {
@@ -85,12 +86,18 @@ def patch_detail_jsonapi(
8586 def inner (func : Callable ) -> Callable :
8687 async def wrapper (request : Request , obj_id : int , data : schema_in , ** kwargs ): # type: ignore
8788 query_params = QueryStringManager (request = request , schema = schema )
88- data_dict : dict = dict (query_params = query_params , obj_id = obj_id , data = getattr (data , "attributes" , data ))
89- if is_necessary_request (func ):
90- data_dict ["request" ] = request
91-
92- params_function = OrderedDict (signature (func ).parameters )
93- data_dict .update ({i_k : i_v for i_k , i_v in kwargs .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 }
94101 data_schema : Any = await func (** data_dict )
95102 return schema_resp (
96103 data = {
@@ -120,18 +127,68 @@ def delete_detail_jsonapi(
120127 def inner (func : Callable ) -> Callable :
121128 async def wrapper (request : Request , obj_id : int , ** kwargs ): # type: ignore
122129 query_params = QueryStringManager (request = request , schema = schema )
123- data_dict : dict = dict (query_params = query_params , obj_id = obj_id )
124- if is_necessary_request (func ):
125- data_dict ["request" ] = request
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 }
140+ await func (** data_dict )
141+ return Response (status_code = status .HTTP_204_NO_CONTENT )
142+
143+ # mypy ругается что нет метода __signature__, как это обойти красиво- не знаю
144+ wrapper .__signature__ = update_signature ( # type: ignore
145+ sig = signature (wrapper ),
146+ other = OrderedDict (signature (func ).parameters ),
147+ )
148+ return wrapper
149+
150+ return inner
151+
152+
153+ def delete_list_jsonapi (
154+ schema : Type [BaseModel ],
155+ model : Type [TypeModel ],
156+ engine : DBORMType ,
157+ ) -> Callable :
158+ """DELETE method router (Decorator for JSON API)."""
159+
160+ def inner (func : Callable ) -> Callable :
161+ async def wrapper (
162+ request : Request ,
163+ filters_list : Optional [str ] = Query (
164+ None ,
165+ alias = "filter" ,
166+ description = "[Filtering docs](https://flask-combo-jsonapi.readthedocs.io/en/latest/filtering.html)"
167+ "\n Examples:\n * filter for timestamp interval: "
168+ '`[{"name": "timestamp", "op": "ge", "val": "2020-07-16T11:35:33.383"},'
169+ '{"name": "timestamp", "op": "le", "val": "2020-07-21T11:35:33.383"}]`' ,
170+ ),
171+ ** kwargs ,
172+ ):
173+ query_params = QueryStringManager (request = request , schema = schema )
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
126181
127182 params_function = OrderedDict (signature (func ).parameters )
128183 data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
184+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
129185 await func (** data_dict )
130186 return Response (status_code = status .HTTP_204_NO_CONTENT )
131187
132188 # mypy ругается что нет метода __signature__, как это обойти красиво- не знаю
133189 wrapper .__signature__ = update_signature ( # type: ignore
134190 sig = signature (wrapper ),
191+ schema = schema ,
135192 other = OrderedDict (signature (func ).parameters ),
136193 )
137194 return wrapper
@@ -193,21 +250,21 @@ async def wrapper(
193250 ** kwargs ,
194251 ):
195252 query_params = QueryStringManager (request = request , schema = schema )
196- data = {
197- i_name : query_params
198- for i_name , i_param in OrderedDict (signature ( func ). parameters ). items ()
199- if i_param .annotation is QueryStringManager
200- }
201- if is_necessary_request ( func ) :
202- data [ "request" ] = request
203-
204- params_function = OrderedDict ( signature ( func ). parameters )
205- data . update ( {i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
206- 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 )
207264
208265 if engine is DBORMType .sqlalchemy :
209266 # Для SQLAlchemy нужно указывать session, для Tortoise достаточно модели
210- 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 )]
211268 session : Optional [AsyncSession ] = session_list and session_list [0 ] or None
212269 else :
213270 session = None
@@ -257,12 +314,19 @@ def post_list_jsonapi(
257314 def inner (func : Callable ) -> Callable :
258315 async def wrapper (request : Request , data : schema_in , ** kwargs ): # type: ignore
259316 query_params = QueryStringManager (request = request , schema = schema )
260- data_dict : dict = dict (query_params = query_params , data = getattr (data , 'attributes' , data ))
261- if is_necessary_request (func ):
262- data_dict ["request" ] = request
263-
264- 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 )
265328 data_dict .update ({i_k : i_v for i_k , i_v in kwargs .items () if i_k in params_function })
329+ data_dict = {i_k : i_v for i_k , i_v in data_dict .items () if i_k in params_function }
266330 data_pydantic : Any = await func (** data_dict )
267331 return schema_resp (
268332 data = {
0 commit comments