~ricardokirkner/django-adminaudit/use-setuptools

« back to all changes in this revision

Viewing changes to adminaudit/models.py

  • Committer: Ricardo Kirkner
  • Date: 2012-08-21 18:35:55 UTC
  • mfrom: (47.1.2 trunk)
  • Revision ID: ricardo@kirkner.com.ar-20120821183555-wgsegyap4bt9ajp3
some refactors to avoid dependency on django during package import

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 
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
8
8
 
9
9
 
10
10
class AuditLog(models.Model):
11
11
    """
12
12
    Records of all changes made via Django admin interface.
13
 
    
 
13
 
14
14
    """
15
15
    username = models.CharField(max_length=255)
16
16
    user_id = models.IntegerField()
51
51
            representation=unicode(obj),
52
52
            change=change,
53
53
        )
 
54
 
 
55
 
 
56
class AdminAuditMixin(object):
 
57
 
 
58
    def _flatten(self, lst):
 
59
        result = []
 
60
        for item in lst:
 
61
            if isinstance(item, list):
 
62
                result.extend(self._flatten(item))
 
63
            else:
 
64
                result.append(item)
 
65
        return result
 
66
 
 
67
    def _collect_deleted_objects(self, obj):
 
68
        result = []
 
69
        try:
 
70
            # This is for Django up to 1.2
 
71
            from django.db.models.query_utils import CollectedObjects
 
72
 
 
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():
 
77
                    result.append(subobj)
 
78
        except ImportError:
 
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
 
83
 
 
84
            using = router.db_for_write(obj)
 
85
            collector = NestedObjects(using=using)
 
86
            collector.collect([obj])
 
87
            result = self._flatten(collector.nested())
 
88
        return result
 
89
 
 
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)
 
93
 
 
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)
 
98
 
 
99
    def save_model(self, request, new_obj, form, change):
 
100
        if change:
 
101
            # This is so that we'll get the values of the object before the
 
102
            # change
 
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)