1
1
import logging
2
2
from typing import Any , Dict , List , Tuple , Type
3
3
4
- from django .db import models
4
+ from django .db import models , transaction
5
5
from django .db .models .query import QuerySet
6
6
from ninja_extra .shortcuts import get_object_or_none
7
7
8
- from easy .response import BaseApiResponse
8
+ from easy .exception import BaseAPIException
9
9
10
10
logger = logging .getLogger (__name__ )
11
11
@@ -19,7 +19,7 @@ def __init__(self, model: Type[models.Model]):
19
19
if isinstance (_field , models .ManyToManyField )
20
20
)
21
21
22
- def __separate_payload (self , payload : Dict ) -> Tuple [Dict , Dict ]:
22
+ def _separate_payload (self , payload : Dict ) -> Tuple [Dict , Dict ]:
23
23
m2m_fields = {}
24
24
local_fields = {}
25
25
for _field in payload .keys ():
@@ -35,70 +35,60 @@ def __separate_payload(self, payload: Dict) -> Tuple[Dict, Dict]:
35
35
local_fields .update ({_field : payload [_field ]})
36
36
return local_fields , m2m_fields
37
37
38
+ @staticmethod
39
+ def _crud_set_m2m_obj (obj : models .Model , m2m_fields : Dict ) -> None :
40
+ if obj and m2m_fields :
41
+ for _field , _value in m2m_fields .items ():
42
+ if _value and isinstance (_value , List ):
43
+ m2m_f = getattr (obj , _field )
44
+ m2m_f .set (_value )
45
+
38
46
# Define BASE CRUD
47
+ @transaction .atomic ()
39
48
def _crud_add_obj (self , ** payload : Dict ) -> Any :
40
- local_f_payload , m2m_f_payload = self .__separate_payload (payload )
41
- # Create obj with local_fields payload
49
+ local_f_payload , m2m_f_payload = self ._separate_payload (payload )
50
+
42
51
try :
52
+ # Create obj with local_fields payload
43
53
obj = self .model .objects .create (** local_f_payload )
54
+ # Save obj with m2m_fields payload
55
+ self ._crud_set_m2m_obj (obj , m2m_f_payload )
44
56
except Exception as e : # pragma: no cover
45
- logger .error (f"Crud_add Error - { e } " , exc_info = True )
46
- return BaseApiResponse (str (e ), message = "Add failed" , errno = 500 )
47
- # Save obj with m2m_fields payload
48
- if m2m_f_payload :
49
- for _field , _value in m2m_f_payload .items ():
50
- if _value and isinstance (_value , List ):
51
- m2m_f = getattr (obj , _field )
52
- m2m_f .set (_value )
53
- return BaseApiResponse ({"id" : obj .pk }, errno = 201 )
57
+ raise BaseAPIException (f"Create Error - { e } " )
58
+ if obj :
59
+ return obj .id
54
60
55
- def _crud_del_obj (self , pk : int ) -> "BaseApiResponse" :
61
+ def _crud_del_obj (self , pk : int ) -> bool :
56
62
obj = get_object_or_none (self .model , pk = pk )
57
63
if obj :
58
64
self .model .objects .filter (pk = pk ).delete ()
59
- return BaseApiResponse ( "Deleted." , errno = 204 )
65
+ return True
60
66
else :
61
- return BaseApiResponse ( "Not Found." , errno = 404 )
67
+ return False
62
68
63
- def _crud_update_obj (self , pk : int , payload : Dict ) -> "BaseApiResponse" :
64
- local_fields , m2m_fields = self .__separate_payload (payload )
69
+ @transaction .atomic ()
70
+ def _crud_update_obj (self , pk : int , payload : Dict ) -> bool :
71
+ local_fields , m2m_fields = self ._separate_payload (payload )
65
72
if not self .model .objects .filter (pk = pk ).exists ():
66
- return BaseApiResponse ( "Not Found." , errno = 404 )
73
+ return False
67
74
try :
68
75
obj , _ = self .model .objects .update_or_create (pk = pk , defaults = local_fields )
76
+ self ._crud_set_m2m_obj (obj , m2m_fields )
69
77
except Exception as e : # pragma: no cover
70
- logger .error (f"Crud_update Error - { e } " , exc_info = True )
71
- return BaseApiResponse (str (e ), message = "Update Failed" , errno = 500 )
72
- if obj and m2m_fields :
73
- for _field , _value in m2m_fields .items ():
74
- if _value :
75
- m2m_f = getattr (obj , _field )
76
- try :
77
- m2m_f .set (_value )
78
- except Exception as e : # pragma: no cover
79
- logger .error (f"Crud_update Error - { e } " , exc_info = True )
80
- return BaseApiResponse (
81
- str (e ), message = "Update Failed" , errno = 500
82
- )
83
- return BaseApiResponse ({"pk" : pk }, message = "Updated." )
78
+ raise BaseAPIException (f"Update Error - { e } " )
79
+ return bool (obj )
84
80
85
81
def _crud_get_obj (self , pk : int ) -> Any :
86
- try :
87
- if self .m2m_fields_list :
88
- qs = self .model .objects .filter (pk = pk ).prefetch_related (
89
- self .m2m_fields_list [0 ].name
90
- )
91
- for f in self .m2m_fields_list [1 :]:
92
- qs = qs .prefetch_related (f .name )
93
- else :
94
- qs = self .model .objects .filter (pk = pk )
95
- except Exception as e : # pragma: no cover
96
- logger .error (f"Get Error - { e } " , exc_info = True )
97
- return BaseApiResponse (str (e ), message = "Get Failed" , errno = 500 )
82
+ if self .m2m_fields_list :
83
+ qs = self .model .objects .filter (pk = pk ).prefetch_related (
84
+ self .m2m_fields_list [0 ].name
85
+ )
86
+ for f in self .m2m_fields_list [1 :]:
87
+ qs = qs .prefetch_related (f .name )
88
+ else :
89
+ qs = self .model .objects .filter (pk = pk )
98
90
if qs :
99
91
return qs .first ()
100
- else :
101
- return BaseApiResponse (message = "Not Found" , errno = 404 )
102
92
103
93
def _crud_get_objs_all (self , maximum : int = None , ** filters : Any ) -> Any :
104
94
"""
0 commit comments