1010from django .utils import timezone
1111from django .utils .encoding import force_text
1212
13- from easyaudit .middleware .easyaudit import get_current_request ,\
14- get_current_user
13+ from easyaudit .middleware .easyaudit import get_current_request , \
14+ get_current_user
1515from easyaudit .models import CRUDEvent
16- from easyaudit .settings import REGISTERED_CLASSES , UNREGISTERED_CLASSES ,\
17- WATCH_MODEL_EVENTS , CRUD_DIFFERENCE_CALLBACKS
16+ from easyaudit .settings import REGISTERED_CLASSES , UNREGISTERED_CLASSES , \
17+ WATCH_MODEL_EVENTS , CRUD_DIFFERENCE_CALLBACKS
1818from easyaudit .utils import model_delta
1919
20-
2120logger = logging .getLogger (__name__ )
2221
2322
@@ -46,14 +45,18 @@ def should_audit(instance):
4645def pre_save (sender , instance , raw , using , update_fields , ** kwargs ):
4746 """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save"""
4847 if raw :
49- # Return if loading Fixtures
50- return
51-
48+ # Return if loading Fixtures
49+ return
50+
5251 try :
5352 with transaction .atomic ():
5453 if not should_audit (instance ):
5554 return False
56- object_json_repr = serializers .serialize ("json" , [instance ])
55+ try :
56+ object_json_repr = serializers .serialize ("json" , [instance ])
57+ except Exception :
58+ # We need a better way for this to work. ManyToMany will fail on pre_save on create
59+ return None
5760
5861 if instance .pk is None :
5962 created = True
@@ -80,32 +83,41 @@ def pre_save(sender, instance, raw, using, update_fields, **kwargs):
8083
8184 # callbacks
8285 kwargs ['request' ] = get_current_request () # make request available for callbacks
83- create_crud_event = all (callback ( instance , object_json_repr , created , raw , using , update_fields , ** kwargs )
84- for callback in CRUD_DIFFERENCE_CALLBACKS if callable ( callback ) )
85-
86+ create_crud_event = all (
87+ callback ( instance , object_json_repr , created , raw , using , update_fields , ** kwargs )
88+ for callback in CRUD_DIFFERENCE_CALLBACKS if callable ( callback ))
8689 # create crud event only if all callbacks returned True
8790 if create_crud_event and not created :
88- crud_event = CRUDEvent .objects .create (
89- event_type = event_type ,
90- object_repr = str (instance ),
91- object_json_repr = object_json_repr ,
92- changed_fields = changed_fields ,
93- content_type = ContentType .objects .get_for_model (instance ),
94- object_id = instance .pk ,
95- user = user ,
96- datetime = timezone .now (),
97- user_pk_as_string = str (user .pk ) if user else user
98- )
91+ c_t = ContentType .objects .get_for_model (instance )
92+ sid = transaction .savepoint ()
93+ try :
94+ with transaction .atomic ():
95+ crud_event = CRUDEvent .objects .create (
96+ event_type = event_type ,
97+ object_repr = str (instance ),
98+ object_json_repr = object_json_repr ,
99+ changed_fields = changed_fields ,
100+ content_type_id = c_t .id ,
101+ object_id = instance .pk ,
102+ user_id = getattr (user , 'id' , None ),
103+ datetime = timezone .now (),
104+ user_pk_as_string = str (user .pk ) if user else user
105+ )
106+ except Exception as e :
107+ logger .exception (
108+ "easy audit had a pre-save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format (
109+ instance , instance .pk ))
110+ transaction .savepoint_rollback (sid )
99111 except Exception :
100112 logger .exception ('easy audit had a pre-save exception.' )
101113
102114
103115def post_save (sender , instance , created , raw , using , update_fields , ** kwargs ):
104116 """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save"""
105117 if raw :
106- # Return if loading Fixtures
107- return
108-
118+ # Return if loading Fixtures
119+ return
120+
109121 try :
110122 with transaction .atomic ():
111123 if not should_audit (instance ):
@@ -130,22 +142,31 @@ def post_save(sender, instance, created, raw, using, update_fields, **kwargs):
130142 # callbacks
131143 kwargs ['request' ] = get_current_request () # make request available for callbacks
132144 create_crud_event = all (callback (instance , object_json_repr ,
133- created , raw , using , update_fields , ** kwargs )
145+ created , raw , using , update_fields , ** kwargs )
134146 for callback in CRUD_DIFFERENCE_CALLBACKS
135147 if callable (callback ))
136148
137149 # create crud event only if all callbacks returned True
138150 if create_crud_event and created :
139- crud_event = CRUDEvent .objects .create (
140- event_type = event_type ,
141- object_repr = str (instance ),
142- object_json_repr = object_json_repr ,
143- content_type = ContentType .objects .get_for_model (instance ),
144- object_id = instance .pk ,
145- user = user ,
146- datetime = timezone .now (),
147- user_pk_as_string = str (user .pk ) if user else user
148- )
151+ c_t = ContentType .objects .get_for_model (instance )
152+ sid = transaction .savepoint ()
153+ try :
154+ with transaction .atomic ():
155+ crud_event = CRUDEvent .objects .create (
156+ event_type = event_type ,
157+ object_repr = str (instance ),
158+ object_json_repr = object_json_repr ,
159+ content_type_id = c_t .id ,
160+ object_id = instance .pk ,
161+ user_id = getattr (user , 'id' , None ),
162+ datetime = timezone .now (),
163+ user_pk_as_string = str (user .pk ) if user else user
164+ )
165+ except Exception as e :
166+ logger .exception (
167+ "easy audit had a pre-save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format (
168+ instance , instance .pk ))
169+ transaction .savepoint_rollback (sid )
149170 except Exception :
150171 logger .exception ('easy audit had a post-save exception.' )
151172
@@ -161,8 +182,8 @@ def _m2m_rev_field_name(model1, model2):
161182 m2m_field_names = [
162183 rel .get_accessor_name () for rel in model1 ._meta .get_fields ()
163184 if rel .many_to_many
164- and rel .auto_created
165- and rel .related_model == model2
185+ and rel .auto_created
186+ and rel .related_model == model2
166187 ]
167188 return m2m_field_names [0 ]
168189
@@ -206,17 +227,26 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
206227
207228 if isinstance (user , AnonymousUser ):
208229 user = None
230+ c_t = ContentType .objects .get_for_model (instance )
231+ sid = transaction .savepoint ()
209232
210- crud_event = CRUDEvent .objects .create (
211- event_type = event_type ,
212- object_repr = str (instance ),
213- object_json_repr = object_json_repr ,
214- content_type = ContentType .objects .get_for_model (instance ),
215- object_id = instance .pk ,
216- user = user ,
217- datetime = timezone .now (),
218- user_pk_as_string = str (user .pk ) if user else user
219- )
233+ try :
234+ with transaction .atomic ():
235+ crud_event = CRUDEvent .objects .create (
236+ event_type = event_type ,
237+ object_repr = str (instance ),
238+ object_json_repr = object_json_repr ,
239+ content_type_id = c_t .id ,
240+ object_id = instance .pk ,
241+ user_id = getattr (user , 'id' , None ),
242+ datetime = timezone .now (),
243+ user_pk_as_string = str (user .pk ) if user else user
244+ )
245+ except Exception as e :
246+ logger .exception (
247+ "easy audit had a pre-save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format (
248+ instance , instance .pk ))
249+ transaction .savepoint_rollback (sid )
220250 except Exception :
221251 logger .exception ('easy audit had an m2m-changed exception.' )
222252
@@ -240,18 +270,27 @@ def post_delete(sender, instance, using, **kwargs):
240270
241271 if isinstance (user , AnonymousUser ):
242272 user = None
243-
244- # crud event
245- crud_event = CRUDEvent .objects .create (
246- event_type = CRUDEvent .DELETE ,
247- object_repr = str (instance ),
248- object_json_repr = object_json_repr ,
249- content_type = ContentType .objects .get_for_model (instance ),
250- object_id = instance .pk ,
251- user = user ,
252- datetime = timezone .now (),
253- user_pk_as_string = str (user .pk ) if user else user
254- )
273+ c_t = ContentType .objects .get_for_model (instance )
274+ sid = transaction .savepoint ()
275+ try :
276+ with transaction .atomic ():
277+ # crud event
278+ crud_event = CRUDEvent .objects .create (
279+ event_type = CRUDEvent .DELETE ,
280+ object_repr = str (instance ),
281+ object_json_repr = object_json_repr ,
282+ content_type_id = c_t .id ,
283+ object_id = instance .pk ,
284+ user_id = getattr (user , 'id' , None ),
285+ datetime = timezone .now (),
286+ user_pk_as_string = str (user .pk ) if user else user
287+ )
288+
289+ except Exception as e :
290+ logger .exception (
291+ "easy audit had a pre-save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format (
292+ instance , instance .pk ))
293+ transaction .savepoint_rollback (sid )
255294 except Exception :
256295 logger .exception ('easy audit had a post-delete exception.' )
257296
0 commit comments