Browse Source

Fixed #25680 -- Added django-admin shell --command option.

Add a -c option to the shell command to execute a command passed as a
string as Django.
Niels Van Och 9 years ago
parent
commit
7f7553dd30

+ 7 - 0
django/core/management/commands/shell.py

@@ -18,6 +18,8 @@ class Command(BaseCommand):
             help='When using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.')
         parser.add_argument('-i', '--interface', choices=self.shells, dest='interface',
             help='Specify an interactive interpreter interface. Available options: "ipython", "bpython", and "python"')
+        parser.add_argument('-c', '--command', dest='command',
+            help='Instead of opening an interactive shell, run a command as Django and exit.')
 
     def _ipython_pre_011(self):
         """Start IPython pre-0.11"""
@@ -93,6 +95,11 @@ class Command(BaseCommand):
             )
             options['interface'] = 'python'
 
+        # Execute the command and exit.
+        if options['command']:
+            exec(options['command'])
+            return
+
         available_shells = [options['interface']] if options['interface'] else self.shells
 
         for shell in available_shells:

+ 9 - 0
docs/ref/django-admin.txt

@@ -970,6 +970,15 @@ behavior you can use the ``--no-startup`` option. e.g.::
 
     django-admin shell --interface python --no-startup
 
+.. django-admin-option:: --command, -c <command>
+
+.. versionadded:: 1.10
+
+The ``--command`` option lets you pass a command as a string to execute it as
+Django, like so::
+
+    django-admin shell --command="import django; print(django.__version__)"
+
 showmigrations [<app_label> [<app_label>]]
 ------------------------------------------
 

+ 3 - 0
docs/releases/1.10.txt

@@ -224,6 +224,9 @@ Management Commands
 * The :djadmin:`shell` ``--interface`` option now accepts ``python`` to force
   use of the "plain" Python interpreter.
 
+* The new :djadminopt:`shell --command <--command>` option lets you run a
+  command as Django and exit, instead of opening the interactive shell.
+
 Migrations
 ^^^^^^^^^^
 

+ 0 - 0
tests/shell/__init__.py


+ 19 - 0
tests/shell/tests.py

@@ -0,0 +1,19 @@
+from django import __version__
+from django.core.management import call_command
+from django.test import SimpleTestCase
+from django.test.utils import patch_logger
+
+
+class ShellCommandTestCase(SimpleTestCase):
+
+    def test_command_option(self):
+        with patch_logger('test', 'info') as logger:
+            call_command(
+                'shell',
+                command=(
+                    'import django; from logging import getLogger; '
+                    'getLogger("test").info(django.__version__)'
+                ),
+            )
+            self.assertEqual(len(logger), 1)
+            self.assertEqual(logger[0], __version__)