Fixed #30763 -- Fixed management commands when using required mutually exclusive groups.
This commit is contained in:
parent
350123f38c
commit
6c379f1a18
|
@ -130,11 +130,19 @@ def call_command(command_name, *args, **options):
|
||||||
yield opt
|
yield opt
|
||||||
|
|
||||||
parser_actions = list(get_actions(parser))
|
parser_actions = list(get_actions(parser))
|
||||||
|
mutually_exclusive_required_options = {
|
||||||
|
opt
|
||||||
|
for group in parser._mutually_exclusive_groups
|
||||||
|
for opt in group._group_actions if group.required
|
||||||
|
}
|
||||||
# Any required arguments which are passed in via **options must be passed
|
# Any required arguments which are passed in via **options must be passed
|
||||||
# to parse_args().
|
# to parse_args().
|
||||||
parse_args += [
|
parse_args += [
|
||||||
'{}={}'.format(min(opt.option_strings), arg_options[opt.dest])
|
'{}={}'.format(min(opt.option_strings), arg_options[opt.dest])
|
||||||
for opt in parser_actions if opt.required and opt.dest in options
|
for opt in parser_actions if (
|
||||||
|
opt.dest in options and
|
||||||
|
(opt.required or opt in mutually_exclusive_required_options)
|
||||||
|
)
|
||||||
]
|
]
|
||||||
defaults = parser.parse_args(args=parse_args)
|
defaults = parser.parse_args(args=parse_args)
|
||||||
defaults = dict(defaults._get_kwargs(), **arg_options)
|
defaults = dict(defaults._get_kwargs(), **arg_options)
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
group = parser.add_mutually_exclusive_group(required=True)
|
||||||
|
group.add_argument('--foo-id', type=int, nargs='?', default=None)
|
||||||
|
group.add_argument('--foo-name', type=str, nargs='?', default=None)
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
self.stdout.write(','.join(options))
|
|
@ -214,6 +214,16 @@ class CommandTests(SimpleTestCase):
|
||||||
management.call_command('common_args', stdout=out)
|
management.call_command('common_args', stdout=out)
|
||||||
self.assertIn('Detected that --version already exists', out.getvalue())
|
self.assertIn('Detected that --version already exists', out.getvalue())
|
||||||
|
|
||||||
|
def test_mutually_exclusive_group_required_options(self):
|
||||||
|
out = StringIO()
|
||||||
|
management.call_command('mutually_exclusive_required', foo_id=1, stdout=out)
|
||||||
|
self.assertIn('foo_id', out.getvalue())
|
||||||
|
management.call_command('mutually_exclusive_required', foo_name='foo', stdout=out)
|
||||||
|
self.assertIn('foo_name', out.getvalue())
|
||||||
|
msg = 'Error: one of the arguments --foo-id --foo-name is required'
|
||||||
|
with self.assertRaisesMessage(CommandError, msg):
|
||||||
|
management.call_command('mutually_exclusive_required', stdout=out)
|
||||||
|
|
||||||
def test_subparser(self):
|
def test_subparser(self):
|
||||||
out = StringIO()
|
out = StringIO()
|
||||||
management.call_command('subparser', 'foo', 12, stdout=out)
|
management.call_command('subparser', 'foo', 12, stdout=out)
|
||||||
|
|
Loading…
Reference in New Issue