mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #30763 -- Fixed management commands when using required mutually exclusive groups.
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							350123f38c
						
					
				
				
					commit
					6c379f1a18
				
			| @@ -130,11 +130,19 @@ def call_command(command_name, *args, **options): | ||||
|                 yield opt | ||||
|  | ||||
|     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 | ||||
|     # to parse_args(). | ||||
|     parse_args += [ | ||||
|         '{}={}'.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 = 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) | ||||
|         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): | ||||
|         out = StringIO() | ||||
|         management.call_command('subparser', 'foo', 12, stdout=out) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user