Selaa lähdekoodia

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

Ryan P Kilby 6 vuotta sitten
vanhempi
commit
2dcc5d629a

+ 1 - 1
django/core/management/__init__.py

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

+ 3 - 0
docs/releases/2.1.txt

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

+ 10 - 0
tests/user_commands/management/commands/set_option.py

@@ -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'])

+ 10 - 0
tests/user_commands/tests.py

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