Commit 20a91cce authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #17037 -- Added a --all option to diffsettings.

parent 68905695
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
from optparse import make_option

from django.core.management.base import NoArgsCommand

def module_to_dict(module, omittable=lambda k: k.startswith('_')):
    "Converts a module namespace to a Python dictionary. Used by get_settings_diff."
    return dict([(k, repr(v)) for k, v in module.__dict__.items() if not omittable(k)])
    """Converts a module namespace to a Python dictionary."""
    return dict((k, repr(v)) for k, v in module.__dict__.items() if not omittable(k))

class Command(NoArgsCommand):
    help = """Displays differences between the current settings.py and Django's
    default settings. Settings that don't appear in the defaults are
    followed by "###"."""

    option_list = NoArgsCommand.option_list + (
        make_option('--all', action='store_true', dest='all', default=False,
                    help='Display all settings, regardless of their value. '
                         'Default values are prefixed by "###".'),
    )

    requires_model_validation = False

    def handle_noargs(self, **options):
@@ -22,9 +30,11 @@ class Command(NoArgsCommand):
        default_settings = module_to_dict(global_settings)

        output = []
        for key in sorted(user_settings.keys()):
        for key in sorted(user_settings):
            if key not in default_settings:
                output.append("%s = %s  ###" % (key, user_settings[key]))
            elif user_settings[key] != default_settings[key]:
                output.append("%s = %s" % (key, user_settings[key]))
            elif options['all']:
                output.append("### %s = %s" % (key, user_settings[key]))
        return '\n'.join(output)
+5 −2
Original line number Diff line number Diff line
@@ -168,8 +168,11 @@ example, the default settings don't define :setting:`ROOT_URLCONF`, so
:setting:`ROOT_URLCONF` is followed by ``"###"`` in the output of
``diffsettings``.

Note that Django's default settings live in ``django/conf/global_settings.py``,
if you're ever curious to see the full list of defaults.
The :djadminopt:`--all` option may be provided to display all settings, even
if they have Django's default value. Such settings are prefixed by ``"###"``.

.. versionadded:: 1.6
    The :djadminopt:`--all` option was added.

dumpdata <appname appname appname.Model ...>
--------------------------------------------
+2 −0
Original line number Diff line number Diff line
@@ -157,6 +157,8 @@ Minor features
* The documentation contains a :doc:`deployment checklist
  </howto/deployment/checklist>`.

* The :djadmin:`diffsettings` comand gained a ``--all`` option.

Backwards incompatible changes in 1.6
=====================================

+11 −1
Original line number Diff line number Diff line
@@ -1661,11 +1661,21 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):

class DiffSettings(AdminScriptTestCase):
    """Tests for diffsettings management command."""

    def test_basic(self):
        "Runs without error and emits settings diff."
        """Runs without error and emits settings diff."""
        self.write_settings('settings_to_diff.py', sdict={'FOO': '"bar"'})
        self.addCleanup(self.remove_settings, 'settings_to_diff.py')
        args = ['diffsettings', '--settings=settings_to_diff']
        out, err = self.run_manage(args)
        self.assertNoOutput(err)
        self.assertOutput(out, "FOO = 'bar'  ###")

    def test_all(self):
        """The all option also shows settings with the default value."""
        self.write_settings('settings_to_diff.py', sdict={'STATIC_URL': 'None'})
        self.addCleanup(self.remove_settings, 'settings_to_diff.py')
        args = ['diffsettings', '--settings=settings_to_diff', '--all']
        out, err = self.run_manage(args)
        self.assertNoOutput(err)
        self.assertOutput(out, "### STATIC_URL = None")