1+ from admin .models import AuditLogEntry
12from rest_framework import permissions
23from rest_framework .viewsets import ModelViewSet
34
@@ -37,3 +38,59 @@ def get_serializer_class(self):
3738 if self .request .user .is_staff and not self .request .user .should_deny_admin ():
3839 return self .admin_serializer_class
3940 return self .serializer_class
41+
42+
43+ class AuditLoggedViewSet (ModelViewSet ):
44+ def create (self , request , * args , ** kwargs ):
45+ if request .user is not None and request .user .is_staff :
46+ ret = super ().create (request , * args , ** kwargs )
47+
48+ fields = {}
49+ fields ["model_fields" ] = ret .data
50+ fields ["model_name" ] = self .get_serializer ().Meta .model .__name__
51+ AuditLogEntry .objects .create (user = request .user , username = request .user .username , action = "create_model" , extra = fields )
52+
53+ return ret
54+ return super ().create (request , * args , ** kwargs )
55+
56+ def destroy (self , request , * args , ** kwargs ):
57+ if request .user is not None and request .user .is_staff :
58+ instance = self .get_object ()
59+ fields = {}
60+ fields ["model_fields" ] = self .get_serializer (instance ).data
61+ fields ["model_name" ] = instance ._meta .model .__name__
62+ fields ["model_id" ] = instance .id
63+ AuditLogEntry .objects .create (user = request .user , username = request .user .username , action = "destroy_model" , extra = fields )
64+
65+ ret = super ().destroy (request , * args , ** kwargs )
66+
67+ return ret
68+ return super ().destroy (request , * args , ** kwargs )
69+
70+ def update (self , request , * args , ** kwargs ):
71+ if request .user is not None and request .user .is_staff :
72+ old_instance = self .get_object () # Keep track of old data
73+ old_data = self .get_serializer (old_instance ).data
74+
75+ ret = super ().update (request , * args , ** kwargs )
76+
77+ new_instance = self .get_object () # Get the new data
78+ new_data = self .get_serializer (new_instance ).data
79+
80+ diffs = {}
81+
82+ for key , value in new_data .items ():
83+ if old_data .get (key , None ) != value :
84+ diffs [key ] = {
85+ "old" : old_data .get (key , None ),
86+ "new" : new_data .get (key , None )
87+ }
88+
89+ fields = {}
90+ fields ["updated_fields" ] = diffs
91+ fields ["model_name" ] = new_instance ._meta .model .__name__
92+ fields ["model_id" ] = new_instance .id
93+ AuditLogEntry .objects .create (user = request .user , username = request .user .username , action = "update_model" , extra = fields )
94+
95+ return ret
96+ return super ().update (request , * args , ** kwargs )
0 commit comments