--- 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):