diff -r c6182aab51e9 -r b8f263e05c39 ProjectDjango/Project.py --- a/ProjectDjango/Project.py Wed Dec 30 11:02:06 2020 +0100 +++ b/ProjectDjango/Project.py Sat Apr 24 11:25:03 2021 +0200 @@ -10,6 +10,7 @@ import os import re import shutil +import contextlib from PyQt5.QtCore import QObject, QTimer, QUrl, QFileInfo from PyQt5.QtGui import QDesktopServices @@ -52,14 +53,16 @@ if args is None: args = [] - if cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', - 'mate-terminal')): - if '-e' in args: - index = args.index('-e') + 1 - cargs = ' '.join(args[index:]) - args[index:] = [cargs] + if ( + cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', + 'mate-terminal')) and + '-e' in args + ): + index = args.index('-e') + 1 + cargs = ' '.join(args[index:]) + args[index:] = [cargs] - super(QProcess, self).start(cmd, args, mode) + super().start(cmd, args, mode) @staticmethod def startDetached(cmd, args=None, path=''): @@ -75,12 +78,14 @@ if args is None: args = [] - if cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', - 'mate-terminal')): - if '-e' in args: - index = args.index('-e') + 1 - cargs = ' '.join(args[index:]) - args[index:] = [cargs] + if ( + cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal', + 'mate-terminal')) and + '-e' in args + ): + index = args.index('-e') + 1 + cargs = ' '.join(args[index:]) + args[index:] = [cargs] return QProcessPyQt.startDetached(cmd, args, path) @@ -103,7 +108,7 @@ @param parent parent @type QObject """ - super(Project, self).__init__(parent) + super().__init__(parent) self.__plugin = plugin self.__iconSuffix = iconSuffix @@ -392,108 +397,6 @@ """ Private method to define the database SQL related actions. """ - self.databaseSqlCreateTablesAct = E5Action( - self.tr('Create Tables'), - self.tr('Create &Tables'), - 0, 0, - self, 'django_database_sql_create_tables') - self.databaseSqlCreateTablesAct.setStatusTip(self.tr( - 'Prints the CREATE TABLE SQL statements for one or more' - ' applications')) - self.databaseSqlCreateTablesAct.setWhatsThis(self.tr( - """<b>Create Tables</b>""" - """<p>Prints the CREATE TABLE SQL statements for one or """ - """more applications.</p>""" - )) - self.databaseSqlCreateTablesAct.triggered.connect( - self.__databaseSqlCreateTables) - self.actions.append(self.databaseSqlCreateTablesAct) - - self.databaseSqlCreateIndexesAct = E5Action( - self.tr('Create Indexes'), - self.tr('Create &Indexes'), - 0, 0, - self, 'django_database_sql_create_indexes') - self.databaseSqlCreateIndexesAct.setStatusTip(self.tr( - 'Prints the CREATE INDEX SQL statements for one or more' - ' applications')) - self.databaseSqlCreateIndexesAct.setWhatsThis(self.tr( - """<b>Create Indexes</b>""" - """<p>Prints the CREATE INDEX SQL statements for one or """ - """more applications.</p>""" - )) - self.databaseSqlCreateIndexesAct.triggered.connect( - self.__databaseSqlCreateIndexes) - self.actions.append(self.databaseSqlCreateIndexesAct) - - self.databaseSqlCreateEverythingAct = E5Action( - self.tr('Create Everything'), - self.tr('Create &Everything'), - 0, 0, - self, 'django_database_sql_create_everything') - self.databaseSqlCreateEverythingAct.setStatusTip(self.tr( - 'Prints the CREATE ... SQL statements for one or more' - ' applications')) - self.databaseSqlCreateEverythingAct.setWhatsThis(self.tr( - """<b>Create Everything</b>""" - """<p>Prints the CREATE TABLE, custom SQL and CREATE INDEX SQL """ - """statements for one or more applications.</p>""" - )) - self.databaseSqlCreateEverythingAct.triggered.connect( - self.__databaseSqlCreateEverything) - self.actions.append(self.databaseSqlCreateEverythingAct) - - self.databaseSqlCustomAct = E5Action( - self.tr('Custom Statements'), - self.tr('&Custom Statements'), - 0, 0, - self, 'django_database_sql_custom') - self.databaseSqlCustomAct.setStatusTip(self.tr( - 'Prints the custom table modifying SQL statements for ' - 'one or more applications')) - self.databaseSqlCustomAct.setWhatsThis(self.tr( - """<b>Custom Statements</b>""" - """<p>Prints the custom table modifying SQL statements """ - """for one or more applications.</p>""" - )) - self.databaseSqlCustomAct.triggered.connect( - self.__databaseSqlCustom) - self.actions.append(self.databaseSqlCustomAct) - - self.databaseSqlDropTablesAct = E5Action( - self.tr('Drop Tables'), - self.tr('&Drop Tables'), - 0, 0, - self, 'django_database_sql_drop_tables') - self.databaseSqlDropTablesAct.setStatusTip(self.tr( - 'Prints the DROP TABLE SQL statements for ' - 'one or more applications')) - self.databaseSqlDropTablesAct.setWhatsThis(self.tr( - """<b>Drop Tables</b>""" - """<p>Prints the DROP TABLE SQL statements """ - """for one or more applications.</p>""" - )) - self.databaseSqlDropTablesAct.triggered.connect( - self.__databaseSqlDropTables) - self.actions.append(self.databaseSqlDropTablesAct) - - self.databaseSqlDropIndexesAct = E5Action( - self.tr('Drop Indexes'), - self.tr('&Drop Indexes'), - 0, 0, - self, 'django_database_sql_drop_indexes') - self.databaseSqlDropIndexesAct.setStatusTip(self.tr( - 'Prints the DROP INDEX SQL statements for ' - 'one or more applications')) - self.databaseSqlDropIndexesAct.setWhatsThis(self.tr( - """<b>Drop Indexes</b>""" - """<p>Prints the DROP INDEX SQL statements """ - """for one or more applications.</p>""" - )) - self.databaseSqlDropIndexesAct.triggered.connect( - self.__databaseSqlDropIndexes) - self.actions.append(self.databaseSqlDropIndexesAct) - self.databaseSqlFlushAct = E5Action( self.tr('Flush Database'), self.tr('&Flush Database'), @@ -923,16 +826,6 @@ menu = QMenu(self.tr("Show &SQL"), self.__ui) menu.setTearOffEnabled(True) - if self.getDjangoVersion() < (1, 9, 0): - menu.addAction(self.databaseSqlCreateTablesAct) - menu.addAction(self.databaseSqlCreateIndexesAct) - menu.addAction(self.databaseSqlCreateEverythingAct) - menu.addSeparator() - menu.addAction(self.databaseSqlCustomAct) - menu.addSeparator() - menu.addAction(self.databaseSqlDropTablesAct) - menu.addAction(self.databaseSqlDropIndexesAct) - menu.addSeparator() menu.addAction(self.databaseSqlFlushAct) menu.addAction(self.databaseSqlResetSeqAct) menu.addSeparator() @@ -981,9 +874,8 @@ menu.addAction(self.diffSettingsAct) menu.addSeparator() menu.addAction(self.runPythonShellAct) - if self.getDjangoVersion() >= (1, 9, 0): - menu.addSeparator() - menu.addAction(self.testEmailAct) + menu.addSeparator() + menu.addAction(self.testEmailAct) self.__menus["tools"] = menu @@ -1253,9 +1145,8 @@ 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) + if os.path.exists(cur_path) and os.access(cur_path, os.X_OK): + paths.append(cur_path) path = os.getenv('PATH') @@ -1333,11 +1224,11 @@ """ if not language: language = self.__e5project.getProjectLanguage() - if language == "Python3": - venvName = self.__plugin.getPreferences( - "VirtualEnvironmentNamePy3") - else: - venvName = "" + venvName = ( + self.__plugin.getPreferences("VirtualEnvironmentNamePy3") + if language == "Python3" else + "" + ) if venvName: virtEnv = self.__virtualEnvManager.getVirtualenvDirectory( venvName) @@ -1460,11 +1351,11 @@ venvName = Preferences.getDebugger("Python3VirtualEnv") else: venvName = "" - if venvName: - python = self.__virtualEnvManager.getVirtualenvInterpreter( - venvName) - else: - python = "" + python = ( + self.__virtualEnvManager.getVirtualenvInterpreter(venvName) + if venvName else + "" + ) return python @@ -2058,7 +1949,7 @@ if addr: args.append(addr) - try: + with contextlib.suppress(DjangoNoSiteSelectedException): if Utilities.isWindowsPlatform(): serverProcStarted, pid = QProcess.startDetached( args[0], args[1:], self.__sitePath()) @@ -2077,8 +1968,6 @@ None, self.tr('Process Generation Error'), self.tr('The Django server could not be started.')) - except DjangoNoSiteSelectedException: - pass def __serverProcFinished(self): """ @@ -2212,10 +2101,7 @@ database = self.getRecentDatabaseNames()[0] self.__currentDatabase = database - if database: - curDb = database - else: - curDb = self.tr("<default>") + curDb = database if database else self.tr("<default>") self.selectDatabaseNameAct.setText( self.tr('&Current Database ({0})').format(curDb)) @@ -2304,7 +2190,7 @@ args.append("dbshell") if self.__currentDatabase: args.append("--database={0}".format(self.__currentDatabase)) - try: + with contextlib.suppress(DjangoNoSiteSelectedException): wd = self.__sitePath() self.__adjustWorkingDirectory(args, wd) started, pid = QProcess.startDetached(args[0], args[1:], wd) @@ -2313,8 +2199,6 @@ None, self.tr('Process Generation Error'), self.tr('The Django process could not be started.')) - except DjangoNoSiteSelectedException: - pass ####################################################################### ## slots below implement database functions outputting SQL statements @@ -2357,60 +2241,6 @@ if res: dia.exec() - def __databaseSqlCreateTables(self): - """ - Private slot to print the CREATE TABLE SQL statements for one - or more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Create Tables"), "sql") - - def __databaseSqlCreateIndexes(self): - """ - Private slot to print the CREATE INDEX SQL statements for one - or more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Create Indexes"), "sqlindexes") - - def __databaseSqlCreateEverything(self): - """ - Private slot to print the CREATE TABLE, custom SQL and - CREATE INDEX SQL statements for one or more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Create Everything"), "sqlall") - - def __databaseSqlCustom(self): - """ - Private slot to print the custom table modifying SQL statements - for one or more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Custom Statements"), "sqlcustom") - - def __databaseSqlDropTables(self): - """ - Private slot to print the DROP TABLE SQL statements for one or - more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Drop Tables"), "sqlclear") - - def __databaseSqlDropIndexes(self): - """ - Private slot to print the DROP INDEX SQL statements for one or - more applications. - - Note: available before Django v1.9.0 - """ - self.__sqlCommand(self.tr("Drop Indexes"), "sqldropindexes") - def __databaseSqlFlushDatabase(self): """ Private slot to print a list of statements to return all database @@ -2549,10 +2379,11 @@ @param migration name of a migration to update to @type str """ - if migration == "zero": - title = self.tr("Unapply Migrations") - else: - title = self.tr("Apply Migrations") + title = ( + self.tr("Unapply Migrations") + if migration == "zero" else + self.tr("Apply Migrations") + ) try: path = self.__sitePath() @@ -2612,33 +2443,31 @@ args.append("manage.py") args.append("showmigrations") args.append("--list") - if self.getDjangoVersion() >= (1, 9, 0): - if self.__currentDatabase: - args.append("--database={0}".format(self.__currentDatabase)) + if self.__currentDatabase: + args.append("--database={0}".format(self.__currentDatabase)) migrations = {} proc = QProcess() if path: proc.setWorkingDirectory(path) proc.start(self.__getPythonExecutable(), args) - if proc.waitForStarted(): - if proc.waitForFinished(): - output = str(proc.readAllStandardOutput(), - Preferences.getSystem("IOEncoding"), 'replace') - if output: - recentApp = "" - for line in output.splitlines(): - if not line.startswith(" "): - # application name - recentApp = line.strip() - migrations[recentApp] = [] - else: - # migration name - line = line.strip() - applied = line[1] != " " - name = line[3:].strip() - if recentApp: - migrations[recentApp].append((applied, name)) + if proc.waitForStarted() and proc.waitForFinished(): + output = str(proc.readAllStandardOutput(), + Preferences.getSystem("IOEncoding"), 'replace') + if output: + recentApp = "" + for line in output.splitlines(): + if not line.startswith(" "): + # application name + recentApp = line.strip() + migrations[recentApp] = [] + else: + # migration name + line = line.strip() + applied = line[1] != " " + name = line[3:].strip() + if recentApp: + migrations[recentApp].append((applied, name)) return migrations def __makeMigrations(self): @@ -2792,14 +2621,9 @@ args.append(self.__getPythonExecutable()) args.append("manage.py") args.append("shell") - if self.getDjangoVersion() < (1, 10, 0): - if (self.__plugin.getPreferences("Python3ConsoleType") == - "python"): - args.append("--plain") - else: - args.append("--interface={0}".format( - self.__plugin.getPreferences("Python3ConsoleType"))) - try: + args.append("--interface={0}".format( + self.__plugin.getPreferences("Python3ConsoleType"))) + with contextlib.suppress(DjangoNoSiteSelectedException): wd = self.__sitePath() self.__adjustWorkingDirectory(args, wd) started, pid = QProcess.startDetached(args[0], args[1:], wd) @@ -2808,16 +2632,11 @@ None, self.tr('Process Generation Error'), self.tr('The Django process could not be started.')) - except DjangoNoSiteSelectedException: - pass def __sendTestEmail(self): """ Private slot to send a test email through Django. """ - if self.getDjangoVersion() < (1, 9, 0): - return - title = self.tr("Send Test Email") from .DjangoSendTestEmailDataDialog import ( @@ -2909,10 +2728,8 @@ args.append("--indent={0}".format(indent)) for excl in excls: args.append("--exclude={0}".format(excl)) - if self.getDjangoVersion() >= (1, 9, 0): - if self.__currentDatabase: - args.append("--database={0}".format( - self.__currentDatabase)) + if self.__currentDatabase: + args.append("--database={0}".format(self.__currentDatabase)) args += appls if dumpFormat == "json": @@ -2948,9 +2765,8 @@ args.append(self.__getPythonExecutable()) args.append("manage.py") args.append("loaddata") - if self.getDjangoVersion() >= (1, 11, 0): - for excl in excludes: - args.append("--exclude={0}".format(excl)) + for excl in excludes: + args.append("--exclude={0}".format(excl)) if ignore: args.append("--ignorenonexistent") if appLabel: @@ -3043,7 +2859,7 @@ args.append("--addrport={0}".format(addr)) args += fixtures - try: + with contextlib.suppress(DjangoNoSiteSelectedException): if Utilities.isWindowsPlatform(): serverProcStarted, pid = QProcess.startDetached( args[0], args[1:], self.__sitePath()) @@ -3065,8 +2881,6 @@ self.tr('Process Generation Error'), self.tr('The Django test server could not be' ' started.')) - except DjangoNoSiteSelectedException: - pass def __testServerProcFinished(self): """ @@ -3104,7 +2918,7 @@ args.append("manage.py") args.append("changepassword") args.append(userName) - try: + with contextlib.suppress(DjangoNoSiteSelectedException): wd = self.__sitePath() self.__adjustWorkingDirectory(args, wd) started, pid = QProcess.startDetached( @@ -3115,8 +2929,6 @@ self.tr('Process Generation Error'), self.tr('The Django process could not be' ' started.')) - except DjangoNoSiteSelectedException: - pass def __createSuperUser(self): """ @@ -3130,7 +2942,7 @@ args.append(self.__getPythonExecutable()) args.append("manage.py") args.append("createsuperuser") - try: + with contextlib.suppress(DjangoNoSiteSelectedException): wd = self.__sitePath() self.__adjustWorkingDirectory(args, wd) started, pid = QProcess.startDetached(args[0], args[1:], wd) @@ -3139,8 +2951,6 @@ None, self.tr('Process Generation Error'), self.tr('The Django process could not be started.')) - except DjangoNoSiteSelectedException: - pass ################################################################## ## slots below implement session functions @@ -3453,9 +3263,8 @@ args.append("manage.py") args.append("compilemessages") args.append("--locale={0}".format(locale)) - if self.getDjangoVersion() >= (1, 8, 0): - if self.__plugin.getPreferences("FuzzyTranslations"): - args.append("--use-fuzzy") + if self.__plugin.getPreferences("FuzzyTranslations"): + args.append("--use-fuzzy") argsLists.append(args) if len(argsLists) == 0: @@ -3491,9 +3300,8 @@ args.append(self.__getPythonExecutable()) args.append("manage.py") args.append("compilemessages") - if self.getDjangoVersion() >= (1, 8, 0): - if self.__plugin.getPreferences("FuzzyTranslations"): - args.append("--use-fuzzy") + if self.__plugin.getPreferences("FuzzyTranslations"): + args.append("--use-fuzzy") try: wd = self.__sitePath()