From 4b14546215ad4ef15f04e748e3b5f0da7b613b45 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Tue, 13 Mar 2012 23:02:31 +0000 Subject: [PATCH] Fixed #17895 -- Made override_settings send the setting_changed signal both when a setting is overridden and when it's restored. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17708 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/test/utils.py | 19 +++++++++---------- docs/ref/signals.txt | 10 +++++++--- tests/regressiontests/settings_tests/tests.py | 1 + 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/django/test/utils.py b/django/test/utils.py index 87f2311897..ed5ab590a7 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -167,15 +167,6 @@ def restore_template_loaders(): delattr(loader, RESTORE_LOADERS_ATTR) -class OverrideSettingsHolder(UserSettingsHolder): - """ - A custom setting holder that sends a signal upon change. - """ - def __setattr__(self, name, value): - UserSettingsHolder.__setattr__(self, name, value) - setting_changed.send(sender=self.__class__, setting=name, value=value) - - class override_settings(object): """ Acts as either a decorator, or a context manager. If it's a decorator it @@ -215,10 +206,18 @@ class override_settings(object): return inner def enable(self): - override = OverrideSettingsHolder(settings._wrapped) + override = UserSettingsHolder(settings._wrapped) for key, new_value in self.options.items(): setattr(override, key, new_value) settings._wrapped = override + for key, new_value in self.options.items(): + setting_changed.send(sender=settings._wrapped.__class__, + setting=key, value=new_value) def disable(self): settings._wrapped = self.wrapped + for key in self.options: + new_value = getattr(settings, key, None) + setting_changed.send(sender=settings._wrapped.__class__, + setting=key, value=new_value) + diff --git a/docs/ref/signals.txt b/docs/ref/signals.txt index 1f0612b6ba..3917b52b96 100644 --- a/docs/ref/signals.txt +++ b/docs/ref/signals.txt @@ -477,20 +477,24 @@ setting_changed .. data:: django.test.signals.setting_changed :module: -Sent when some :ref:`settings are overridden ` with the +This signal is sent when the value of a setting is changed through the :meth:`django.test.TestCase.setting` context manager or the :func:`django.test.utils.override_settings` decorator/context manager. +It's actually sent twice: when the new value is applied ("setup") and when the +original value is restored ("teardown"). + Arguments sent with this signal: ``sender`` The settings handler. ``setting`` - Same as sender + The name of the setting. ``value`` - The new setting value. + The value of the setting after the change. For settings that initially + don't exist, in the "teardown" phase, ``value`` is ``None``. template_rendered ----------------- diff --git a/tests/regressiontests/settings_tests/tests.py b/tests/regressiontests/settings_tests/tests.py index 3f57fcead2..a2e6c490b4 100644 --- a/tests/regressiontests/settings_tests/tests.py +++ b/tests/regressiontests/settings_tests/tests.py @@ -132,6 +132,7 @@ class SettingsTests(TestCase): self.assertRaises(AttributeError, getattr, settings, 'TEST') with self.settings(TEST='override'): self.assertEqual(testvalue, 'override') + self.assertEqual(testvalue, None) @override_settings(TEST='override') def test_signal_callback_decorator(self):