4
4
from django.core import serializers
5
5
from django.db import models
6
from django.db.models.fields.files import FileField
6
7
from django.utils import simplejson
7
from django.db.models.fields.files import FileField
10
10
class AuditLog(models.Model):
12
12
Records of all changes made via Django admin interface.
15
15
username = models.CharField(max_length=255)
16
16
user_id = models.IntegerField()
51
51
representation=unicode(obj),
56
class AdminAuditMixin(object):
58
def _flatten(self, lst):
61
if isinstance(item, list):
62
result.extend(self._flatten(item))
67
def _collect_deleted_objects(self, obj):
70
# This is for Django up to 1.2
71
from django.db.models.query_utils import CollectedObjects
73
seen_objs = CollectedObjects()
74
obj._collect_sub_objects(seen_objs)
75
for cls, subobjs in seen_objs.iteritems():
76
for subobj in subobjs.values():
79
# Django 1.3 solution, those imports needs to be here, because
80
# otherwise they will fail on Django < 1.3.
81
from django.contrib.admin.util import NestedObjects
82
from django.db import router
84
using = router.db_for_write(obj)
85
collector = NestedObjects(using=using)
86
collector.collect([obj])
87
result = self._flatten(collector.nested())
90
def log_addition(self, request, obj, *args, **kwargs):
91
AuditLog.create(request.user, obj, 'create')
92
super(AdminAuditMixin, self).log_addition(request, obj, *args, **kwargs)
94
def log_deletion(self, request, obj, *args, **kwargs):
95
for subobj in self._collect_deleted_objects(obj):
96
AuditLog.create(request.user, subobj, 'delete')
97
super(AdminAuditMixin, self).log_deletion(request, obj, *args, **kwargs)
99
def save_model(self, request, new_obj, form, change):
101
# This is so that we'll get the values of the object before the
103
old_obj = new_obj.__class__.objects.get(pk=new_obj.pk)
104
AuditLog.create(request.user, old_obj, 'update', new_object=new_obj)
105
super(AdminAuditMixin, self).save_model(
106
request, new_obj, form, change)