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 .exception import BaseAPIException
8
9
from easy .response import BaseApiResponse
9
10
10
11
logger = logging .getLogger (__name__ )
@@ -19,7 +20,7 @@ def __init__(self, model: Type[models.Model]):
19
20
if isinstance (_field , models .ManyToManyField )
20
21
)
21
22
22
- def __separate_payload (self , payload : Dict ) -> Tuple [Dict , Dict ]:
23
+ def _separate_payload (self , payload : Dict ) -> Tuple [Dict , Dict ]:
23
24
m2m_fields = {}
24
25
local_fields = {}
25
26
for _field in payload .keys ():
@@ -35,22 +36,30 @@ def __separate_payload(self, payload: Dict) -> Tuple[Dict, Dict]:
35
36
local_fields .update ({_field : payload [_field ]})
36
37
return local_fields , m2m_fields
37
38
39
+ @staticmethod
40
+ def _crud_set_m2m_obj (obj : models .Model , m2m_fields : Dict ) -> bool :
41
+ if obj and m2m_fields :
42
+ for _field , _value in m2m_fields .items ():
43
+ if _value and isinstance (_value , List ):
44
+ m2m_f = getattr (obj , _field )
45
+ m2m_f .set (_value )
46
+ return True
47
+
38
48
# Define BASE CRUD
49
+ @transaction .atomic ()
39
50
def _crud_add_obj (self , ** payload : Dict ) -> Any :
40
- local_f_payload , m2m_f_payload = self .__separate_payload (payload )
51
+ local_f_payload , m2m_f_payload = self ._separate_payload (payload )
52
+
41
53
# Create obj with local_fields payload
42
- try :
43
- obj = self .model .objects .create (** local_f_payload )
44
- 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 )
54
+ obj = self .model .objects .create (** local_f_payload )
55
+
47
56
# 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
+ set_m2m_status = self . _crud_set_m2m_obj ( obj , m2m_f_payload )
58
+
59
+ if obj and set_m2m_status :
60
+ return obj . id
61
+ else :
62
+ return None
54
63
55
64
def _crud_del_obj (self , pk : int ) -> "BaseApiResponse" :
56
65
obj = get_object_or_none (self .model , pk = pk )
@@ -60,27 +69,18 @@ def _crud_del_obj(self, pk: int) -> "BaseApiResponse":
60
69
else :
61
70
return BaseApiResponse ("Not Found." , errno = 404 )
62
71
63
- def _crud_update_obj (self , pk : int , payload : Dict ) -> "BaseApiResponse" :
64
- local_fields , m2m_fields = self .__separate_payload (payload )
72
+ @transaction .atomic ()
73
+ def _crud_update_obj (self , pk : int , payload : Dict ) -> bool :
74
+ local_fields , m2m_fields = self ._separate_payload (payload )
65
75
if not self .model .objects .filter (pk = pk ).exists ():
66
- return BaseApiResponse ( "Not Found." , errno = 404 )
76
+ return False
67
77
try :
68
78
obj , _ = self .model .objects .update_or_create (pk = pk , defaults = local_fields )
69
79
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." )
80
+ raise BaseAPIException (f"Update Error - { e } " )
81
+
82
+ set_m2m_status = self ._crud_set_m2m_obj (obj , m2m_fields )
83
+ return bool (set_m2m_status and obj )
84
84
85
85
def _crud_get_obj (self , pk : int ) -> Any :
86
86
if self .m2m_fields_list :
0 commit comments