List Info

Thread: Re: audit trail support




Re: audit trail support
user name
2007-04-23 10:36:14
2007/4/20, Jason McVetta <jason.mcvettagmail.com>:
> I need to add real audit trail and change-notification
support to an
> existing Django app and to one that is under
development.  The best way to
> do this, it seems to me, is to add audit support to the
Django framework
> itself.  My requirements are similar to those named by
Paul Childs in his
> django-users post last June:
>

Here is what I have quickly done with signals (I don't know
if it can
be helpful):

## signals.py

from django.contrib.admin.models import LogEntry, ADDITION,
CHANGE, DELETION
from django.contrib.contenttypes.models import ContentType

""" Those functions allow application
logging.

It's a bit ugly to declare instance hidden variables (pre)
but we need to be
sure that the save/delete is effective (post) before logging
it.

PROTO: For the moment, it used the admin LogEntry model
which is not really
safe given the fact that django admin will be changed soon
to include newforms.

TODO: Add diff in change_message argument of LogEntry when
this is a CHANGE.
"""

def log_pre_save(sender, instance, signal):
    try:
        initial_object = sender.objects.get(id=instance.id)
        instance._action_flag = CHANGE
    except sender.DoesNotExist:
        instance._action_flag = ADDITION

def log_post_save(sender, instance, signal):
    LogEntry.objects.log_action(
        user_id=instance.user.id,
       
content_type_id=ContentType.objects.get_for_model(sender).id
,
        object_id=instance.id,
       
object_repr=str(sender.objects.get(id=instance.id)),
        action_flag=instance._action_flag)

def log_pre_delete(sender, instance, signal):
    instance._object_repr =
str(sender.objects.get(id=instance.id))

def log_post_delete(sender, instance, signal):
    LogEntry.objects.log_action(
        user_id=instance.user.id,
       
content_type_id=ContentType.objects.get_for_model(sender).id
,
        object_id=instance.id,
        object_repr=instance._object_repr,
        action_flag=DELETION)

## todo/models.py
from sibiocle.misc.signals import log_pre_save,
log_post_save,
log_pre_delete, log_post_delete

[...]

dispatcher.connect(log_pre_save,    signal=signals.pre_save,
   sender=Todo)
dispatcher.connect(log_post_save,  
signal=signals.post_save,   sender=Todo)
dispatcher.connect(log_pre_delete, 
signal=signals.pre_delete,  sender=Todo)
dispatcher.connect(log_post_delete,
signal=signals.post_delete, sender=Todo)

Anyway, I'm really intersted in your work, let us know your
progression .

Regards,
David

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the
Google Groups "Django users" group.
To post to this group, send email to django-usersgooglegroups.com
To unsubscribe from this group, send email to
django-users-unsubscribegooglegroups.com
For more options, visit this group at htt
p://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---


[1]

about | contact  Other archives ( Real Estate discussion Medical topics )