From 1a0959d8ab8cadf466b21a6ddb178a4fc0120028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20P=C3=A9rez=20Ferrer?= Date: Wed, 27 Nov 2013 17:35:34 -0500 Subject: [PATCH 1/3] make AUTH_USER_MODEL to work with 'app_label.model_name' format --- src/auditlog/middleware.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/auditlog/middleware.py b/src/auditlog/middleware.py index 6d729e6..67ce3d5 100644 --- a/src/auditlog/middleware.py +++ b/src/auditlog/middleware.py @@ -1,6 +1,8 @@ from django.conf import settings from django.db.models.signals import pre_save from django.utils.functional import curry +from django.db.models.loading import get_model + from auditlog.models import LogEntry @@ -24,5 +26,10 @@ class AuditLogMiddleware(object): return response def set_actor(self, user, sender, instance, **kwargs): - if sender == LogEntry and isinstance(user, settings.AUTH_USER_MODEL) and instance.actor is None: + try: + app_label, model_name = settings.AUTH_USER_MODEL.split('.') + auth_user_model = get_model(app_label, model_name) + except: + auth_user_model = get_model('auth', 'user') + if sender == LogEntry and isinstance(user, auth_user_model) and instance.actor is None: instance.actor = user From 19291f54d9a9d681f48cb357eeed6acc0ef90de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20P=C3=A9rez=20Ferrer?= Date: Wed, 27 Nov 2013 23:04:49 -0500 Subject: [PATCH 2/3] some util functions --- src/auditlog/models.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/auditlog/models.py b/src/auditlog/models.py index 94329ff..5603e27 100644 --- a/src/auditlog/models.py +++ b/src/auditlog/models.py @@ -1,3 +1,5 @@ +import json + from django.conf import settings from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType @@ -40,6 +42,11 @@ class LogEntryManager(models.Manager): return self.create(**kwargs) return None + + def get_entries_from_model(self, model): + content_type = ContentType.objects.get_for_model(model) + object_id = model.pk + return self.get_query_set().filter(content_type=content_type, object_id=object_id) class LogEntry(models.Model): @@ -93,6 +100,13 @@ class LogEntry(models.Model): return fstring.format(repr=self.object_repr) + def html_formated_changes(self): + changes_result = [] + changes_dict = json.loads(self.changes.encode('utf-8')) + for field, changes in changes_dict.items(): + changes_result.append('%s from %s to %s' % (field, changes[0], changes[1])) + return changes_result + class AuditLogHistoryField(generic.GenericRelation): """ From ee22a8402044f9f600ccf1a6692a15364ab04e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20P=C3=A9rez=20Ferrer?= Date: Sun, 1 Dec 2013 11:44:16 -0500 Subject: [PATCH 3/3] Log an entry only if there are changes in model on update --- src/auditlog/receivers.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/auditlog/receivers.py b/src/auditlog/receivers.py index 84cfde3..c9e6ea5 100644 --- a/src/auditlog/receivers.py +++ b/src/auditlog/receivers.py @@ -35,11 +35,13 @@ def log_update(sender, instance, **kwargs): changes = model_instance_diff(old, new) - log_entry = LogEntry.objects.log_create( - instance, - action=LogEntry.Action.UPDATE, - changes=json.dumps(changes), - ) + # Log an entry only if there are changes + if changes: + log_entry = LogEntry.objects.log_create( + instance, + action=LogEntry.Action.UPDATE, + changes=json.dumps(changes), + ) def log_delete(sender, instance, **kwargs):