From 61ce2d1acc952cf67e852c172a16a26b4124d156 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 29 Oct 2013 20:56:03 +0100 Subject: [PATCH] Replace reversion middleware with api view mixin. This is done because django 1.6 has transactions at view level and current authentication is done at view level instead of using django auth middleware. --- greenmine/base/api.py | 24 ++++++++++++++++++++++++ greenmine/settings/common.py | 1 - 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/greenmine/base/api.py b/greenmine/base/api.py index dbbe8cad..3ee87af5 100644 --- a/greenmine/base/api.py +++ b/greenmine/base/api.py @@ -2,6 +2,7 @@ from django.db import transaction +from reversion.revisions import revision_context_manager from rest_framework import viewsets from rest_framework import status from rest_framework import mixins @@ -79,7 +80,29 @@ class DetailAndListSerializersMixin(object): return super().get_serializer_class() +class ReversionMixin(object): + def dispatch(self, request, *args, **kwargs): + revision_context_manager.start() + + try: + response = super().dispatch(request, *args, **kwargs) + except Exception as e: + revision_context_manager.invalidate() + revision_context_manager.end() + raise + + if self.request.user.is_authenticated(): + revision_context_manager.set_user(self.request.user) + + if response.status_code > 206: + self._invalidare_revision() + + revision_context_manager.end() + return response + + class ModelCrudViewSet(DetailAndListSerializersMixin, + ReversionMixin, PreconditionMixin, HeadersPaginationMixin, ConditionalPaginationMixin, @@ -93,6 +116,7 @@ class ModelCrudViewSet(DetailAndListSerializersMixin, class ModelListViewSet(DetailAndListSerializersMixin, + ReversionMixin, PreconditionMixin, HeadersPaginationMixin, ConditionalPaginationMixin, diff --git a/greenmine/settings/common.py b/greenmine/settings/common.py index 035e08f3..601f258d 100644 --- a/greenmine/settings/common.py +++ b/greenmine/settings/common.py @@ -155,7 +155,6 @@ MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.middleware.locale.LocaleMiddleware', 'greenmine.base.middleware.CoorsMiddleware', - 'reversion.middleware.RevisionMiddleware', # Only needed by django admin 'django.contrib.sessions.middleware.SessionMiddleware',