From 76c526f80e43b0bf5199dfe33b1ce31e813fa2fb Mon Sep 17 00:00:00 2001 From: Rivo Laks Date: Thu, 4 Jun 2015 18:03:28 +0100 Subject: [PATCH] [1.8.x] Fixed #24769 -- Cast optparse verbosity argument to an integer for better backwards compatibility. Using `BaseCommand.options_list` makes Django use the legacy optparse parser, which does not set the verbosity attribute correctly. Now the verbosity argument is always cast to int. Regression in 8568638 (#19973). Initial report and patch from blueyed. Backport of a0047c6242fd48068eb444e0a58f7a5d2bc1bcd3 from master --- django/core/management/base.py | 7 +++++-- docs/releases/1.8.3.txt | 4 ++++ tests/user_commands/management/commands/optparse_cmd.py | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/django/core/management/base.py b/django/core/management/base.py index 0a4a1ee2f3a..3c3e5948aa3 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -300,6 +300,9 @@ class BaseCommand(object): """ if not self.use_argparse: + def store_as_int(option, opt_str, value, parser): + setattr(parser.values, option.dest, int(value)) + # Backwards compatibility: use deprecated optparse module warnings.warn("OptionParser usage for Django management commands " "is deprecated, use ArgumentParser instead", @@ -307,8 +310,8 @@ class BaseCommand(object): parser = OptionParser(prog=prog_name, usage=self.usage(subcommand), version=self.get_version()) - parser.add_option('-v', '--verbosity', action='store', dest='verbosity', default='1', - type='choice', choices=['0', '1', '2', '3'], + parser.add_option('-v', '--verbosity', action='callback', dest='verbosity', default=1, + type='choice', choices=['0', '1', '2', '3'], callback=store_as_int, help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output') parser.add_option('--settings', help=( diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt index 653df608cca..d7e063b397f 100644 --- a/docs/releases/1.8.3.txt +++ b/docs/releases/1.8.3.txt @@ -62,3 +62,7 @@ Bugfixes * Fixed ``SimpleTestCase.assertRaisesMessage()`` on Python 2.7.10 (:ticket:`24903`). + +* Provided better backwards compatibility for the ``verbosity`` argument in + ``optparse`` management commands by casting it to an integer + (:ticket:`24769`). diff --git a/tests/user_commands/management/commands/optparse_cmd.py b/tests/user_commands/management/commands/optparse_cmd.py index b92e90ee316..0ab74837d80 100644 --- a/tests/user_commands/management/commands/optparse_cmd.py +++ b/tests/user_commands/management/commands/optparse_cmd.py @@ -16,4 +16,5 @@ class Command(BaseCommand): options["example"] # BaseCommand default option is available options['verbosity'] + assert isinstance(options['verbosity'], int), "verbosity option is not int, but %s" % type(options['verbosity']) self.stdout.write("All right, let's dance %s." % options["style"])