ProjectDjango/Project.py

changeset 12
430932e3094c
parent 11
5eda53fad138
child 16
54c41e37792d
--- a/ProjectDjango/Project.py	Wed Mar 27 09:22:59 2013 +0100
+++ b/ProjectDjango/Project.py	Sun Mar 31 17:07:43 2013 +0200
@@ -827,13 +827,90 @@
             self.__serverProcFinished()
         self.__setCurrentSite(None)
     
-    def __getVirtualEnvironment(self):
+    def __getExecutablePaths(self, file):
+        """
+        Private method to build all full path of an executable file from
+        the environment.
+        
+        @param file filename of the executable (string)
+        @return list of full executable names, if the executable file is accessible
+            via the searchpath defined by the PATH environment variable, or an
+            empty list otherwise.
+        """
+        paths = []
+        
+        if os.path.isabs(file):
+            if os.access(file, os.X_OK):
+                return [file]
+            else:
+                return []
+            
+        cur_path = os.path.join(os.curdir, file)
+        if os.path.exists(cur_path):
+            if os.access(cur_path, os.X_OK):
+                paths.append(cur_path)
+
+        path = os.getenv('PATH')
+        
+        # environment variable not defined
+        if path is not None:
+            dirs = path.split(os.pathsep)
+            for dir in dirs:
+                exe = os.path.join(dir, file)
+                if os.access(exe, os.X_OK) and exe not in paths:
+                    paths.append(exe)
+        
+        return paths
+    
+    def supportedPythonVariants(self):
+        """
+        Public method to get the supported Python variants.
+        
+        @return list of supported Python variants (list of strings)
+        """
+        variants = []
+        for variant in 'Python2', 'Python3':
+            virtEnv = self.__getVirtualEnvironment(variant)
+            if virtEnv:
+                if self.__getDjangoAdminCommand(variant):
+                    variants.append(variant)
+            else:
+                cmd = self.__getDjangoAdminCommand()
+                if isWindowsPlatform():
+                    if variant.lower() in cmd.lower():
+                        variants.append(variant)
+                else:
+                    try:
+                        fullCmds = Utilities.getExecutablePaths(cmd)
+                    except AttributeError:
+                        fullCmds = self.__getExecutablePaths(cmd)
+                    for fullCmd in fullCmds:
+                        try:
+                            f = open(fullCmd, 'r', encoding='utf-8')
+                            l0 = f.readline()
+                            f.close()
+                        except (IOError, OSError):
+                            l0 = ""
+                        if variant.lower() in l0.lower() or \
+                           "{0}.".format(variant[-1]) in l0 or \
+                           (variant == "Python2" and \
+                            "python3" not in l0.lower() and \
+                            "python" in l0.lower()):
+                            variants.append(variant)
+                            break
+        
+        return variants
+    
+    def __getVirtualEnvironment(self, language=""):
         """
         Private method to get the path of the virtual environment.
         
+        @param language Python variant to get the virtual environment
+            for (string, one of '', 'Python2' or 'Python3')
         @return path of the virtual environment (string)
         """
-        language = self.__e5project.getProjectLanguage()
+        if not language:
+            language = self.__e5project.getProjectLanguage()
         if language == "Python3":
             virtEnv = self.__plugin.getPreferences("VirtualEnvironmentPy3")
         elif language == "Python2":
@@ -844,14 +921,15 @@
             virtEnv = ""
         return virtEnv
     
-    def __getDjangoAdminCommand(self):
+    def __getDjangoAdminCommand(self, language=""):
         """
-        Public method to build a django-admin.py command.
+        Private method to build a django-admin.py command.
         
-        @param cmd command (string)
+        @param language Python variant to get the django-admin.py
+            command for (string, one of '', 'Python2' or 'Python3')
         @return full django-admin.py command (string)
         """
-        virtualEnv = self.__getVirtualEnvironment()
+        virtualEnv = self.__getVirtualEnvironment(language)
         if virtualEnv:
             if isWindowsPlatform():
                 cmd = os.path.join(virtualEnv, "Scripts", "django-admin.py")
@@ -878,6 +956,7 @@
                 else:
                     # fall back
                     cmd = "django-admin.py"
+        
         return cmd
     
     def __getPythonExecutable(self):

eric ide

mercurial