Opened 9 years ago
Last modified 9 years ago
#26597 closed Bug
Optparse for `noinput` and `interactive` can produce unwanted results when passed togeather — at Version 1
Reported by: | Joseph Kahn | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.8 |
Severity: | Normal | Keywords: | migrate argparse command |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
The option mapping for argparse in call_command
is incorrectly mapping args. For example, it maps noinput
to interactive
and does not take into account that they are opposites. Here's where the bug is:
Because of the way options are parsed on:
https://github.com/django/django/blob/1.8.13/django/core/management/__init__.py#L106-L108
You can end up with the dictionary returning .items
back in one of two orders when you pass both interactive
and noinput
. Which is what I was doing in a test case.
I assume this is present on other management commands, but I have not tested them.
(note, I simplified opt_mapping
to just the example)
The following command:
arg_options = {opt_mapping.get(key, key): value for key, value in options.items()}
can be run as:
{{'noinput': 'interactive'}.get(key, key): value for key, value in [('verbosity', 0), ('fake', True), ('list', True), ('fake_initial', True), ('app_label', 'tests'), ('noinput', True), ('interactive', False)]}
or
{{'noinput': 'interactive'}.get(key, key): value for key, value in [('verbosity', 0), ('fake', True), ('list', True), ('fake_initial', True), ('app_label', 'tests'), ('interactive', False), ('noinput', True)]}
leading to interactive
being False or True, respectively.