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.
This commit is contained in:
Rivo Laks 2015-06-04 18:03:28 +01:00 committed by Tim Graham
parent 90c59db7a3
commit a0047c6242
3 changed files with 10 additions and 2 deletions

View File

@ -257,6 +257,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",
@ -264,8 +267,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=(

View File

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

View File

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