/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.django.debug.ui.actions; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.python.pydev.core.IPythonNature; import org.python.pydev.core.IPythonPathNature; import org.python.pydev.core.log.Log; import org.python.pydev.debug.newconsole.PydevConsoleFactory; import org.python.pydev.debug.newconsole.PydevConsoleInterpreter; import org.python.pydev.debug.newconsole.env.PydevIProcessFactory; import org.python.pydev.debug.newconsole.env.PydevIProcessFactory.PydevConsoleLaunchInfo; import org.python.pydev.django.launching.DjangoConstants; import org.python.pydev.editor.actions.PyAction; import org.python.pydev.plugin.nature.PythonNature; public class DjangoShell extends DjangoAction { public void run(IAction action) { try { // this.launchDjangoCommand("shell", false); PythonNature nature = PythonNature.getPythonNature(selectedProject); if (nature == null) { MessageDialog.openError(PyAction.getShell(), "PyDev nature not found", "Unable to perform action because the Pydev nature is not properly set."); return; } IPythonPathNature pythonPathNature = nature.getPythonPathNature(); String settingsModule = null; Map<String, String> variableSubstitution = null; try { variableSubstitution = pythonPathNature.getVariableSubstitution(); settingsModule = variableSubstitution.get(DjangoConstants.DJANGO_SETTINGS_MODULE); } catch (Exception e1) { throw new RuntimeException(e1); } if (settingsModule == null) { InputDialog d = new InputDialog(PyAction.getShell(), "Settings module", "Please enter the settings module to be used.\n" + "\n" + "Note that it can be edited later in:\np" + "roject properties > pydev pythonpath > string substitution variables.", selectedProject.getName() + ".settings", new IInputValidator() { public String isValid(String newText) { if (newText.length() == 0) { return "Text must be entered."; } for (char c : newText.toCharArray()) { if (c == ' ') { return "Whitespaces not accepted"; } if (c != '.' && !Character.isJavaIdentifierPart(c)) { return "Invalid char: " + c; } } return null; } }); int retCode = d.open(); if (retCode == InputDialog.OK) { settingsModule = d.getValue(); variableSubstitution.put(DjangoConstants.DJANGO_SETTINGS_MODULE, settingsModule); try { pythonPathNature.setVariableSubstitution(variableSubstitution); } catch (Exception e) { Log.log(e); } } if (settingsModule == null) { return; } } List<IPythonNature> natures = Collections.singletonList((IPythonNature) nature); PydevConsoleFactory consoleFactory = new PydevConsoleFactory(); PydevConsoleLaunchInfo launchInfo = new PydevIProcessFactory().createLaunch( nature.getRelatedInterpreterManager(), nature.getProjectInterpreter(), nature.getPythonPathNature().getCompleteProjectPythonPath(nature.getProjectInterpreter(), nature.getRelatedInterpreterManager()), nature, natures); PydevConsoleInterpreter interpreter = PydevConsoleFactory.createPydevInterpreter(launchInfo, natures); String importStr = "";//"from " + selectedProject.getName() + " import settings;"; importStr = "import " + settingsModule + " as settings;"; consoleFactory.createConsole(interpreter, "\nfrom django.core import management;" + importStr + "management.setup_environ(settings)\n"); } catch (Exception e) { throw new RuntimeException(e); } } }