From 50f9e736fa701664c5659d0653aff75b7f4489b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Marczewski?= Date: Sat, 5 Nov 2016 12:31:37 +0100 Subject: [PATCH] Fixed #27438 -- Added the diffsettings --default option. --- django/core/management/commands/diffsettings.py | 12 ++++++++++-- docs/ref/django-admin.txt | 9 ++++++++- docs/releases/1.11.txt | 3 +++ tests/admin_scripts/tests.py | 14 ++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/django/core/management/commands/diffsettings.py b/django/core/management/commands/diffsettings.py index 7bae48c218..3a5ebcf845 100644 --- a/django/core/management/commands/diffsettings.py +++ b/django/core/management/commands/diffsettings.py @@ -18,16 +18,24 @@ class Command(BaseCommand): '--all', action='store_true', dest='all', default=False, help='Display all settings, regardless of their value. Default values are prefixed by "###".', ) + parser.add_argument( + '--default', dest='default', metavar='MODULE', default=None, + help=( + "The settings module to compare the current settings against. Leave empty to " + "compare against Django's default settings." + ), + ) def handle(self, **options): # Inspired by Postfix's "postconf -n". - from django.conf import settings, global_settings + from django.conf import settings, Settings, global_settings # Because settings are imported lazily, we need to explicitly load them. settings._setup() user_settings = module_to_dict(settings._wrapped) - default_settings = module_to_dict(global_settings) + default = options['default'] + default_settings = module_to_dict(Settings(default) if default else global_settings) output = [] for key in sorted(user_settings): diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 86b5e724fa..c35e728f26 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -223,7 +223,7 @@ Specifies the database onto which to open a shell. Defaults to ``default``. .. django-admin:: diffsettings Displays differences between the current settings file and Django's default -settings. +settings (or another settings file specified by :option:`--default`). Settings that don't appear in the defaults are followed by ``"###"``. For example, the default settings don't define :setting:`ROOT_URLCONF`, so @@ -235,6 +235,13 @@ example, the default settings don't define :setting:`ROOT_URLCONF`, so Displays all settings, even if they have Django's default value. Such settings are prefixed by ``"###"``. +.. django-admin-option:: --default MODULE + +.. versionadded:: 1.11 + +The settings module to compare the current settings against. Leave empty to +compare against Django's default settings. + ``dumpdata`` ------------ diff --git a/docs/releases/1.11.txt b/docs/releases/1.11.txt index bbe1d63028..a612cb0e12 100644 --- a/docs/releases/1.11.txt +++ b/docs/releases/1.11.txt @@ -281,6 +281,9 @@ Management Commands * The new :option:`loaddata --exclude` option allows excluding models and apps while loading data from fixtures. +* The new :option:`diffsettings --default` option allows specifying a settings + module other than Django's default settings to compare against. + Migrations ~~~~~~~~~~ diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 84b44931b3..329263db0a 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -2128,6 +2128,20 @@ class DiffSettings(AdminScriptTestCase): self.assertNoOutput(err) self.assertOutput(out, "### STATIC_URL = None") + def test_custom_default(self): + """ + The --default option specifies an alternate settings module for + comparison. + """ + self.write_settings('settings_default.py', sdict={'FOO': '"foo"', 'BAR': '"bar1"'}) + self.addCleanup(self.remove_settings, 'settings_default.py') + self.write_settings('settings_to_diff.py', sdict={'FOO': '"foo"', 'BAR': '"bar2"'}) + self.addCleanup(self.remove_settings, 'settings_to_diff.py') + out, err = self.run_manage(['diffsettings', '--settings=settings_to_diff', '--default=settings_default']) + self.assertNoOutput(err) + self.assertNotInOutput(out, "FOO") + self.assertOutput(out, "BAR = 'bar2'") + class Dumpdata(AdminScriptTestCase): """Tests for dumpdata management command."""