[1.8.x] Fixed -- 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 ().

Initial report and patch from blueyed.

Backport of a0047c6242 from master
This commit is contained in:
Rivo Laks 2015-06-04 18:03:28 +01:00 committed by Tim Graham
parent 8bc18ebf0f
commit 76c526f80e
3 changed files with 10 additions and 2 deletions
django/core/management
docs/releases
tests/user_commands/management/commands

View File

@ -300,6 +300,9 @@ class BaseCommand(object):
""" """
if not self.use_argparse: 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 # Backwards compatibility: use deprecated optparse module
warnings.warn("OptionParser usage for Django management commands " warnings.warn("OptionParser usage for Django management commands "
"is deprecated, use ArgumentParser instead", "is deprecated, use ArgumentParser instead",
@ -307,8 +310,8 @@ class BaseCommand(object):
parser = OptionParser(prog=prog_name, parser = OptionParser(prog=prog_name,
usage=self.usage(subcommand), usage=self.usage(subcommand),
version=self.get_version()) version=self.get_version())
parser.add_option('-v', '--verbosity', action='store', dest='verbosity', default='1', parser.add_option('-v', '--verbosity', action='callback', dest='verbosity', default=1,
type='choice', choices=['0', '1', '2', '3'], 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') help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output')
parser.add_option('--settings', parser.add_option('--settings',
help=( help=(

View File

@ -62,3 +62,7 @@ Bugfixes
* Fixed ``SimpleTestCase.assertRaisesMessage()`` on Python 2.7.10 * Fixed ``SimpleTestCase.assertRaisesMessage()`` on Python 2.7.10
(:ticket:`24903`). (: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"] options["example"]
# BaseCommand default option is available # BaseCommand default option is available
options['verbosity'] 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"]) self.stdout.write("All right, let's dance %s." % options["style"])