Commit 8da2322c authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

Fixed #10080: `call_command` now takes option defaults into account, sparing...

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
parent 20b598bf
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
import os
import sys
from optparse import OptionParser
from optparse import OptionParser, NO_DEFAULT
import imp

import django
@@ -144,6 +144,7 @@ def call_command(name, *args, **options):
        call_command('shell', plain=True)
        call_command('sqlall', 'myapp')
    """
    # Load the command object.
    try:
        app_name = get_commands()[name]
        if isinstance(app_name, BaseCommand):
@@ -153,7 +154,17 @@ def call_command(name, *args, **options):
            klass = load_command_class(app_name, name)
    except KeyError:
        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):
    """
+6 −1
Original line number Diff line number Diff line
from optparse import make_option
from django.core.management.base import BaseCommand

class Command(BaseCommand):
@@ -5,5 +6,9 @@ class Command(BaseCommand):
    args = ''
    requires_model_validation = True

    option_list =[
        make_option("-s", "--style", default="Rock'n'Roll")
    ]

    def handle(self, *args, **options):
        print "I don't feel like dancing."
 No newline at end of file
        print "I don't feel like dancing %s." % options["style"]
+5 −2
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@ __test__ = {'API_TESTS': """
>>> from django.core import management

# Invoke a simple user-defined command
>>> management.call_command('dance')
I don't feel like dancing.
>>> management.call_command('dance', style="Jive")
I don't feel like dancing Jive.

# Invoke a command that doesn't exist
>>> management.call_command('explode')
@@ -26,5 +26,8 @@ Traceback (most recent call last):
...
CommandError: Unknown command: 'explode'

# Invoke a command with default option `style`
>>> management.call_command('dance')
I don't feel like dancing Rock'n'Roll.

"""}