Fixed #12735, #14892 and #11542 -- Fixed support for the latest IPython (development) version in the shell management command and added a hook to implement additional shell runners (by subclassing django.core.management.commands.shell.Command, extending the ``shells`` attribute and implement a method with the same name).

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14895 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2010-12-12 23:03:03 +00:00
parent 9ab85e05e2
commit 47a5153da4
1 changed files with 27 additions and 6 deletions

View File

@ -8,9 +8,34 @@ class Command(NoArgsCommand):
help='Tells Django to use plain Python, not IPython.'), help='Tells Django to use plain Python, not IPython.'),
) )
help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available." help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available."
shells = ['ipython']
requires_model_validation = False requires_model_validation = False
def ipython(self):
try:
from IPython.frontend.terminal.embed import TerminalInteractiveShell
shell = TerminalInteractiveShell()
shell.mainloop()
except ImportError:
# IPython < 0.11
# Explicitly pass an empty list as arguments, because otherwise
# IPython would use sys.argv from this script.
try:
from IPython.Shell import IPShell
shell = IPShell(argv=[])
shell.mainloop()
except ImportError:
# IPython not found at all, raise ImportError
raise
def run_shell(self):
for shell in self.shells:
try:
return getattr(self, shell)()
except ImportError:
pass
raise ImportError
def handle_noargs(self, **options): def handle_noargs(self, **options):
# XXX: (Temporary) workaround for ticket #1796: force early loading of all # XXX: (Temporary) workaround for ticket #1796: force early loading of all
# models from installed apps. # models from installed apps.
@ -23,11 +48,7 @@ class Command(NoArgsCommand):
if use_plain: if use_plain:
# Don't bother loading IPython, because the user wants plain Python. # Don't bother loading IPython, because the user wants plain Python.
raise ImportError raise ImportError
import IPython self.run_shell()
# Explicitly pass an empty list as arguments, because otherwise IPython
# would use sys.argv from this script.
shell = IPython.Shell.IPShell(argv=[])
shell.mainloop()
except ImportError: except ImportError:
import code import code
# Set up a dictionary to serve as the environment for the shell, so # Set up a dictionary to serve as the environment for the shell, so