Skip to content

Commit 761f264

Browse files
Merge pull request #2473 from tomchristie/reload-settings
Reload api_settings when using Django's 'override_settings'
2 parents 0daf160 + 65bca59 commit 761f264

File tree

3 files changed

+24
-28
lines changed

3 files changed

+24
-28
lines changed

rest_framework/settings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
back to the defaults.
1919
"""
2020
from __future__ import unicode_literals
21+
from django.test.signals import setting_changed
2122
from django.conf import settings
2223
from django.utils import importlib, six
2324
from rest_framework import ISO_8601
@@ -198,3 +199,13 @@ def __getattr__(self, attr):
198199

199200

200201
api_settings = APISettings(USER_SETTINGS, DEFAULTS, IMPORT_STRINGS)
202+
203+
204+
def reload_api_settings(*args, **kwargs):
205+
global api_settings
206+
setting, value = kwargs['setting'], kwargs['value']
207+
if setting == 'REST_FRAMEWORK':
208+
api_settings = APISettings(value, DEFAULTS, IMPORT_STRINGS)
209+
210+
211+
setting_changed.connect(reload_api_settings)

tests/test_filters.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
from django.conf.urls import patterns, url
66
from django.core.urlresolvers import reverse
77
from django.test import TestCase
8+
from django.test.utils import override_settings
89
from django.utils import unittest
910
from django.utils.dateparse import parse_date
11+
from django.utils.six.moves import reload_module
1012
from rest_framework import generics, serializers, status, filters
1113
from rest_framework.compat import django_filters
1214
from rest_framework.test import APIRequestFactory
1315
from .models import BaseFilterableItem, FilterableItem, BasicModel
14-
from .utils import temporary_setting
16+
1517

1618
factory = APIRequestFactory()
1719

@@ -404,7 +406,9 @@ class SearchListView(generics.ListAPIView):
404406
)
405407

406408
def test_search_with_nonstandard_search_param(self):
407-
with temporary_setting('SEARCH_PARAM', 'query', module=filters):
409+
with override_settings(REST_FRAMEWORK={'SEARCH_PARAM': 'query'}):
410+
reload_module(filters)
411+
408412
class SearchListView(generics.ListAPIView):
409413
queryset = SearchFilterModel.objects.all()
410414
serializer_class = SearchFilterSerializer
@@ -422,6 +426,8 @@ class SearchListView(generics.ListAPIView):
422426
]
423427
)
424428

429+
reload_module(filters)
430+
425431

426432
class OrderingFilterModel(models.Model):
427433
title = models.CharField(max_length=20)
@@ -642,7 +648,9 @@ class OrderingListView(generics.ListAPIView):
642648
)
643649

644650
def test_ordering_with_nonstandard_ordering_param(self):
645-
with temporary_setting('ORDERING_PARAM', 'order', filters):
651+
with override_settings(REST_FRAMEWORK={'ORDERING_PARAM': 'order'}):
652+
reload_module(filters)
653+
646654
class OrderingListView(generics.ListAPIView):
647655
queryset = OrderingFilterModel.objects.all()
648656
serializer_class = OrderingFilterSerializer
@@ -662,6 +670,8 @@ class OrderingListView(generics.ListAPIView):
662670
]
663671
)
664672

673+
reload_module(filters)
674+
665675

666676
class SensitiveOrderingFilterModel(models.Model):
667677
username = models.CharField(max_length=20)

tests/utils.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,5 @@
1-
from contextlib import contextmanager
21
from django.core.exceptions import ObjectDoesNotExist
32
from django.core.urlresolvers import NoReverseMatch
4-
from django.utils import six
5-
from rest_framework.settings import api_settings
6-
7-
8-
@contextmanager
9-
def temporary_setting(setting, value, module=None):
10-
"""
11-
Temporarily change value of setting for test.
12-
13-
Optionally reload given module, useful when module uses value of setting on
14-
import.
15-
"""
16-
original_value = getattr(api_settings, setting)
17-
setattr(api_settings, setting, value)
18-
19-
if module is not None:
20-
six.moves.reload_module(module)
21-
22-
yield
23-
24-
setattr(api_settings, setting, original_value)
25-
26-
if module is not None:
27-
six.moves.reload_module(module)
283

294

305
class MockObject(object):

0 commit comments

Comments
 (0)