Fixed #27438 -- Added the diffsettings --default option.

This commit is contained in:
Paweł Marczewski 2016-11-05 12:31:37 +01:00 committed by Tim Graham
parent 373c6c409c
commit 50f9e736fa
4 changed files with 35 additions and 3 deletions

View File

@ -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):

View File

@ -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``
------------

View File

@ -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
~~~~~~~~~~

View File

@ -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."""