Skip to content

Commit 817679c

Browse files
hugobranquinhojheld
authored andcommitted
Allow to ignore request.user validation
If setting `DJANGO_EASY_AUDIT_CHECK_IF_REQUEST_USER_EXISTS` set to `False`, no `request.user` validation is made on DB. This allow the calling proejct to ignore user validation and speed up audit creation, plus, save some DB queries.
1 parent 421520a commit 817679c

File tree

2 files changed

+34
-43
lines changed

2 files changed

+34
-43
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,11 @@ Below are some of the settings you may want to use. These should be defined in y
106106
determined by the `pre_save` handler sees that there are no changed fields. We are keeping it off by default so that
107107
projects that wish to use this (potentially less `CRUDEvent`) can choose to turn it on! And those that do not want it (yet or ever),
108108
or those that do not closely follow the release notes of this project will have one less worry when upgrading.
109-
109+
110+
* `DJANGO_EASY_AUDIT_CHECK_IF_REQUEST_USER_EXISTS`
111+
112+
By default this is `True`, but this allows the calling project to make easyaudit ignore user validation on audit event creation.
113+
This is useful when you have a app with soft delete or no delete on users model. With this set to `False`, easyaudit only fetch `request.user` for audit event creation, no db check is made, meaning you can speed up audit events creation and save some DB calls.
110114

111115
* `DJANGO_EASY_AUDIT_READONLY_EVENTS`
112116

easyaudit/signals/model_signals.py

Lines changed: 29 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,23 @@ def should_audit(instance):
4646
return True
4747

4848

49+
def get_current_user_details():
50+
user_id = None
51+
user_pk_as_string = None
52+
53+
try:
54+
user = get_current_user()
55+
if user and not isinstance(user, AnonymousUser):
56+
if getattr(settings, "DJANGO_EASY_AUDIT_CHECK_IF_REQUEST_USER_EXISTS", True):
57+
# validate that the user still exists
58+
user = get_user_model().objects.get(pk=user.pk)
59+
user_id, user_pk_as_string = user.id, str(user.pk)
60+
except:
61+
pass
62+
63+
return user_id, user_pk_as_string
64+
65+
4966
# signals
5067
def pre_save(sender, instance, raw, using, update_fields, **kwargs):
5168
"""https://docs.djangoproject.com/es/1.10/ref/signals/#post-save"""
@@ -76,15 +93,7 @@ def pre_save(sender, instance, raw, using, update_fields, **kwargs):
7693
event_type = CRUDEvent.UPDATE
7794

7895
# user
79-
try:
80-
user = get_current_user()
81-
# validate that the user still exists
82-
user = get_user_model().objects.get(pk=user.pk)
83-
except:
84-
user = None
85-
86-
if isinstance(user, AnonymousUser):
87-
user = None
96+
user_id, user_pk_as_string = get_current_user_details()
8897

8998
# callbacks
9099
kwargs['request'] = get_current_request() # make request available for callbacks
@@ -106,9 +115,9 @@ def crud_flow():
106115
'changed_fields': changed_fields,
107116
'content_type_id': c_t.id,
108117
'object_id': instance.pk,
109-
'user_id': getattr(user, 'id', None),
118+
'user_id': user_id,
110119
'datetime': timezone.now(),
111-
'user_pk_as_string': str(user.pk) if user else user
120+
'user_pk_as_string': user_pk_as_string,
112121
})
113122
except Exception as e:
114123
try:
@@ -142,15 +151,7 @@ def post_save(sender, instance, created, raw, using, update_fields, **kwargs):
142151
event_type = CRUDEvent.CREATE
143152

144153
# user
145-
try:
146-
user = get_current_user()
147-
# validate that the user still exists
148-
user = get_user_model().objects.get(pk=user.pk)
149-
except:
150-
user = None
151-
152-
if isinstance(user, AnonymousUser):
153-
user = None
154+
user_id, user_pk_as_string = get_current_user_details()
154155

155156
# callbacks
156157
kwargs['request'] = get_current_request() # make request available for callbacks
@@ -172,9 +173,9 @@ def crud_flow():
172173
'object_json_repr': object_json_repr,
173174
'content_type_id': c_t.id,
174175
'object_id': instance.pk,
175-
'user_id': getattr(user, 'id', None),
176+
'user_id': user_id,
176177
'datetime': timezone.now(),
177-
'user_pk_as_string': str(user.pk) if user else user
178+
'user_pk_as_string': user_pk_as_string
178179
})
179180
except Exception as e:
180181
try:
@@ -253,15 +254,8 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
253254
event_type = CRUDEvent.M2M_CHANGE # just in case
254255

255256
# user
256-
try:
257-
user = get_current_user()
258-
# validate that the user still exists
259-
user = get_user_model().objects.get(pk=user.pk)
260-
except:
261-
user = None
257+
user_id, user_pk_as_string = get_current_user_details()
262258

263-
if isinstance(user, AnonymousUser):
264-
user = None
265259
c_t = ContentType.objects.get_for_model(instance)
266260

267261
def crud_flow():
@@ -278,9 +272,9 @@ def crud_flow():
278272
'changed_fields': changed_fields,
279273
'content_type_id': c_t.id,
280274
'object_id': instance.pk,
281-
'user_id': getattr(user, 'id', None),
275+
'user_id': user_id,
282276
'datetime': timezone.now(),
283-
'user_pk_as_string': str(user.pk) if user else user
277+
'user_pk_as_string': user_pk_as_string
284278
})
285279
except Exception as e:
286280
try:
@@ -308,15 +302,8 @@ def post_delete(sender, instance, using, **kwargs):
308302
object_json_repr = serializers.serialize("json", [instance])
309303

310304
# user
311-
try:
312-
user = get_current_user()
313-
# validate that the user still exists
314-
user = get_user_model().objects.get(pk=user.pk)
315-
except:
316-
user = None
305+
user_id, user_pk_as_string = get_current_user_details()
317306

318-
if isinstance(user, AnonymousUser):
319-
user = None
320307
c_t = ContentType.objects.get_for_model(instance)
321308

322309
# object id to be used later
@@ -332,9 +319,9 @@ def crud_flow():
332319
'object_json_repr': object_json_repr,
333320
'content_type_id': c_t.id,
334321
'object_id': obj_id,
335-
'user_id': getattr(user, 'id', None),
322+
'user_id': user_id,
336323
'datetime': timezone.now(),
337-
'user_pk_as_string': str(user.pk) if user else user
324+
'user_pk_as_string': user_pk_as_string
338325
})
339326

340327
except Exception as e:

0 commit comments

Comments
 (0)