Skip to content

Commit 66b6219

Browse files
committed
[-] CrudEvent object_id as a CharField
1 parent 57a52ae commit 66b6219

File tree

9 files changed

+207
-25
lines changed

9 files changed

+207
-25
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.0.6 on 2020-05-13 00:08
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('easyaudit', '0013_auto_20190723_0126'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='crudevent',
15+
name='object_id',
16+
field=models.CharField(max_length=255),
17+
),
18+
]

easyaudit/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class CRUDEvent(models.Model):
1919
)
2020

2121
event_type = models.SmallIntegerField(choices=TYPES)
22-
object_id = models.IntegerField() # we should try to allow other ID types
22+
object_id = models.CharField(max_length=255)
2323
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, db_constraint=False)
2424
object_repr = models.TextField(null=True, blank=True)
2525
object_json_repr = models.TextField(null=True, blank=True)

easyaudit/signals/model_signals.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,16 @@ def pre_save(sender, instance, raw, using, update_fields, **kwargs):
6262
# We need a better way for this to work. ManyToMany will fail on pre_save on create
6363
return None
6464

65-
if instance.pk is None:
66-
created = True
67-
else:
65+
# Query the object, see if it exists
66+
try:
67+
old_model = sender.objects.get(id=instance.pk)
6868
created = False
69+
except (sender.DoesNotExist, ):
70+
old_model = None
71+
created = True
6972

7073
# created or updated?
71-
if not created:
72-
old_model = sender.objects.get(pk=instance.pk)
74+
if old_model:
7375
delta = model_delta(old_model, instance)
7476
if not delta and getattr(settings, "DJANGO_EASY_AUDIT_CRUD_EVENT_NO_CHANGED_FIELDS_SKIP", False):
7577
return False

easyaudit/tests/db.sqlite3

96 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Generated by Django 3.0.6 on 2020-05-14 17:28
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import uuid
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('test_app', '0002_auto_20180220_1533'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='TestBigIntModel',
17+
fields=[
18+
('id', models.BigAutoField(primary_key=True, serialize=False)),
19+
('name', models.CharField(default='test data', max_length=50)),
20+
],
21+
),
22+
migrations.CreateModel(
23+
name='TestUUIDModel',
24+
fields=[
25+
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
26+
('name', models.CharField(default='test data', max_length=50)),
27+
],
28+
),
29+
migrations.CreateModel(
30+
name='TestUUIDM2M',
31+
fields=[
32+
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
33+
('name', models.CharField(max_length=50)),
34+
('test_m2m', models.ManyToManyField(to='test_app.TestUUIDModel')),
35+
],
36+
),
37+
migrations.CreateModel(
38+
name='TestUUIDForeignKey',
39+
fields=[
40+
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
41+
('name', models.CharField(max_length=50)),
42+
('test_fk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='test_app.TestUUIDModel')),
43+
],
44+
),
45+
migrations.CreateModel(
46+
name='TestBigIntM2M',
47+
fields=[
48+
('id', models.BigAutoField(primary_key=True, serialize=False)),
49+
('name', models.CharField(max_length=50)),
50+
('test_m2m', models.ManyToManyField(to='test_app.TestBigIntModel')),
51+
],
52+
),
53+
migrations.CreateModel(
54+
name='TestBigIntForeignKey',
55+
fields=[
56+
('id', models.BigAutoField(primary_key=True, serialize=False)),
57+
('name', models.CharField(max_length=50)),
58+
('test_fk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='test_app.TestBigIntModel')),
59+
],
60+
),
61+
]

easyaudit/tests/test_app/models.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import uuid
2+
13
from django.db import models
24

35

@@ -13,3 +15,43 @@ class TestForeignKey(models.Model):
1315
class TestM2M(models.Model):
1416
name = models.CharField(max_length=50)
1517
test_m2m = models.ManyToManyField(TestModel)
18+
19+
20+
class TestUUIDModel(models.Model):
21+
id = models.UUIDField(
22+
primary_key=True, unique=True, editable=False, default=uuid.uuid4
23+
)
24+
name = models.CharField(max_length=50, default='test data')
25+
26+
27+
class TestUUIDForeignKey(models.Model):
28+
id = models.UUIDField(
29+
primary_key=True, unique=True, editable=False, default=uuid.uuid4
30+
)
31+
name = models.CharField(max_length=50)
32+
test_fk = models.ForeignKey(TestUUIDModel, on_delete=models.CASCADE)
33+
34+
35+
class TestUUIDM2M(models.Model):
36+
id = models.UUIDField(
37+
primary_key=True, unique=True, editable=False, default=uuid.uuid4
38+
)
39+
name = models.CharField(max_length=50)
40+
test_m2m = models.ManyToManyField(TestUUIDModel)
41+
42+
43+
class TestBigIntModel(models.Model):
44+
id = models.BigAutoField(primary_key=True)
45+
name = models.CharField(max_length=50, default='test data')
46+
47+
48+
class TestBigIntForeignKey(models.Model):
49+
id = models.BigAutoField(primary_key=True)
50+
name = models.CharField(max_length=50)
51+
test_fk = models.ForeignKey(TestBigIntModel, on_delete=models.CASCADE)
52+
53+
54+
class TestBigIntM2M(models.Model):
55+
id = models.BigAutoField(primary_key=True)
56+
name = models.CharField(max_length=50)
57+
test_m2m = models.ManyToManyField(TestBigIntModel)

easyaudit/tests/test_app/tests.py

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
from django.contrib.auth.models import User
1111
from django.contrib.contenttypes.models import ContentType
1212
import bs4
13-
from test_app.models import TestModel, TestForeignKey, TestM2M
13+
from test_app.models import (
14+
TestModel, TestForeignKey, TestM2M,
15+
TestBigIntModel, TestBigIntForeignKey, TestBigIntM2M,
16+
TestUUIDModel, TestUUIDForeignKey, TestUUIDM2M
17+
)
1418
from easyaudit.models import CRUDEvent
1519
from easyaudit.middleware.easyaudit import set_current_user, clear_request
1620

@@ -23,36 +27,38 @@
2327

2428
@override_settings(TEST=True)
2529
class TestAuditModels(TestCase):
30+
Model = TestModel
31+
FKModel = TestForeignKey
32+
M2MModel = TestM2M
2633

2734
def test_create_model(self):
28-
obj = TestModel.objects.create()
29-
self.assertEqual(obj.id, 1)
35+
obj = self.Model.objects.create()
3036
crud_event_qs = CRUDEvent.objects.filter(object_id=obj.id, content_type=ContentType.objects.get_for_model(obj))
3137
self.assertEqual(1, crud_event_qs.count())
3238
crud_event = crud_event_qs[0]
3339
data = json.loads(crud_event.object_json_repr)[0]
3440
self.assertEqual(data['fields']['name'], obj.name)
3541

3642
def test_fk_model(self):
37-
obj = TestModel.objects.create()
38-
obj_fk = TestForeignKey(name='test', test_fk=obj)
43+
obj = self.Model.objects.create()
44+
obj_fk = self.FKModel(name='test', test_fk=obj)
3945
obj_fk.save()
4046
crud_event = CRUDEvent.objects.filter(object_id=obj_fk.id, content_type=ContentType.objects.get_for_model(obj_fk))[0]
4147
data = json.loads(crud_event.object_json_repr)[0]
42-
self.assertEqual(data['fields']['test_fk'], obj.id)
48+
self.assertEqual(str(data['fields']['test_fk']), str(obj.id))
4349

4450
def test_m2m_model(self):
45-
obj = TestModel.objects.create()
46-
obj_m2m = TestM2M(name='test')
51+
obj = self.Model.objects.create()
52+
obj_m2m = self.M2MModel(name='test')
4753
obj_m2m.save()
4854
obj_m2m.test_m2m.add(obj)
4955
crud_event = CRUDEvent.objects.filter(object_id=obj_m2m.id, content_type=ContentType.objects.get_for_model(obj_m2m))[0]
5056
data = json.loads(crud_event.object_json_repr)[0]
51-
self.assertEqual(data['fields']['test_m2m'], [obj.id])
57+
self.assertEqual([str(d) for d in data['fields']['test_m2m']], [str(obj.id)])
5258

5359
@override_settings(DJANGO_EASY_AUDIT_CRUD_EVENT_NO_CHANGED_FIELDS_SKIP=True)
5460
def test_update_skip_no_changed_fields(self):
55-
obj = TestModel.objects.create()
61+
obj = self.Model.objects.create()
5662
crud_event_qs = CRUDEvent.objects.filter(object_id=obj.id, content_type=ContentType.objects.get_for_model(obj))
5763
self.assertEqual(1, crud_event_qs.count())
5864
obj.name = 'changed name'
@@ -62,7 +68,7 @@ def test_update_skip_no_changed_fields(self):
6268
self.assertIn('name', last_change.changed_fields)
6369

6470
def test_update(self):
65-
obj = TestModel.objects.create()
71+
obj = self.Model.objects.create()
6672
crud_event_qs = CRUDEvent.objects.filter(object_id=obj.id, content_type=ContentType.objects.get_for_model(obj))
6773
self.assertEqual(1, crud_event_qs.count())
6874
obj.name = 'changed name'
@@ -73,18 +79,30 @@ def test_update(self):
7379

7480
@override_settings(DJANGO_EASY_AUDIT_CRUD_EVENT_NO_CHANGED_FIELDS_SKIP=True)
7581
def test_fake_update_skip_no_changed_fields(self):
76-
obj = TestModel.objects.create()
82+
obj = self.Model.objects.create()
7783
crud_event_qs = CRUDEvent.objects.filter(object_id=obj.id, content_type=ContentType.objects.get_for_model(obj))
7884
obj.save()
7985
self.assertEqual(1, crud_event_qs.count())
8086

8187
def test_fake_update(self):
82-
obj = TestModel.objects.create()
88+
obj = self.Model.objects.create()
8389
crud_event_qs = CRUDEvent.objects.filter(object_id=obj.id, content_type=ContentType.objects.get_for_model(obj))
8490
obj.save()
8591
self.assertEqual(2, crud_event_qs.count())
8692

8793

94+
class TestAuditUUIDModels(TestAuditModels):
95+
Model = TestUUIDModel
96+
FKModel = TestUUIDForeignKey
97+
M2MModel = TestUUIDM2M
98+
99+
100+
class TestAuditBigIntModels(TestAuditModels):
101+
Model = TestBigIntModel
102+
FKModel = TestBigIntForeignKey
103+
M2MModel = TestBigIntM2M
104+
105+
88106
@override_settings(TEST=True)
89107
class TestMiddleware(TestCase):
90108
def _setup_user(self, email, password):

easyaudit/tests/test_app/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,10 @@
66
urlpatterns = [
77
url("create-obj", views.create_obj_view, name="create-obj"),
88
url("update-obj", views.update_obj_view, name="update-obj"),
9+
10+
url("create-uuid-obj", views.create_uuid_obj_view, name="create-uuid-obj"),
11+
url("update-uuid-obj", views.update_uuid_obj_view, name="update-uuid-obj"),
12+
13+
url("create-big-obj", views.create_big_obj_view, name="create-big-obj"),
14+
url("update-big-obj", views.update_big_obj_view, name="update-big-obj"),
915
]

easyaudit/tests/test_app/views.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,48 @@
1+
from datetime import datetime
2+
13
from django.http import HttpResponse
2-
from test_app.models import TestModel
4+
from test_app.models import TestModel, TestUUIDModel, TestBigIntModel
5+
6+
7+
def create_obj(Model):
8+
return Model.objects.create()
9+
10+
11+
def update_obj(Model, pk, name):
12+
tm = Model.objects.get(pk=pk)
13+
tm.name = name
14+
tm.save()
15+
return tm
316

417

518
def create_obj_view(request):
6-
return HttpResponse(TestModel.objects.create().id)
19+
return HttpResponse(create_obj(TestModel).id)
720

821

922
def update_obj_view(request):
10-
tm = TestModel.objects.get(pk=request.GET['id'])
11-
tm.name = request.GET['id']
12-
tm.save()
13-
return HttpResponse(tm.id)
23+
name = datetime.now().isoformat()
24+
return HttpResponse(update_obj(
25+
TestModel, request.GET['id'], name
26+
).id)
27+
28+
29+
def create_uuid_obj_view(request):
30+
return HttpResponse(create_obj(TestUUIDModel).id)
31+
32+
33+
def update_uuid_obj_view(request):
34+
name = datetime.now().isoformat()
35+
return HttpResponse(update_obj(
36+
TestUUIDModel, request.GET['id'], name
37+
).id)
38+
39+
40+
def create_big_obj_view(request):
41+
return HttpResponse(create_obj(TestBigIntModel).id)
42+
43+
44+
def update_big_obj_view(request):
45+
name = datetime.now().isoformat()
46+
return HttpResponse(update_obj(
47+
TestBigIntModel, request.GET['id'], name
48+
).id)

0 commit comments

Comments
 (0)