From 4fecb8eca637846e7694f01727b56503a6256e20 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Mon, 13 Nov 2017 12:40:11 -0500 Subject: [PATCH 1/2] Remove Django 1.6 transaction compat --- rest_framework/compat.py | 19 ++++------------- tests/test_compat.py | 44 ---------------------------------------- 2 files changed, 4 insertions(+), 59 deletions(-) delete mode 100644 tests/test_compat.py diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 75a840ad59..c9efbfbf32 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -250,7 +250,7 @@ def md_filter_add_syntax_highlight(md): # pytz is required from Django 1.11. Remove when dropping Django 1.10 support. try: - import pytz # noqa + import pytz # noqa from pytz.exceptions import InvalidTimeError except ImportError: InvalidTimeError = Exception @@ -298,20 +298,9 @@ class MaxLengthValidator(CustomValidatorMessage, validators.MaxLengthValidator): def set_rollback(): - if hasattr(transaction, 'set_rollback'): - if connection.settings_dict.get('ATOMIC_REQUESTS', False): - # If running in >=1.6 then mark a rollback as required, - # and allow it to be handled by Django. - if connection.in_atomic_block: - transaction.set_rollback(True) - elif transaction.is_managed(): - # Otherwise handle it explicitly if in managed mode. - if transaction.is_dirty(): - transaction.rollback() - transaction.leave_transaction_management() - else: - # transaction not managed - pass + if connection.settings_dict.get('ATOMIC_REQUESTS', False): + if connection.in_atomic_block: + transaction.set_rollback(True) def authenticate(request=None, **credentials): diff --git a/tests/test_compat.py b/tests/test_compat.py deleted file mode 100644 index 842cb8ef81..0000000000 --- a/tests/test_compat.py +++ /dev/null @@ -1,44 +0,0 @@ -from django.test import TestCase - -from rest_framework import compat - - -class CompatTests(TestCase): - - def setUp(self): - self.original_django_version = compat.django.VERSION - self.original_transaction = compat.transaction - - def tearDown(self): - compat.django.VERSION = self.original_django_version - compat.transaction = self.original_transaction - - def test_set_rollback_for_transaction_in_managed_mode(self): - class MockTransaction(object): - called_rollback = False - called_leave_transaction_management = False - - def is_managed(self): - return True - - def is_dirty(self): - return True - - def rollback(self): - self.called_rollback = True - - def leave_transaction_management(self): - self.called_leave_transaction_management = True - - dirty_mock_transaction = MockTransaction() - compat.transaction = dirty_mock_transaction - compat.set_rollback() - assert dirty_mock_transaction.called_rollback is True - assert dirty_mock_transaction.called_leave_transaction_management is True - - clean_mock_transaction = MockTransaction() - clean_mock_transaction.is_dirty = lambda: False - compat.transaction = clean_mock_transaction - compat.set_rollback() - assert clean_mock_transaction.called_rollback is False - assert clean_mock_transaction.called_leave_transaction_management is True From 61db5f9de79fc0ab059ff7c6aa53d79249cdf23a Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Mon, 13 Nov 2017 13:14:17 -0500 Subject: [PATCH 2/2] Move set_rollback from compat => views --- rest_framework/compat.py | 8 +------- rest_framework/views.py | 9 +++++++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index c9efbfbf32..5009ffee19 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -12,7 +12,7 @@ from django.conf import settings from django.core import validators from django.core.exceptions import ImproperlyConfigured -from django.db import connection, models, transaction +from django.db import models from django.utils import six from django.views.generic import View @@ -297,12 +297,6 @@ class MaxLengthValidator(CustomValidatorMessage, validators.MaxLengthValidator): pass -def set_rollback(): - if connection.settings_dict.get('ATOMIC_REQUESTS', False): - if connection.in_atomic_block: - transaction.set_rollback(True) - - def authenticate(request=None, **credentials): from django.contrib.auth import authenticate if django.VERSION < (1, 11): diff --git a/rest_framework/views.py b/rest_framework/views.py index dfed158887..3140bb9a3f 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -5,7 +5,7 @@ from django.conf import settings from django.core.exceptions import PermissionDenied -from django.db import models +from django.db import connection, models, transaction from django.http import Http404 from django.http.response import HttpResponseBase from django.utils import six @@ -16,7 +16,6 @@ from django.views.generic import View from rest_framework import exceptions, status -from rest_framework.compat import set_rollback from rest_framework.request import Request from rest_framework.response import Response from rest_framework.schemas import AutoSchema @@ -55,6 +54,12 @@ def get_view_description(view_cls, html=False): return description +def set_rollback(): + atomic_requests = connection.settings_dict.get('ATOMIC_REQUESTS', False) + if atomic_requests and connection.in_atomic_block: + transaction.set_rollback(True) + + def exception_handler(exc, context): """ Returns the response that should be used for any given exception.