Skip to content

Commit 7e92f68

Browse files
committed
fix interfaces, upgrade example
1 parent ac60fe2 commit 7e92f68

File tree

5 files changed

+86
-38
lines changed

5 files changed

+86
-38
lines changed

docs/data_layer.rst

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ Data layer
99
|
1010
| FastAPI-JSONAPI has a full-featured data layer that uses the popular ORM `SQLAlchemy <https://www.sqlalchemy.org/>`_.
1111
12-
.. note::
13-
14-
The default data layer used by a resource manager is the SQLAlchemy one. So if that's what you want to use, you don't have to specify the class of the data layer in the resource manager
15-
1612
To configure the data layer you have to set its required parameters in the resource manager.
1713

1814
Example:

docs/python_snippets/data_layer/custom_data_layer.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@
22

33
from fastapi_jsonapi import RoutersJSONAPI
44
from fastapi_jsonapi.data_layers.base import BaseDataLayer
5+
from fastapi_jsonapi.data_layers.sqla_orm import SqlalchemyDataLayer
56
from fastapi_jsonapi.views.detail_view import DetailViewBase
67
from fastapi_jsonapi.views.list_view import ListViewBase
78

89

910
class MyCustomDataLayer(BaseDataLayer):
1011
"""Overload abstract methods here"""
1112

13+
...
14+
15+
16+
class MyCustomSqlaDataLayer(SqlalchemyDataLayer):
17+
"""Overload any methods here"""
18+
19+
async def before_delete_objects(self, objects: list, view_kwargs: dict):
20+
raise Exception("not allowed to delete objects")
21+
1222

1323
class UserDetailView(DetailViewBase):
1424
data_layer_cls = MyCustomDataLayer

fastapi_jsonapi/data_layers/base.py

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import types
8-
from typing import Optional, Tuple, Type
8+
from typing import List, Optional, Tuple, Type
99

1010
from fastapi_jsonapi.data_typing import TypeModel, TypeSchema
1111
from fastapi_jsonapi.querystring import QueryStringManager
@@ -242,7 +242,7 @@ def query(self, view_kwargs):
242242
"""
243243
raise NotImplementedError
244244

245-
def before_create_object(self, data, view_kwargs):
245+
async def before_create_object(self, data, view_kwargs):
246246
"""
247247
Provide additional data before object creation
248248
@@ -251,7 +251,7 @@ def before_create_object(self, data, view_kwargs):
251251
"""
252252
raise NotImplementedError
253253

254-
def after_create_object(self, obj, data, view_kwargs):
254+
async def after_create_object(self, obj, data, view_kwargs):
255255
"""
256256
Provide additional data after object creation
257257
@@ -307,7 +307,7 @@ async def before_update_object(self, obj, data, view_kwargs):
307307
"""
308308
raise NotImplementedError
309309

310-
def after_update_object(self, obj, data, view_kwargs):
310+
async def after_update_object(self, obj: TypeModel, data, view_kwargs):
311311
"""
312312
Make work after update object
313313
@@ -317,7 +317,7 @@ def after_update_object(self, obj, data, view_kwargs):
317317
"""
318318
raise NotImplementedError
319319

320-
def before_delete_object(self, obj, view_kwargs):
320+
async def before_delete_object(self, obj: TypeModel, view_kwargs):
321321
"""
322322
Make checks before delete object
323323
@@ -326,7 +326,7 @@ def before_delete_object(self, obj, view_kwargs):
326326
"""
327327
raise NotImplementedError
328328

329-
def after_delete_object(self, obj, view_kwargs):
329+
async def after_delete_object(self, obj: TypeModel, view_kwargs):
330330
"""
331331
Make work after delete object
332332
@@ -335,11 +335,29 @@ def after_delete_object(self, obj, view_kwargs):
335335
"""
336336
raise NotImplementedError
337337

338-
def delete_objects(self, objects, view_kwargs):
338+
async def delete_objects(self, objects: List[TypeModel], view_kwargs):
339339
# TODO: doc
340340
raise NotImplementedError
341341

342-
def before_create_relationship(
342+
async def before_delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
343+
"""
344+
Make checks before deleting objects.
345+
346+
:param objects: an object from data layer.
347+
:param view_kwargs: kwargs from the resource view.
348+
"""
349+
pass
350+
351+
async def after_delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
352+
"""
353+
Any action after deleting objects.
354+
355+
:param objects: an object from data layer.
356+
:param view_kwargs: kwargs from the resource view.
357+
"""
358+
pass
359+
360+
async def before_create_relationship(
343361
self,
344362
json_data,
345363
relationship_field,
@@ -357,7 +375,7 @@ def before_create_relationship(
357375
"""
358376
raise NotImplementedError
359377

360-
def after_create_relationship(
378+
async def after_create_relationship(
361379
self,
362380
obj,
363381
updated,
@@ -419,7 +437,7 @@ async def after_get_relationship(
419437
"""
420438
raise NotImplementedError
421439

422-
def before_update_relationship(
440+
async def before_update_relationship(
423441
self,
424442
json_data,
425443
relationship_field,
@@ -437,7 +455,7 @@ def before_update_relationship(
437455
"""
438456
raise NotImplementedError
439457

440-
def after_update_relationship(
458+
async def after_update_relationship(
441459
self,
442460
obj,
443461
updated,
@@ -459,7 +477,7 @@ def after_update_relationship(
459477
"""
460478
raise NotImplementedError
461479

462-
def before_delete_relationship(
480+
async def before_delete_relationship(
463481
self,
464482
json_data,
465483
relationship_field,
@@ -476,7 +494,7 @@ def before_delete_relationship(
476494
"""
477495
raise NotImplementedError
478496

479-
def after_delete_relationship(
497+
async def after_delete_relationship(
480498
self,
481499
obj,
482500
updated,

fastapi_jsonapi/data_layers/sqla_orm.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ async def delete_object(self, obj: TypeModel, view_kwargs: dict):
353353
:param obj: an item from sqlalchemy.
354354
:param view_kwargs: kwargs from the resource view.
355355
"""
356+
await self.before_delete_object(obj, view_kwargs)
356357
try:
357358
await self.session.delete(obj)
358359
await self.session.commit()
@@ -367,7 +368,10 @@ async def delete_object(self, obj: TypeModel, view_kwargs: dict):
367368
pointer="/data",
368369
)
369370

371+
await self.after_delete_object(obj, view_kwargs)
372+
370373
async def delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
374+
await self.before_delete_objects(objects, view_kwargs)
371375
query = delete(self.model).filter(self.model.id.in_((obj.id for obj in objects)))
372376

373377
try:
@@ -379,6 +383,8 @@ async def delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
379383
detail=f"Got an error {e.__class__.__name__} during delete data from DB: {e!s}",
380384
)
381385

386+
await self.after_delete_objects(objects, view_kwargs)
387+
382388
async def create_relationship(
383389
self,
384390
json_data: dict,
@@ -729,7 +735,7 @@ async def after_update_object(self, obj: Any, model_kwargs: dict, view_kwargs: d
729735
"""
730736
pass
731737

732-
def before_delete_object(self, obj: Any, view_kwargs: dict):
738+
async def before_delete_object(self, obj: TypeModel, view_kwargs: dict):
733739
"""
734740
Make checks before delete object.
735741
@@ -738,7 +744,7 @@ def before_delete_object(self, obj: Any, view_kwargs: dict):
738744
"""
739745
pass
740746

741-
def after_delete_object(self, obj: Any, view_kwargs: dict):
747+
async def after_delete_object(self, obj: TypeModel, view_kwargs: dict):
742748
"""
743749
Make work after delete object.
744750
@@ -747,7 +753,25 @@ def after_delete_object(self, obj: Any, view_kwargs: dict):
747753
"""
748754
pass
749755

750-
def before_create_relationship(
756+
async def before_delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
757+
"""
758+
Make checks before deleting objects.
759+
760+
:param objects: an object from data layer.
761+
:param view_kwargs: kwargs from the resource view.
762+
"""
763+
pass
764+
765+
async def after_delete_objects(self, objects: List[TypeModel], view_kwargs: dict):
766+
"""
767+
Any actions after deleting objects.
768+
769+
:param objects: an object from data layer.
770+
:param view_kwargs: kwargs from the resource view.
771+
"""
772+
pass
773+
774+
async def before_create_relationship(
751775
self,
752776
json_data: dict,
753777
relationship_field: str,
@@ -765,7 +789,7 @@ def before_create_relationship(
765789
"""
766790
pass
767791

768-
def after_create_relationship(
792+
async def after_create_relationship(
769793
self,
770794
obj: Any,
771795
updated: bool,
@@ -827,7 +851,7 @@ async def after_get_relationship(
827851
"""
828852
pass
829853

830-
def before_update_relationship(
854+
async def before_update_relationship(
831855
self,
832856
json_data: dict,
833857
relationship_field: str,
@@ -845,7 +869,7 @@ def before_update_relationship(
845869
"""
846870
pass
847871

848-
def after_update_relationship(
872+
async def after_update_relationship(
849873
self,
850874
obj: Any,
851875
updated: bool,
@@ -867,7 +891,7 @@ def after_update_relationship(
867891
"""
868892
pass
869893

870-
def before_delete_relationship(
894+
async def before_delete_relationship(
871895
self,
872896
json_data: dict,
873897
relationship_field: str,
@@ -884,7 +908,7 @@ def before_delete_relationship(
884908
"""
885909
pass
886910

887-
def after_delete_relationship(
911+
async def after_delete_relationship(
888912
self,
889913
obj: Any,
890914
updated: bool,

fastapi_jsonapi/data_layers/tortoise_orm.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""This module is a CRUD interface between resource managers and the Tortoise ORM"""
22

3-
from typing import Any, Iterable, List, Optional, Tuple, Type
3+
from typing import Any, Iterable, Optional, Tuple, Type
44

55
from tortoise.queryset import QuerySet
66

@@ -124,7 +124,7 @@ async def update_object(
124124
:return: True if object have changed else False.
125125
"""
126126

127-
async def delete_object(self, objects: List[TypeModel], view_kwargs: dict):
127+
async def delete_object(self, obj: TypeModel, view_kwargs: dict):
128128
"""
129129
Delete an object through Tortoise.
130130
@@ -263,15 +263,15 @@ def query(self, view_kwargs: dict) -> QuerySet:
263263
"""
264264
return self.query_
265265

266-
def before_create_object(self, data: dict, view_kwargs: dict):
266+
async def before_create_object(self, data: dict, view_kwargs: dict):
267267
"""
268268
Provide additional data before object creation.
269269
270270
:param data: the data validated by pydantic.
271271
:param view_kwargs: kwargs from the resource view.
272272
"""
273273

274-
def after_create_object(self, obj: Any, data: dict, view_kwargs: dict):
274+
async def after_create_object(self, obj: Any, data: dict, view_kwargs: dict):
275275
"""
276276
Provide additional data after object creation.
277277
@@ -322,7 +322,7 @@ async def before_update_object(self, obj: Any, data: dict, view_kwargs: dict):
322322
:param view_kwargs: kwargs from the resource view.
323323
"""
324324

325-
def after_update_object(self, obj: Any, data: dict, view_kwargs: dict):
325+
async def after_update_object(self, obj: Any, data: dict, view_kwargs: dict):
326326
"""
327327
Make work after update object.
328328
@@ -331,23 +331,23 @@ def after_update_object(self, obj: Any, data: dict, view_kwargs: dict):
331331
:param view_kwargs: kwargs from the resource view.
332332
"""
333333

334-
def before_delete_object(self, obj: Any, view_kwargs: dict):
334+
async def before_delete_object(self, obj: Any, view_kwargs: dict):
335335
"""
336336
Make checks before delete object.
337337
338338
:param obj: an object from data layer.
339339
:param view_kwargs: kwargs from the resource view.
340340
"""
341341

342-
def after_delete_object(self, obj: Any, view_kwargs: dict):
342+
async def after_delete_object(self, obj: Any, view_kwargs: dict):
343343
"""
344344
Make work after delete object.
345345
346346
:param obj: an object from data layer.
347347
:param view_kwargs: kwargs from the resource view.
348348
"""
349349

350-
def before_create_relationship(
350+
async def before_create_relationship(
351351
self,
352352
json_data: dict,
353353
relationship_field: str,
@@ -364,7 +364,7 @@ def before_create_relationship(
364364
:return boolean: True if relationship have changed else False.
365365
"""
366366

367-
def after_create_relationship(
367+
async def after_create_relationship(
368368
self,
369369
obj: Any,
370370
updated: bool,
@@ -423,7 +423,7 @@ async def after_get_relationship(
423423
:return tuple: the object and related object(s).
424424
"""
425425

426-
def before_update_relationship(
426+
async def before_update_relationship(
427427
self,
428428
json_data: dict,
429429
relationship_field: str,
@@ -440,7 +440,7 @@ def before_update_relationship(
440440
:return boolean: True if relationship have changed else False.
441441
"""
442442

443-
def after_update_relationship(
443+
async def after_update_relationship(
444444
self,
445445
obj: Any,
446446
updated: bool,
@@ -461,7 +461,7 @@ def after_update_relationship(
461461
:return boolean: True if relationship have changed else False.
462462
"""
463463

464-
def before_delete_relationship(
464+
async def before_delete_relationship(
465465
self,
466466
json_data: dict,
467467
relationship_field: str,
@@ -477,7 +477,7 @@ def before_delete_relationship(
477477
:param view_kwargs: kwargs from the resource view.
478478
"""
479479

480-
def after_delete_relationship(
480+
async def after_delete_relationship(
481481
self,
482482
obj: Any,
483483
updated: bool,

0 commit comments

Comments
 (0)