Created
July 23, 2010 16:11
-
-
Save dvydra/487646 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
from django.core.management.base import NoArgsCommand | |
from optparse import make_option | |
def start_plain_shell(): | |
import code | |
# Set up a dictionary to serve as the environment for the shell, so | |
# that tab completion works on objects that are imported at runtime. | |
# See ticket 5082. | |
imported_objects = {} | |
try: # Try activating rlcompleter, because it's handy. | |
import readline | |
except ImportError: | |
pass | |
else: | |
# We don't have to wrap the following import in a 'try', because | |
# we already know 'readline' was imported successfully. | |
import rlcompleter | |
readline.set_completer(rlcompleter.Completer(imported_objects).complete) | |
readline.parse_and_bind("tab:complete") | |
# We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system | |
# conventions and get $PYTHONSTARTUP first then import user. | |
pythonrc = os.environ.get("PYTHONSTARTUP") | |
if pythonrc and os.path.isfile(pythonrc): | |
try: | |
execfile(pythonrc) | |
except NameError: | |
pass | |
# This will import .pythonrc.py as a side-effect | |
import user | |
code.interact(local=imported_objects) | |
class Command(NoArgsCommand): | |
option_list = NoArgsCommand.option_list + ( | |
make_option('--plain', action='store_true', dest='plain', | |
help='Tells Django to use plain Python, not bpython.'), | |
make_option('--bpython', action='store_true', dest='bpython', | |
help='Tells Django to use bpython.'), | |
) | |
help = "Runs a Python interactive interpreter. Tries to use bpython, if it's available." | |
requires_model_validation = False | |
def handle_noargs(self, **options): | |
# XXX: (Temporary) workaround for ticket #1796: force early loading of all | |
# models from installed apps. | |
from django.db.models.loading import get_models, get_apps | |
loaded_models = get_models() | |
# Set up a dictionary to serve as the environment for the shell, so | |
# that tab completion works on objects that are imported at runtime. | |
# See ticket 5082. | |
from django.conf import settings | |
imported_objects = {'settings': settings} | |
for app_mod in get_apps(): | |
app_models = get_models(app_mod) | |
if not app_models: | |
continue | |
model_labels = ", ".join([model.__name__ for model in app_models]) | |
print self.style.SQL_COLTYPE("From '%s' autoload: %s" % (app_mod.__name__.split('.')[-2], model_labels)) | |
for model in app_models: | |
try: | |
imported_objects[model.__name__] = getattr(__import__(app_mod.__name__, {}, {}, model.__name__), model.__name__) | |
except AttributeError, e: | |
print self.style.ERROR_OUTPUT("Failed to import '%s' from '%s' reason: %s" % (model.__name__, app_mod.__name__.split('.')[-2], str(e))) | |
continue | |
try: | |
from bpython import embed | |
embed(imported_objects) | |
except ImportError: | |
start_plain_shell() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment