Skip to content

Instantly share code, notes, and snippets.

@leplatrem
Created April 11, 2014 12:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leplatrem/10465364 to your computer and use it in GitHub Desktop.
Save leplatrem/10465364 to your computer and use it in GitHub Desktop.
Log models
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import force_unicode
from django.forms.models import model_to_dict
def log_addition(request, dbobject, oldobject=None, message=None):
_log_action(request, dbobject, oldobject, ADDITION, message)
def log_change(request, dbobject, oldobject=None, message=None):
_log_action(request, dbobject, oldobject, CHANGE, message)
def log_deletion(request, dbobject, oldobject=None, message=None):
_log_action(request, dbobject, oldobject, DELETION, message)
def _log_action(request, dbobject, oldobject, action, message=None):
# Helper to get content-type of objects
def _content_type_id(obj):
return ContentType.objects.get_for_model(obj).pk
content_type_id = _content_type_id(dbobject)
if message is None:
messages = []
# If oldobject is provided, detect which fields were changed
if oldobject:
# Check that both object have same type
assert content_type_id == _content_type_id(oldobject), 'Cannot compare objects fields of different types.'
# Iterate fields values and compare !
newvalues = model_to_dict(dbobject)
for field, oldvalue in model_to_dict(oldobject).items():
newvalue = newvalues[field]
if oldvalue != newvalue:
messages.append(u"%s → %s" % (oldvalue or "''", newvalue))
message = u", ".join(messages)
# Use Django admin facility to log actions
LogEntry.objects.log_action(
user_id = request.user.pk,
content_type_id = content_type_id,
object_id = dbobject.pk,
object_repr = force_unicode(dbobject), # Could be customized
action_flag = action,
change_message = force_unicode(message).decode('unicode_escape'), #mysql :(
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment