ProjectDjango/Project.py

changeset 9
8fe581309106
parent 8
07d64408f2b7
child 10
77b4a30cdbbf
--- 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)

eric ide

mercurial