--- a/ProjectDjango/Project.py Mon Mar 25 18:30:42 2013 +0100 +++ b/ProjectDjango/Project.py Tue Mar 26 16:37:01 2013 +0100 @@ -12,17 +12,19 @@ import re from PyQt4.QtCore import QObject, QProcess, QTimer, QUrl, QFileInfo -from PyQt4.QtGui import QMenu, QInputDialog, QLineEdit, QDesktopServices, QDialog, \ - QFileDialog +from PyQt4.QtGui import QMenu, QInputDialog, QLineEdit, QDesktopServices, QDialog from E5Gui.E5Application import e5App from E5Gui import E5MessageBox, E5FileDialog from E5Gui.E5Action import E5Action +from Globals import isWindowsPlatform + from .DjangoDialog import DjangoDialog import Preferences import Utilities +import UI.PixmapCache class DjangoNoSiteSelectedException(Exception): @@ -59,6 +61,8 @@ self.__recentApplications = [] self.__loadRecentApplications() + + self.__djangoVersion = "" def initActions(self): """ @@ -759,7 +763,7 @@ path, filter, None, - QFileDialog.Options(QFileDialog.DontConfirmOverwrite)) + E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) if not fname: # user aborted or didn't enter a filename @@ -823,27 +827,108 @@ self.__serverProcFinished() self.__setCurrentSite(None) + def __getVirtualEnvironment(self): + """ + Private method to get the path of the virtual environment. + + @return path of the virtual environment (string) + """ + language = self.__e5project.getProjectLanguage() + if language == "Python3": + virtEnv = self.__plugin.getPreferences("VirtualEnvironmentPy3") + elif language == "Python2": + virtEnv = self.__plugin.getPreferences("VirtualEnvironmentPy2") + else: + virtEnv = "" + if virtEnv and not os.path.exists(virtEnv): + virtEnv = "" + return virtEnv + + def __getDjangoAdminCommand(self): + """ + Public method to build a django-admin.py command. + + @param cmd command (string) + @return full pyramid command (string) + """ + virtualEnv = self.__getVirtualEnvironment() + if virtualEnv: + if isWindowsPlatform(): + cmd = os.path.join(virtualEnv, "Scripts", "django-admin.py") + else: + cmds = [ + os.path.join(virtualEnv, "bin", "django-admin.py"), + os.path.join(virtualEnv, "bin", "django-admin"), + os.path.join(virtualEnv, "local", "bin", "django-admin.py"), + os.path.join(virtualEnv, "local", "bin", "django-admin"), + ] + for cmd in cmds: + if os.path.exists(cmd): + break + else: + "" + else: + if isWindowsPlatform(): + cmd = os.path.join(sys.exec_prefix, "Scripts", "django-admin.py") + else: + if Utilities.isinpath("django-admin.py"): + cmd = "django-admin.py" + elif Utilities.isinpath("django-admin"): + cmd = "django-admin" + else: + # fall back + cmd = "django-admin.py" + return cmd + + def __getPythonExecutable(self): + """ + Public method to build the Python command. + + @return python command (string) + """ + python = "python" + if isWindowsPlatform(): + python += ".exe" + else: + language = self.__e5project.getProjectLanguage() + if language == "Python3": + python = "python3" + elif language == "Python2": + python = "python2" + virtualEnv = self.__getVirtualEnvironment() + if virtualEnv: + if isWindowsPlatform(): + python = os.path.join(virtualEnv, "Scripts", python) + if not os.path.exists(python): + python = os.path.join(virtualEnv, python) + else: + python = os.path.join(virtualEnv, "bin", python) + + return python + def __djangoInfo(self): """ Private slot to show some info about Django. """ - from django import VERSION - version = '.'.join([str(i) for i in VERSION[:-1]]) - if VERSION[-1]: - version += '-' + VERSION[-1] + version = self.getDjangoVersion() + url = "http://www.djangoproject.com" - E5MessageBox.about(self.__ui, + msgBox = E5MessageBox.E5MessageBox(E5MessageBox.Question, self.trUtf8("About Django"), self.trUtf8( "<p>Django is a high-level Python Web framework that encourages rapid " "development and clean, pragmatic design.</p>" "<p><table>" "<tr><td>Version:</td><td>{0}</td></tr>" - "<tr><td>URL:</td><td><a href=\"http://www.djangoproject.com\">" - "http://www.djangoproject.com</a></td></tr>" + "<tr><td>URL:</td><td><a href=\"{1}\">" + "{1}</a></td></tr>" "</table></p>" - ).format(version) - ) + ).format(version, url), + modal=True, + buttons=E5MessageBox.Ok) + msgBox.setIconPixmap(UI.PixmapCache.getPixmap( + os.path.join("ProjectDjango", "icons", "django64.png"))) + msgBox.exec_() def getDjangoVersion(self): """ @@ -851,8 +936,21 @@ @return Django version as a tuple """ - from django import VERSION - return VERSION + if not self.__djangoVersion: + ioEncoding = Preferences.getSystem("IOEncoding") + cmd = self.__getDjangoAdminCommand() + + process = QProcess() + process.start(cmd, ['--version']) + procStarted = process.waitForStarted() + if procStarted: + finished = process.waitForFinished(30000) + if finished and process.exitCode() == 0: + output = \ + str(process.readAllStandardOutput(), ioEncoding, 'replace') + self.__djangoVersion = output.splitlines()[0].strip() + + return self.__djangoVersion def __getApplications(self): """ @@ -923,15 +1021,6 @@ """ return self.__e5project.getProjectPath() - def __getPythonExecutable(self): - """ - Private method to determine the name of the Python executable. - - @return Python executable (string) - """ - # TODO: make this differentiate between Python2 and Python3 - return sys.executable.replace("pythonw", "python") - def __showHelpIndex(self): """ Private slot to show the help index page. @@ -996,15 +1085,18 @@ args = [] if Utilities.isWindowsPlatform(): args.append(self.__getPythonExecutable()) - args.append(os.path.join(sys.exec_prefix, "Scripts", "django-admin.py")) + args.append(self.__getDjangoAdminCommand()) else: - if Utilities.isinpath("django-admin.py"): - args.append("django-admin.py") - elif Utilities.isinpath("django-admin"): - args.append("django-admin") + cmd = self.__getDjangoAdminCommand() + if cmd: + args.append(cmd) else: - # fall back - args.append("django-admin.py") + E5MessageBox.critical(self.__ui, + title, + self.trUtf8("""<p>The <b>django-admin.py</b> script is not in""" + """ the path. Aborting...</p>""")) + return + args.append("startproject") args.append(projectName) @@ -1062,15 +1154,17 @@ if isGlobal: if Utilities.isWindowsPlatform(): args.append(self.__getPythonExecutable()) - args.append(os.path.join(sys.exec_prefix, "Scripts", "django-admin.py")) + args.append(self.__getDjangoAdminCommand()) else: - if Utilities.isinpath("django-admin.py"): - args.append("django-admin.py") - elif Utilities.isinpath("django-admin"): - args.append("django-admin") + cmd = self.__getDjangoAdminCommand() + if cmd: + args.append(cmd) else: - # fall back - args.append("django-admin.py") + E5MessageBox.critical(self.__ui, + title, + self.trUtf8("""<p>The <b>django-admin.py</b> script is not in""" + """ the path. Aborting...</p>""")) + return else: args.append(self.__getPythonExecutable()) args.append("manage.py") @@ -1576,8 +1670,13 @@ args.append(self.__getPythonExecutable()) args.append("manage.py") args.append("shell") - if self.__plugin.getPreferences("UsePlainPython"): - args.append("--plain") + language = self.__e5project.getProjectLanguage() + if language == "Python2": + if self.__plugin.getPreferences("UsePlainPythonPy2"): + args.append("--plain") + else: + if self.__plugin.getPreferences("UsePlainPythonPy3"): + args.append("--plain") try: wd = self.__sitePath() started, pid = QProcess.startDetached(args[0], args[1:], wd)