Merge lp:~ricardokirkner/django-adminaudit/import-refactoring into lp:django-adminaudit

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 49
Merged at revision: 48
Proposed branch: lp:~ricardokirkner/django-adminaudit/import-refactoring
Merge into: lp:django-adminaudit
Diff against target: 181 lines (+59/-65)
3 files modified
adminaudit/__init__.py (+4/-58)
adminaudit/models.py (+55/-2)
adminaudit/schema.py (+0/-5)
To merge this branch: bzr merge lp:~ricardokirkner/django-adminaudit/import-refactoring
Reviewer Review Type Date Requested Status
Anthony Lenton (community) Approve
Review via email: mp+120624@code.launchpad.net

Commit message

some refactors to avoid dependency on django during package import

Description of the change

Refactored some imports to avoid circular dependencies during package import time.

In particular avoid these issues by not requiring django to be fully setup in order to be able to import the adminaudit package.

To post a comment you must log in.
Revision history for this message
Anthony Lenton (elachuni) wrote :

Thanks pindonga!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'adminaudit/__init__.py'
2--- adminaudit/__init__.py 2012-04-26 16:39:32 +0000
3+++ adminaudit/__init__.py 2012-08-21 17:49:18 +0000
4@@ -1,65 +1,11 @@
5 # Copyright 2010-2012 Canonical Ltd. This software is licensed under
6 # the GNU Lesser General Public License version 3 (see the file LICENSE).
7
8-from django.contrib.admin import site
9-
10-from adminaudit.models import AuditLog
11-
12-
13-class AdminAuditMixin(object):
14-
15- def _flatten(self, lst):
16- result = []
17- for item in lst:
18- if isinstance(item, list):
19- result.extend(self._flatten(item))
20- else:
21- result.append(item)
22- return result
23-
24- def _collect_deleted_objects(self, obj):
25- result = []
26- try:
27- # This is for Django up to 1.2
28- from django.db.models.query_utils import CollectedObjects
29-
30- seen_objs = CollectedObjects()
31- obj._collect_sub_objects(seen_objs)
32- for cls, subobjs in seen_objs.iteritems():
33- for subobj in subobjs.values():
34- result.append(subobj)
35- except ImportError:
36- # Django 1.3 solution, those imports needs to be here, because
37- # otherwise they will fail on Django < 1.3.
38- from django.contrib.admin.util import NestedObjects
39- from django.db import router
40-
41- using = router.db_for_write(obj)
42- collector = NestedObjects(using=using)
43- collector.collect([obj])
44- result = self._flatten(collector.nested())
45- return result
46-
47- def log_addition(self, request, obj, *args, **kwargs):
48- AuditLog.create(request.user, obj, 'create')
49- super(AdminAuditMixin, self).log_addition(request, obj, *args, **kwargs)
50-
51- def log_deletion(self, request, obj, *args, **kwargs):
52- for subobj in self._collect_deleted_objects(obj):
53- AuditLog.create(request.user, subobj, 'delete')
54- super(AdminAuditMixin, self).log_deletion(request, obj, *args, **kwargs)
55-
56- def save_model(self, request, new_obj, form, change):
57- if change:
58- # This is so that we'll get the values of the object before the
59- # change
60- old_obj = new_obj.__class__.objects.get(pk=new_obj.pk)
61- AuditLog.create(request.user, old_obj, 'update', new_object=new_obj)
62- super(AdminAuditMixin, self).save_model(
63- request, new_obj, form, change)
64-
65-
66 def audit_install():
67+ # import here to avoid triggering django imports during package import
68+ from django.contrib.admin import site
69+ from .models import AdminAuditMixin, AuditLog
70+
71 for model, model_admin in site._registry.items():
72 if (model is AuditLog or isinstance(model_admin, AdminAuditMixin)):
73 # Do not mingle with our own model
74
75=== modified file 'adminaudit/models.py'
76--- adminaudit/models.py 2012-01-16 19:48:22 +0000
77+++ adminaudit/models.py 2012-08-21 17:49:18 +0000
78@@ -3,14 +3,14 @@
79
80 from django.core import serializers
81 from django.db import models
82+from django.db.models.fields.files import FileField
83 from django.utils import simplejson
84-from django.db.models.fields.files import FileField
85
86
87 class AuditLog(models.Model):
88 """
89 Records of all changes made via Django admin interface.
90-
91+
92 """
93 username = models.CharField(max_length=255)
94 user_id = models.IntegerField()
95@@ -51,3 +51,56 @@
96 representation=unicode(obj),
97 change=change,
98 )
99+
100+
101+class AdminAuditMixin(object):
102+
103+ def _flatten(self, lst):
104+ result = []
105+ for item in lst:
106+ if isinstance(item, list):
107+ result.extend(self._flatten(item))
108+ else:
109+ result.append(item)
110+ return result
111+
112+ def _collect_deleted_objects(self, obj):
113+ result = []
114+ try:
115+ # This is for Django up to 1.2
116+ from django.db.models.query_utils import CollectedObjects
117+
118+ seen_objs = CollectedObjects()
119+ obj._collect_sub_objects(seen_objs)
120+ for cls, subobjs in seen_objs.iteritems():
121+ for subobj in subobjs.values():
122+ result.append(subobj)
123+ except ImportError:
124+ # Django 1.3 solution, those imports needs to be here, because
125+ # otherwise they will fail on Django < 1.3.
126+ from django.contrib.admin.util import NestedObjects
127+ from django.db import router
128+
129+ using = router.db_for_write(obj)
130+ collector = NestedObjects(using=using)
131+ collector.collect([obj])
132+ result = self._flatten(collector.nested())
133+ return result
134+
135+ def log_addition(self, request, obj, *args, **kwargs):
136+ AuditLog.create(request.user, obj, 'create')
137+ super(AdminAuditMixin, self).log_addition(request, obj, *args, **kwargs)
138+
139+ def log_deletion(self, request, obj, *args, **kwargs):
140+ for subobj in self._collect_deleted_objects(obj):
141+ AuditLog.create(request.user, subobj, 'delete')
142+ super(AdminAuditMixin, self).log_deletion(request, obj, *args, **kwargs)
143+
144+ def save_model(self, request, new_obj, form, change):
145+ if change:
146+ # This is so that we'll get the values of the object before the
147+ # change
148+ old_obj = new_obj.__class__.objects.get(pk=new_obj.pk)
149+ AuditLog.create(request.user, old_obj, 'update', new_object=new_obj)
150+ super(AdminAuditMixin, self).save_model(
151+ request, new_obj, form, change)
152
153=== modified file 'adminaudit/schema.py'
154--- adminaudit/schema.py 2012-07-24 12:55:38 +0000
155+++ adminaudit/schema.py 2012-08-21 17:49:18 +0000
156@@ -1,25 +1,20 @@
157 # configglue schema to enable projects using configglue to use adminaudit
158 # this schema represents all adminaudit available configuration settings
159-from operator import itemgetter
160-
161 from configglue.schema import (
162 ListOption,
163 Schema,
164 Section,
165 StringOption,
166 )
167-from django.conf import settings
168
169
170 class AdminAuditSchema(Schema):
171 class adminaudit(Section):
172 adminaudit_emails_recipients = ListOption(
173 item=StringOption(),
174- default=map(itemgetter(1), settings.ADMINS),
175 help='List of email addresss to send reports to.')
176 adminaudit_summary_subject = StringOption(
177 default='Admin Audit Summary',
178 help='Email report subject.')
179 adminaudit_email_from = StringOption(
180- default=settings.DEFAULT_FROM_EMAIL,
181 help='Email address from which to send reports.')

Subscribers

People subscribed via source and target branches