Skip to content

Commit 6b9ad45

Browse files
committed
Feature: user & content_type foreign key drop db_constraints. Emulate via settings.
1 parent b0f95f1 commit 6b9ad45

File tree

7 files changed

+79
-17
lines changed

7 files changed

+79
-17
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ Below are some of the settings you may want to use. These should be defined in y
5959
will be matched against the URL path.
6060
[Check our wiki](https://github.com/soynatan/django-easy-audit/wiki/Settings#request-auditing)
6161
for more details on how to use it.
62+
63+
* `DJANGO_EASY_AUDIT_CRUD_DIFFERENCE_CALLBACKS`
64+
65+
May point to a list of callables/string-paths-to-functions-classes in which the application code can determine
66+
on a per CRUDEvent whether or not the application chooses to create the CRUDEvent or not. This is different
67+
from the registered/unregistered settings (e.g. `DJANGO_EASY_AUDIT_UNREGISTERED_CLASSES_EXTRA`).
68+
This is meant to be for dynamic configurations where the application
69+
may inspect the current save/create/delete and choose whether or not to save that into the database or ignore it.
70+
71+
* `DJANGO_EASY_AUDIT_USER_DB_CONSTRAINT`
72+
73+
Default is `True`. This is reserved for future use (does not do anything yet). The functionality provided by the
74+
setting (whether enabled or disabled) could be handled more explicitly in certain
75+
code paths (or even internally as custom model managers). For projects that separate the easyaudit database, such
76+
that the tables are not on the same database as the user table, this could help with making certain queries easier.
77+
Again, this doesn't do anything yet, and if it ever does, the version will be increased and the README will be
78+
updated accordingly. If you keep your database together (the standard usage), you have nothing to worry about.
6279

6380
## What does it do
6481

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.12 on 2018-10-18 00:12
3+
from __future__ import unicode_literals
4+
5+
from django.conf import settings
6+
from django.db import migrations, models
7+
import django.db.models.deletion
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('easyaudit', '0011_auto_20181101_1339'),
14+
]
15+
16+
operations = [
17+
migrations.AlterField(
18+
model_name='crudevent',
19+
name='user',
20+
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
21+
),
22+
migrations.AlterField(
23+
model_name='crudevent',
24+
name='content_type',
25+
field=models.ForeignKey(to='contenttypes.ContentType', db_constraint=False, on_delete=models.CASCADE),
26+
),
27+
migrations.AlterField(
28+
model_name='loginevent',
29+
name='user',
30+
field=models.ForeignKey(blank=True, db_constraint=False, null=True,
31+
on_delete=django.db.models.deletion.SET_NULL,
32+
to=settings.AUTH_USER_MODEL),
33+
),
34+
migrations.AlterField(
35+
model_name='requestevent',
36+
name='user',
37+
field=models.ForeignKey(blank=True, db_constraint=False, null=True,
38+
on_delete=django.db.models.deletion.SET_NULL,
39+
to=settings.AUTH_USER_MODEL),
40+
),
41+
42+
]

easyaudit/models.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ class CRUDEvent(models.Model):
2121

2222
event_type = models.SmallIntegerField(choices=TYPES)
2323
object_id = models.IntegerField() # we should try to allow other ID types
24-
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
24+
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, db_constraint=False)
2525
object_repr = models.TextField(null=True, blank=True)
2626
object_json_repr = models.TextField(null=True, blank=True)
2727
changed_fields = models.TextField(null=True, blank=True)
2828
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True,
29-
blank=True, on_delete=models.SET_NULL)
29+
blank=True, on_delete=models.SET_NULL,
30+
db_constraint=False)
3031
user_pk_as_string = models.CharField(max_length=255, null=True, blank=True,
31-
help_text='String version of the user pk')
32+
help_text='String version of the user pk')
3233
datetime = models.DateTimeField(auto_now_add=True)
3334

3435
def is_create(self):
@@ -59,7 +60,7 @@ class LoginEvent(models.Model):
5960
login_type = models.SmallIntegerField(choices=TYPES)
6061
username = models.CharField(max_length=255, null=True, blank=True)
6162
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
62-
on_delete=models.SET_NULL)
63+
on_delete=models.SET_NULL, db_constraint=False)
6364
remote_ip = models.CharField(max_length=50, null=True, db_index=True)
6465
datetime = models.DateTimeField(auto_now_add=True)
6566

@@ -74,7 +75,7 @@ class RequestEvent(models.Model):
7475
method = models.CharField(max_length=20, null=False, db_index=True)
7576
query_string = models.TextField(null=True)
7677
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
77-
on_delete=models.SET_NULL)
78+
on_delete=models.SET_NULL, db_constraint=False)
7879
remote_ip = models.CharField(max_length=50, null=True, db_index=True)
7980
datetime = models.DateTimeField(auto_now_add=True)
8081

easyaudit/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def get_model_list(class_list):
3131
WATCH_REQUEST_EVENTS = getattr(settings, 'DJANGO_EASY_AUDIT_WATCH_REQUEST_EVENTS', True)
3232
REMOTE_ADDR_HEADER = getattr(settings, 'DJANGO_EASY_AUDIT_REMOTE_ADDR_HEADER', 'REMOTE_ADDR')
3333

34+
USER_DB_CONSTRAINT = bool(getattr(settings, 'DJANGO_EASY_AUDIT_USER_DB_CONSTRAINT', True))
35+
3436

3537
# Models which Django Easy Audit will not log.
3638
# By default, all but some models will be audited.

easyaudit/signals/auth_signals.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def user_logged_in(sender, request, user, **kwargs):
1010
with transaction.atomic():
1111
login_event = LoginEvent.objects.create(login_type=LoginEvent.LOGIN,
1212
username=getattr(user, user.USERNAME_FIELD),
13-
user=user,
13+
user_id=getattr(user, 'id', None),
1414
remote_ip=request.META[REMOTE_ADDR_HEADER])
1515
except:
1616
pass
@@ -20,8 +20,8 @@ def user_logged_out(sender, request, user, **kwargs):
2020
try:
2121
with transaction.atomic():
2222
login_event = LoginEvent.objects.create(login_type=LoginEvent.LOGOUT,
23-
username=getattr(user, user.USERNAME_FIELD),
24-
user=user,
23+
username=getattr(user, user.USERNAME_FIELD, None),
24+
user_id=getattr(user, 'id', None),
2525
remote_ip=request.META[REMOTE_ADDR_HEADER])
2626
except:
2727
pass

easyaudit/signals/model_signals.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ def pre_save(sender, instance, raw, using, update_fields, **kwargs):
9393
object_repr=str(instance),
9494
object_json_repr=object_json_repr,
9595
changed_fields=changed_fields,
96-
content_type=c_t,
96+
content_type_id=c_t.id,
9797
object_id=instance.pk,
98-
user=user,
98+
user_id=getattr(user, 'id', None),
9999
datetime=timezone.now(),
100100
user_pk_as_string=str(user.pk) if user else user
101101
)
@@ -152,9 +152,9 @@ def post_save(sender, instance, created, raw, using, update_fields, **kwargs):
152152
event_type=event_type,
153153
object_repr=str(instance),
154154
object_json_repr=object_json_repr,
155-
content_type=c_t,
155+
content_type_id=c_t.id,
156156
object_id=instance.pk,
157-
user=user,
157+
user_id=getattr(user, 'id', None),
158158
datetime=timezone.now(),
159159
user_pk_as_string=str(user.pk) if user else user
160160
)
@@ -232,9 +232,9 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
232232
event_type=event_type,
233233
object_repr=str(instance),
234234
object_json_repr=object_json_repr,
235-
content_type=c_t,
235+
content_type_id=c_t.id,
236236
object_id=instance.pk,
237-
user=user,
237+
user_id=getattr(user, 'id', None),
238238
datetime=timezone.now(),
239239
user_pk_as_string=str(user.pk) if user else user
240240
)
@@ -275,9 +275,9 @@ def post_delete(sender, instance, using, **kwargs):
275275
event_type=CRUDEvent.DELETE,
276276
object_repr=str(instance),
277277
object_json_repr=object_json_repr,
278-
content_type=c_t,
278+
content_type_id=c_t.id,
279279
object_id=instance.pk,
280-
user=user,
280+
user_id=getattr(user, 'id', None),
281281
datetime=timezone.now(),
282282
user_pk_as_string=str(user.pk) if user else user
283283
)

easyaudit/signals/request_signals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def request_started_handler(sender, environ, **kwargs):
5050
url=environ['PATH_INFO'],
5151
method=environ['REQUEST_METHOD'],
5252
query_string=environ['QUERY_STRING'],
53-
user=user,
53+
user_id=getattr(user, 'id', None),
5454
remote_ip=environ[REMOTE_ADDR_HEADER],
5555
datetime=timezone.now()
5656
)

0 commit comments

Comments
 (0)