Fixed #29392 -- Disallowed use of abbreviated forms of --settings and --pythonpath management command options.

This commit is contained in:
Ryan P Kilby 2018-05-08 14:50:35 -04:00 committed by Tim Graham
parent 265506bbc3
commit 2dcc5d629a
4 changed files with 24 additions and 1 deletions

View File

@ -311,7 +311,7 @@ class ManagementUtility:
# Preprocess options to extract --settings and --pythonpath.
# These options could affect the commands that are available, so they
# must be processed early.
parser = CommandParser(usage='%(prog)s subcommand [options] [args]', add_help=False)
parser = CommandParser(usage='%(prog)s subcommand [options] [args]', add_help=False, allow_abbrev=False)
parser.add_argument('--settings')
parser.add_argument('--pythonpath')
parser.add_argument('args', nargs='*') # catch-all

View File

@ -423,6 +423,9 @@ Miscellaneous
to insert untranslated content into the database), use the new
:ref:`@no_translations decorator <management-commands-and-locales>`.
* Management commands no longer allow the abbreviated forms of the
``--settings`` and ``--pythonpath`` arguments.
.. _deprecated-features-2.1:
Features deprecated in 2.1

View File

@ -0,0 +1,10 @@
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('--set')
def handle(self, **options):
self.stdout.write('Set %s' % options['set'])

View File

@ -232,6 +232,16 @@ class CommandRunTests(AdminScriptTestCase):
self.assertNoOutput(err)
self.assertEqual(out.strip(), '/PREFIX/some/url/')
def test_disallowed_abbreviated_options(self):
"""
To avoid conflicts with custom options, commands don't allow
abbreviated forms of the --setting and --pythonpath options.
"""
self.write_settings('settings.py', apps=['user_commands'])
out, err = self.run_manage(['set_option', '--set', 'foo'])
self.assertNoOutput(err)
self.assertEqual(out.strip(), 'Set foo')
class UtilsTests(SimpleTestCase):