-
-
Save stevelacey/23fcf8977dd03edac491 to your computer and use it in GitHub Desktop.
UserstampMiddleware
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from django.db.models import signals | |
from django.utils.functional import curry | |
from rest_framework import authentication | |
class UserstampMiddleware(object): | |
"""Add user created_by and updated_by foreign key refs to any model automatically. | |
Almost entirely taken from https://github.com/Atomidata/django-audit-log/blob/master/audit_log/middleware.py""" | |
def process_request(self, request): | |
if not request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'): | |
try: | |
user = request.user | |
if not user.is_authenticated(): | |
# try basic auth | |
auth = authentication.BasicAuthentication().authenticate(request) | |
user, _ = auth if auth else (None, None) | |
except (authentication.exceptions.AuthenticationFailed, KeyError): | |
user = None | |
func = curry(userstampable, user) | |
signals.pre_save.connect(func, dispatch_uid = (self.__class__, request), weak = False) | |
def process_response(self, request, response): | |
signals.pre_save.disconnect(dispatch_uid = (self.__class__, request)) | |
return response |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from django.db.models.signals import post_save, pre_save | |
from django.dispatch import receiver | |
from django.utils import timezone | |
@receiver(pre_save) | |
def timestampable(sender, instance, *args, **kwargs): | |
if hasattr(instance, 'created_at'): | |
if instance._state.adding and not instance.created_at: | |
instance.created_at = timezone.now().replace(microsecond=0) | |
if hasattr(instance, 'updated_at'): | |
if instance._state.adding or instance.is_dirty(): | |
instance.updated_at = timezone.now().replace(microsecond=0) | |
# bound by UserstampMiddleware | |
def userstampable(user, sender, instance, **kwargs): | |
if hasattr(instance, 'created_by_id') and instance._state.adding: | |
instance.created_by = instance.created_by or user | |
if hasattr(instance, 'updated_by_id'): | |
instance.updated_by = user |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment