11import logging
2- from typing import Any , Dict , List , Tuple , Type
2+ from abc import abstractmethod
3+ from typing import Any , Dict , List , Optional , Tuple , Type
34
45from django .db import models , transaction
56from django .db .models .query import QuerySet
1112
1213
1314class CrudModel (object ):
15+ def __init__ (self , model : Any ):
16+ self .model = model
17+
18+ @abstractmethod
19+ def crud_add_obj (self , ** payload : Dict ) -> Any :
20+ raise NotImplementedError
21+
22+ @abstractmethod
23+ def crud_del_obj (self , pk : int ) -> bool :
24+ raise NotImplementedError
25+
26+ @abstractmethod
27+ def crud_update_obj (self , pk : int , payload : Dict ) -> bool :
28+ raise NotImplementedError
29+
30+ @abstractmethod
31+ def crud_get_obj (self , pk : int ) -> Any :
32+ raise NotImplementedError
33+
34+ @abstractmethod
35+ def crud_get_objs_all (self , maximum : Optional [int ] = None , ** filters : Any ) -> Any :
36+ raise NotImplementedError
37+
38+ @abstractmethod
39+ def crud_filter (self , ** kwargs : Any ) -> QuerySet :
40+ raise NotImplementedError
41+
42+ @abstractmethod
43+ def crud_filter_exclude (self , ** kwargs : Any ) -> QuerySet :
44+ raise NotImplementedError
45+
46+
47+ class DjangoOrmModel (CrudModel ):
1448 def __init__ (self , model : Type [models .Model ]):
1549 self .model = model
1650 self .m2m_fields_list : List = list (
1751 _field
1852 for _field in self .model ._meta .get_fields (include_hidden = True )
1953 if isinstance (_field , models .ManyToManyField )
2054 )
55+ super ().__init__ (model )
2156
2257 def _separate_payload (self , payload : Dict ) -> Tuple [Dict , Dict ]:
2358 m2m_fields = {}
@@ -45,7 +80,7 @@ def _crud_set_m2m_obj(obj: models.Model, m2m_fields: Dict) -> None:
4580
4681 # Define BASE CRUD
4782 @transaction .atomic ()
48- def _crud_add_obj (self , ** payload : Dict ) -> Any :
83+ def crud_add_obj (self , ** payload : Dict ) -> Any :
4984 local_f_payload , m2m_f_payload = self ._separate_payload (payload )
5085
5186 try :
@@ -58,7 +93,7 @@ def _crud_add_obj(self, **payload: Dict) -> Any:
5893 if obj :
5994 return obj .id
6095
61- def _crud_del_obj (self , pk : int ) -> bool :
96+ def crud_del_obj (self , pk : int ) -> bool :
6297 obj = get_object_or_none (self .model , pk = pk )
6398 if obj :
6499 self .model .objects .filter (pk = pk ).delete ()
@@ -67,7 +102,7 @@ def _crud_del_obj(self, pk: int) -> bool:
67102 return False
68103
69104 @transaction .atomic ()
70- def _crud_update_obj (self , pk : int , payload : Dict ) -> bool :
105+ def crud_update_obj (self , pk : int , payload : Dict ) -> bool :
71106 local_fields , m2m_fields = self ._separate_payload (payload )
72107 if not self .model .objects .filter (pk = pk ).exists ():
73108 return False
@@ -78,7 +113,7 @@ def _crud_update_obj(self, pk: int, payload: Dict) -> bool:
78113 raise BaseAPIException (f"Update Error - { e } " )
79114 return bool (obj )
80115
81- def _crud_get_obj (self , pk : int ) -> Any :
116+ def crud_get_obj (self , pk : int ) -> Any :
82117 if self .m2m_fields_list :
83118 qs = self .model .objects .filter (pk = pk ).prefetch_related (
84119 self .m2m_fields_list [0 ].name
@@ -90,10 +125,11 @@ def _crud_get_obj(self, pk: int) -> Any:
90125 if qs :
91126 return qs .first ()
92127
93- def _crud_get_objs_all (self , ** filters : Any ) -> Any :
128+ def crud_get_objs_all (self , maximum : Optional [ int ] = None , ** filters : Any ) -> Any :
94129 """
95130 CRUD: get multiple objects, with django orm filters support
96131 Args:
132+ maximum: {int}
97133 filters: {"field_name__lte", 1}
98134 Returns: qs
99135
@@ -104,6 +140,8 @@ def _crud_get_objs_all(self, **filters: Any) -> Any:
104140 qs = self .model .objects .filter (** filters )
105141 except Exception as e : # pragma: no cover
106142 logger .error (e )
143+ elif maximum :
144+ qs = self .model .objects .all ()[:maximum ]
107145 else :
108146 qs = self .model .objects .all ()
109147 # If there are 2m2_fields
@@ -113,12 +151,8 @@ def _crud_get_objs_all(self, **filters: Any) -> Any:
113151 qs = qs .prefetch_related (f .name )
114152 return qs
115153
116- def _crud_filter (self , ** kwargs : Any ) -> QuerySet :
154+ def crud_filter (self , ** kwargs : Any ) -> Any :
117155 return self .model .objects .filter (** kwargs ) # pragma: no cover
118156
119- def _crud_filter_exclude (self , ** kwargs : Any ) -> QuerySet :
157+ def crud_filter_exclude (self , ** kwargs : Any ) -> Any :
120158 return self .model .objects .all ().exclude (** kwargs )
121-
122-
123- class BaseOrm (CrudModel ):
124- ...
0 commit comments