Fixed #10080: `call_command` now takes option defaults into account, sparing individual commands from any difference between `call_command` and being run from the shell. Thanks, Alex Koshelev.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10400 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
20b598bf3e
commit
8da2322cad
|
@ -1,6 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser, NO_DEFAULT
|
||||||
import imp
|
import imp
|
||||||
|
|
||||||
import django
|
import django
|
||||||
|
@ -144,6 +144,7 @@ def call_command(name, *args, **options):
|
||||||
call_command('shell', plain=True)
|
call_command('shell', plain=True)
|
||||||
call_command('sqlall', 'myapp')
|
call_command('sqlall', 'myapp')
|
||||||
"""
|
"""
|
||||||
|
# Load the command object.
|
||||||
try:
|
try:
|
||||||
app_name = get_commands()[name]
|
app_name = get_commands()[name]
|
||||||
if isinstance(app_name, BaseCommand):
|
if isinstance(app_name, BaseCommand):
|
||||||
|
@ -153,7 +154,17 @@ def call_command(name, *args, **options):
|
||||||
klass = load_command_class(app_name, name)
|
klass = load_command_class(app_name, name)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise CommandError, "Unknown command: %r" % name
|
raise CommandError, "Unknown command: %r" % name
|
||||||
return klass.execute(*args, **options)
|
|
||||||
|
# Grab out a list of defaults from the options. optparse does this for us
|
||||||
|
# when the script runs from the command line, but since call_command can
|
||||||
|
# be called programatically, we need to simulate the loading and handling
|
||||||
|
# of defaults (see #10080 for details).
|
||||||
|
defaults = dict([(o.dest, o.default)
|
||||||
|
for o in klass.option_list
|
||||||
|
if o.default is not NO_DEFAULT])
|
||||||
|
defaults.update(options)
|
||||||
|
|
||||||
|
return klass.execute(*args, **defaults)
|
||||||
|
|
||||||
class LaxOptionParser(OptionParser):
|
class LaxOptionParser(OptionParser):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from optparse import make_option
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
@ -5,5 +6,9 @@ class Command(BaseCommand):
|
||||||
args = ''
|
args = ''
|
||||||
requires_model_validation = True
|
requires_model_validation = True
|
||||||
|
|
||||||
|
option_list =[
|
||||||
|
make_option("-s", "--style", default="Rock'n'Roll")
|
||||||
|
]
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
print "I don't feel like dancing."
|
print "I don't feel like dancing %s." % options["style"]
|
||||||
|
|
|
@ -17,8 +17,8 @@ __test__ = {'API_TESTS': """
|
||||||
>>> from django.core import management
|
>>> from django.core import management
|
||||||
|
|
||||||
# Invoke a simple user-defined command
|
# Invoke a simple user-defined command
|
||||||
>>> management.call_command('dance')
|
>>> management.call_command('dance', style="Jive")
|
||||||
I don't feel like dancing.
|
I don't feel like dancing Jive.
|
||||||
|
|
||||||
# Invoke a command that doesn't exist
|
# Invoke a command that doesn't exist
|
||||||
>>> management.call_command('explode')
|
>>> management.call_command('explode')
|
||||||
|
@ -26,5 +26,8 @@ Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
CommandError: Unknown command: 'explode'
|
CommandError: Unknown command: 'explode'
|
||||||
|
|
||||||
|
# Invoke a command with default option `style`
|
||||||
|
>>> management.call_command('dance')
|
||||||
|
I don't feel like dancing Rock'n'Roll.
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
Loading…
Reference in New Issue