django-auditlog/auditlog/middleware.py

28 lines
1.1 KiB
Python

from django.conf import settings
from django.db.models.signals import pre_save
from django.utils.functional import curry
from auditlog.models import LogEntry
class AuditLogMiddleware(object):
"""
Middleware to couple the request's user to log items. This is accomplished by currying the signal receiver with the
user from the request (or None if the user is not authenticated).
"""
def process_request(self, request):
if hasattr(request, 'user') and hasattr(request.user, 'is_authenticated') and request.user.is_authenticated():
user = request.user
else:
user = None
set_actor = curry(self.set_actor, user)
pre_save.connect(set_actor, sender=LogEntry, dispatch_uid=(self.__class__, request), weak=False)
def process_response(self, request, response):
pre_save.disconnect(dispatch_uid=(self.__class__, request))
return response
def set_actor(self, user, sender, instance, **kwargs):
if sender == LogEntry and isinstance(user, settings.AUTH_USER_MODEL):
instance.actor = user