ProjectDjango/Project.py

branch
eric7
changeset 180
64339135bd61
parent 178
60c87e256fc7
child 184
9585686bc532
--- a/ProjectDjango/Project.py	Fri Dec 31 13:17:55 2021 +0100
+++ b/ProjectDjango/Project.py	Wed Sep 21 16:42:20 2022 +0200
@@ -30,10 +30,11 @@
 import UI.PixmapCache
 
 
-class DjangoNoSiteSelectedException(Exception):
+class DjangoNoSiteSelectedError(Exception):
     """
     Exception thrown to signal, that there is no current site.
     """
+
     pass
 
 
@@ -41,11 +42,12 @@
     """
     Class transforming the call arguments in case of gnome-terminal.
     """
+
     def start(self, cmd, args=None, mode=QIODeviceBase.OpenModeFlag.ReadWrite):
         """
         Public method to start the given program (cmd) in a new process, if
         none is already running, passing the command line arguments in args.
-        
+
         @param cmd start the given program cmd
         @type str
         @param args list of parameters
@@ -55,24 +57,25 @@
         """
         if args is None:
             args = []
-        
+
         if (
-            cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal',
-                          'mate-terminal')) and
-            '-e' in args
+            cmd.endswith(
+                ("gnome-terminal", "konsole", "xfce4-terminal", "mate-terminal")
+            )
+            and "-e" in args
         ):
-            index = args.index('-e') + 1
-            cargs = ' '.join(args[index:])
+            index = args.index("-e") + 1
+            cargs = " ".join(args[index:])
             args[index:] = [cargs]
-        
+
         super().start(cmd, args, mode)
-    
+
     @staticmethod
-    def startDetached(cmd, args=None, path=''):
+    def startDetached(cmd, args=None, path=""):
         """
         Public static method to start the given program (cmd) in a new process,
         if none is already running, passing the command line arguments in args.
-        
+
         @param cmd start the given program cmd
         @type str
         @param args list of parameters
@@ -84,16 +87,17 @@
         """
         if args is None:
             args = []
-        
+
         if (
-            cmd.endswith(('gnome-terminal', 'konsole', 'xfce4-terminal',
-                          'mate-terminal')) and
-            '-e' in args
+            cmd.endswith(
+                ("gnome-terminal", "konsole", "xfce4-terminal", "mate-terminal")
+            )
+            and "-e" in args
         ):
-            index = args.index('-e') + 1
-            cargs = ' '.join(args[index:])
+            index = args.index("-e") + 1
+            cargs = " ".join(args[index:])
             args[index:] = [cargs]
-        
+
         return QProcessPyQt.startDetached(cmd, args, path)
 
 
@@ -101,13 +105,14 @@
     """
     Class implementing the Django project support.
     """
+
     RecentApplicationsKey = "Django/RecentApplications"
     RecentDatabaseNamesKey = "Django/RecentDatabaseNames"
-    
+
     def __init__(self, plugin, iconSuffix, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type ProjectDjangoPlugin
         @param iconSuffix suffix for the icons
@@ -116,215 +121,251 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__plugin = plugin
         self.__iconSuffix = iconSuffix
         self.__ui = parent
-        
+
         self.__ericProject = ericApp().getObject("Project")
         self.__virtualEnvManager = ericApp().getObject("VirtualEnvManager")
         self.__hooksInstalled = False
-        
-        self.__menus = {}   # dictionary with references to menus
-        
+
+        self.__menus = {}  # dictionary with references to menus
+
         self.__serverProc = None
         self.__testServerProc = None
-        
+
         self.__recentApplications = []
         self.__loadRecentApplications()
-        
+
         self.__recentDatabaseNames = []
         self.__loadRecentDatabaseNames()
-        
+
         self.__recentTestData = {
             "RecentTestLabels": [],
             "RecentTestTags": [],
             "RecentTestExcludeTags": [],
         }
         self.__loadRecentTestData()
-    
+
     def initActions(self):
         """
         Public method to define the Django actions.
         """
         self.actions = []
-    
+
         self.selectSiteAct = EricAction(
-            self.tr('Current Project'),
-            "",
-            0, 0,
-            self, 'django_current_project')
-        self.selectSiteAct.setStatusTip(self.tr(
-            'Selects the current project'))
-        self.selectSiteAct.setWhatsThis(self.tr(
-            """<b>Current Project</b>"""
-            """<p>Selects the current project. Used for multi-project """
-            """Django projects to switch between the projects.</p>"""
-        ))
+            self.tr("Current Project"), "", 0, 0, self, "django_current_project"
+        )
+        self.selectSiteAct.setStatusTip(self.tr("Selects the current project"))
+        self.selectSiteAct.setWhatsThis(
+            self.tr(
+                """<b>Current Project</b>"""
+                """<p>Selects the current project. Used for multi-project """
+                """Django projects to switch between the projects.</p>"""
+            )
+        )
         self.selectSiteAct.triggered.connect(self.__selectSite)
         self.actions.append(self.selectSiteAct)
         self.__setCurrentSite(None)
-        
+
         ##############################
         ## start actions below      ##
         ##############################
-        
+
         self.startProjectAct = EricAction(
-            self.tr('Start Project'),
-            self.tr('Start &Project'),
-            0, 0,
-            self, 'django_start_project')
-        self.startProjectAct.setStatusTip(self.tr(
-            'Starts a new Django project'))
-        self.startProjectAct.setWhatsThis(self.tr(
-            """<b>Start Project</b>"""
-            """<p>Starts a new Django project using "django-admin.py"""
-            """ startproject".</p>"""
-        ))
+            self.tr("Start Project"),
+            self.tr("Start &Project"),
+            0,
+            0,
+            self,
+            "django_start_project",
+        )
+        self.startProjectAct.setStatusTip(self.tr("Starts a new Django project"))
+        self.startProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Start Project</b>"""
+                """<p>Starts a new Django project using "django-admin.py"""
+                """ startproject".</p>"""
+            )
+        )
         self.startProjectAct.triggered.connect(self.__startProject)
         self.actions.append(self.startProjectAct)
-        
+
         self.startGlobalApplicationAct = EricAction(
-            self.tr('Start Application (global)'),
-            self.tr('Start Application (&global)'),
-            0, 0,
-            self, 'django_start_global_application')
-        self.startGlobalApplicationAct.setStatusTip(self.tr(
-            'Starts a new global Django application'))
-        self.startGlobalApplicationAct.setWhatsThis(self.tr(
-            """<b>Start Application (global)</b>"""
-            """<p>Starts a new global Django application using"""
-            """ "django-admin.py startapp".</p>"""
-        ))
-        self.startGlobalApplicationAct.triggered.connect(
-            self.__startGlobalApplication)
+            self.tr("Start Application (global)"),
+            self.tr("Start Application (&global)"),
+            0,
+            0,
+            self,
+            "django_start_global_application",
+        )
+        self.startGlobalApplicationAct.setStatusTip(
+            self.tr("Starts a new global Django application")
+        )
+        self.startGlobalApplicationAct.setWhatsThis(
+            self.tr(
+                """<b>Start Application (global)</b>"""
+                """<p>Starts a new global Django application using"""
+                """ "django-admin.py startapp".</p>"""
+            )
+        )
+        self.startGlobalApplicationAct.triggered.connect(self.__startGlobalApplication)
         self.actions.append(self.startGlobalApplicationAct)
-        
+
         self.startLocalApplicationAct = EricAction(
-            self.tr('Start Application (local)'),
-            self.tr('Start Application (&local)'),
-            0, 0,
-            self, 'django_start_local_application')
-        self.startLocalApplicationAct.setStatusTip(self.tr(
-            'Starts a new local Django application'))
-        self.startLocalApplicationAct.setWhatsThis(self.tr(
-            """<b>Start Application (local)</b>"""
-            """<p>Starts a new local Django application using"""
-            """ "manage.py startapp".</p>"""
-        ))
-        self.startLocalApplicationAct.triggered.connect(
-            self.__startLocalApplication)
+            self.tr("Start Application (local)"),
+            self.tr("Start Application (&local)"),
+            0,
+            0,
+            self,
+            "django_start_local_application",
+        )
+        self.startLocalApplicationAct.setStatusTip(
+            self.tr("Starts a new local Django application")
+        )
+        self.startLocalApplicationAct.setWhatsThis(
+            self.tr(
+                """<b>Start Application (local)</b>"""
+                """<p>Starts a new local Django application using"""
+                """ "manage.py startapp".</p>"""
+            )
+        )
+        self.startLocalApplicationAct.triggered.connect(self.__startLocalApplication)
         self.actions.append(self.startLocalApplicationAct)
-        
+
         ##############################
         ## run actions below        ##
         ##############################
-        
+
         self.runServerAct = EricAction(
-            self.tr('Run Server'),
-            self.tr('Run &Server'),
-            0, 0,
-            self, 'django_run_server')
-        self.runServerAct.setStatusTip(self.tr(
-            'Starts the Django Web server'))
-        self.runServerAct.setWhatsThis(self.tr(
-            """<b>Run Server</b>"""
-            """<p>Starts the Django Web server using "manage.py"""
-            """ runserver".</p>"""
-        ))
+            self.tr("Run Server"),
+            self.tr("Run &Server"),
+            0,
+            0,
+            self,
+            "django_run_server",
+        )
+        self.runServerAct.setStatusTip(self.tr("Starts the Django Web server"))
+        self.runServerAct.setWhatsThis(
+            self.tr(
+                """<b>Run Server</b>"""
+                """<p>Starts the Django Web server using "manage.py"""
+                """ runserver".</p>"""
+            )
+        )
         self.runServerAct.triggered.connect(self.__runServer)
         self.actions.append(self.runServerAct)
-        
+
         self.runBrowserAct = EricAction(
-            self.tr('Run Web-Browser'),
-            self.tr('Run &Web-Browser'),
-            0, 0,
-            self, 'django_run_browser')
-        self.runBrowserAct.setStatusTip(self.tr(
-            'Starts the default Web-Browser with the URL of the Django Web'
-            ' server'))
-        self.runBrowserAct.setWhatsThis(self.tr(
-            """<b>Run Web-Browser</b>"""
-            """<p>Starts the default Web-Browser with the URL of the """
-            """Django Web server.</p>"""
-        ))
+            self.tr("Run Web-Browser"),
+            self.tr("Run &Web-Browser"),
+            0,
+            0,
+            self,
+            "django_run_browser",
+        )
+        self.runBrowserAct.setStatusTip(
+            self.tr(
+                "Starts the default Web-Browser with the URL of the Django Web"
+                " server"
+            )
+        )
+        self.runBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Run Web-Browser</b>"""
+                """<p>Starts the default Web-Browser with the URL of the """
+                """Django Web server.</p>"""
+            )
+        )
         self.runBrowserAct.triggered.connect(self.__runBrowser)
         self.actions.append(self.runBrowserAct)
-        
+
         ##############################
         ## caching actions below    ##
         ##############################
-        
+
         self.createCacheTableAct = EricAction(
-            self.tr('Create Cache Tables'),
-            self.tr('C&reate Cache Tables'),
-            0, 0,
-            self, 'django_create_cache_tables')
-        self.createCacheTableAct.setStatusTip(self.tr(
-            'Creates the tables needed to use the SQL cache backend'))
-        self.createCacheTableAct.setWhatsThis(self.tr(
-            """<b>Create Cache Tables</b>"""
-            """<p>Creates the tables needed to use the SQL cache"""
-            """ backend.</p>"""
-        ))
-        self.createCacheTableAct.triggered.connect(
-            self.__createCacheTables)
+            self.tr("Create Cache Tables"),
+            self.tr("C&reate Cache Tables"),
+            0,
+            0,
+            self,
+            "django_create_cache_tables",
+        )
+        self.createCacheTableAct.setStatusTip(
+            self.tr("Creates the tables needed to use the SQL cache backend")
+        )
+        self.createCacheTableAct.setWhatsThis(
+            self.tr(
+                """<b>Create Cache Tables</b>"""
+                """<p>Creates the tables needed to use the SQL cache"""
+                """ backend.</p>"""
+            )
+        )
+        self.createCacheTableAct.triggered.connect(self.__createCacheTables)
         self.actions.append(self.createCacheTableAct)
-        
+
         ##############################
         ## help action below        ##
         ##############################
-        
+
         self.helpAct = EricAction(
-            self.tr('Help'),
-            self.tr('&Help'),
-            0, 0,
-            self, 'django_help')
-        self.helpAct.setStatusTip(self.tr(
-            'Shows the Django help index'))
-        self.helpAct.setWhatsThis(self.tr(
-            """<b>Help</b>"""
-            """<p>Shows the Django help index page.</p>"""
-        ))
+            self.tr("Help"), self.tr("&Help"), 0, 0, self, "django_help"
+        )
+        self.helpAct.setStatusTip(self.tr("Shows the Django help index"))
+        self.helpAct.setWhatsThis(
+            self.tr("""<b>Help</b>""" """<p>Shows the Django help index page.</p>""")
+        )
         self.helpAct.triggered.connect(self.__showHelpIndex)
         self.actions.append(self.helpAct)
-        
+
         ##############################
         ## about action below       ##
         ##############################
-        
+
         self.aboutDjangoAct = EricAction(
-            self.tr('About Django'),
-            self.tr('About D&jango'),
-            0, 0,
-            self, 'django_about')
-        self.aboutDjangoAct.setStatusTip(self.tr(
-            'Shows some information about Django'))
-        self.aboutDjangoAct.setWhatsThis(self.tr(
-            """<b>About Django</b>"""
-            """<p>Shows some information about Django.</p>"""
-        ))
+            self.tr("About Django"),
+            self.tr("About D&jango"),
+            0,
+            0,
+            self,
+            "django_about",
+        )
+        self.aboutDjangoAct.setStatusTip(self.tr("Shows some information about Django"))
+        self.aboutDjangoAct.setWhatsThis(
+            self.tr(
+                """<b>About Django</b>"""
+                """<p>Shows some information about Django.</p>"""
+            )
+        )
         self.aboutDjangoAct.triggered.connect(self.__djangoInfo)
         self.actions.append(self.aboutDjangoAct)
-        
+
         ##############################
         ## check action below       ##
         ##############################
-        
+
         self.checkAct = EricAction(
-            self.tr('Check Project'),
-            self.tr('Check Project'),
-            0, 0,
-            self, 'django_check_project')
-        self.checkAct.setStatusTip(self.tr(
-            'Inspects the Django project for common problems'))
-        self.checkAct.setWhatsThis(self.tr(
-            """<b>Check Project</b>"""
-            """<p>This inspects the Django project for common problems.</p>"""
-        ))
+            self.tr("Check Project"),
+            self.tr("Check Project"),
+            0,
+            0,
+            self,
+            "django_check_project",
+        )
+        self.checkAct.setStatusTip(
+            self.tr("Inspects the Django project for common problems")
+        )
+        self.checkAct.setWhatsThis(
+            self.tr(
+                """<b>Check Project</b>"""
+                """<p>This inspects the Django project for common problems.</p>"""
+            )
+        )
         self.checkAct.triggered.connect(self.__performCheck)
         self.actions.append(self.checkAct)
-        
+
         self.__initDatabaseActions()
         self.__initDatabaseSqlActions()
         self.__initMigrationActions()
@@ -338,435 +379,566 @@
         Private method to define the database related actions.
         """
         self.selectDatabaseNameAct = EricAction(
-            self.tr('Current Database'),
-            "",
-            0, 0,
-            self, 'django_current_database')
-        self.selectDatabaseNameAct.setStatusTip(self.tr(
-            'Selects the current database'))
-        self.selectDatabaseNameAct.setWhatsThis(self.tr(
-            """<b>Current Database</b>"""
-            """<p>Selects the database name to be used by all database"""
-            """ actions. An empty database name indicates to use the default"""
-            """ name.</p>"""
-        ))
+            self.tr("Current Database"), "", 0, 0, self, "django_current_database"
+        )
+        self.selectDatabaseNameAct.setStatusTip(self.tr("Selects the current database"))
+        self.selectDatabaseNameAct.setWhatsThis(
+            self.tr(
+                """<b>Current Database</b>"""
+                """<p>Selects the database name to be used by all database"""
+                """ actions. An empty database name indicates to use the default"""
+                """ name.</p>"""
+            )
+        )
         self.selectDatabaseNameAct.triggered.connect(self.__selectDatabaseName)
         self.actions.append(self.selectDatabaseNameAct)
         self.__setCurrentDatabase(None)
-        
+
         self.inspectDatabaseAct = EricAction(
-            self.tr('Introspect'),
-            self.tr('&Introspect'),
-            0, 0,
-            self, 'django_database_inspect')
-        self.inspectDatabaseAct.setStatusTip(self.tr(
-            'Introspects the database tables and outputs a Django model'
-            ' module'))
-        self.inspectDatabaseAct.setWhatsThis(self.tr(
-            """<b>Introspect</b>"""
-            """<p>Introspects the database tables and outputs a """
-            """Django model module.</p>"""
-        ))
+            self.tr("Introspect"),
+            self.tr("&Introspect"),
+            0,
+            0,
+            self,
+            "django_database_inspect",
+        )
+        self.inspectDatabaseAct.setStatusTip(
+            self.tr(
+                "Introspects the database tables and outputs a Django model" " module"
+            )
+        )
+        self.inspectDatabaseAct.setWhatsThis(
+            self.tr(
+                """<b>Introspect</b>"""
+                """<p>Introspects the database tables and outputs a """
+                """Django model module.</p>"""
+            )
+        )
         self.inspectDatabaseAct.triggered.connect(self.__databaseInspect)
         self.actions.append(self.inspectDatabaseAct)
-        
+
         self.flushDatabaseAct = EricAction(
-            self.tr('Flush'),
-            self.tr('&Flush'),
-            0, 0,
-            self, 'django_database_flush')
-        self.flushDatabaseAct.setStatusTip(self.tr(
-            'Returns all database tables to the state just after their'
-            ' installation'))
-        self.flushDatabaseAct.setWhatsThis(self.tr(
-            """<b>Flush</b>"""
-            """<p>Returns all database tables to the state """
-            """just after their installation.</p>"""
-        ))
+            self.tr("Flush"), self.tr("&Flush"), 0, 0, self, "django_database_flush"
+        )
+        self.flushDatabaseAct.setStatusTip(
+            self.tr(
+                "Returns all database tables to the state just after their"
+                " installation"
+            )
+        )
+        self.flushDatabaseAct.setWhatsThis(
+            self.tr(
+                """<b>Flush</b>"""
+                """<p>Returns all database tables to the state """
+                """just after their installation.</p>"""
+            )
+        )
         self.flushDatabaseAct.triggered.connect(self.__databaseFlush)
         self.actions.append(self.flushDatabaseAct)
-        
+
         self.databaseClientAct = EricAction(
-            self.tr('Start Client Console'),
-            self.tr('Start &Client Console'),
-            0, 0,
-            self, 'django_database_client')
-        self.databaseClientAct.setStatusTip(self.tr(
-            'Starts a console window for the database client'))
-        self.databaseClientAct.setWhatsThis(self.tr(
-            """<b>Start Client Console</b>"""
-            """<p>Starts a console window for the database client.</p>"""
-        ))
+            self.tr("Start Client Console"),
+            self.tr("Start &Client Console"),
+            0,
+            0,
+            self,
+            "django_database_client",
+        )
+        self.databaseClientAct.setStatusTip(
+            self.tr("Starts a console window for the database client")
+        )
+        self.databaseClientAct.setWhatsThis(
+            self.tr(
+                """<b>Start Client Console</b>"""
+                """<p>Starts a console window for the database client.</p>"""
+            )
+        )
         self.databaseClientAct.triggered.connect(self.__runDatabaseClient)
         self.actions.append(self.databaseClientAct)
-    
+
     def __initDatabaseSqlActions(self):
         """
         Private method to define the database SQL related actions.
         """
         self.databaseSqlFlushAct = EricAction(
-            self.tr('Flush Database'),
-            self.tr('&Flush Database'),
-            0, 0,
-            self, 'django_database_sql_flush_database')
-        self.databaseSqlFlushAct.setStatusTip(self.tr(
-            'Prints a list of statements to return all database tables to the'
-            ' state just after their installation'))
-        self.databaseSqlFlushAct.setWhatsThis(self.tr(
-            """<b>Flush Database</b>"""
-            """<p>Prints a list of statements to return all database tables"""
-            """ to the state just after their installation.</p>"""
-        ))
-        self.databaseSqlFlushAct.triggered.connect(
-            self.__databaseSqlFlushDatabase)
+            self.tr("Flush Database"),
+            self.tr("&Flush Database"),
+            0,
+            0,
+            self,
+            "django_database_sql_flush_database",
+        )
+        self.databaseSqlFlushAct.setStatusTip(
+            self.tr(
+                "Prints a list of statements to return all database tables to the"
+                " state just after their installation"
+            )
+        )
+        self.databaseSqlFlushAct.setWhatsThis(
+            self.tr(
+                """<b>Flush Database</b>"""
+                """<p>Prints a list of statements to return all database tables"""
+                """ to the state just after their installation.</p>"""
+            )
+        )
+        self.databaseSqlFlushAct.triggered.connect(self.__databaseSqlFlushDatabase)
         self.actions.append(self.databaseSqlFlushAct)
-        
+
         self.databaseSqlResetSeqAct = EricAction(
-            self.tr('Reset Sequences'),
-            self.tr('Reset &Sequences'),
-            0, 0,
-            self, 'django_database_sql_reset_sequences')
-        self.databaseSqlResetSeqAct.setStatusTip(self.tr(
-            'Prints the SQL statements for resetting sequences for '
-            'one or more applications'))
-        self.databaseSqlResetSeqAct.setWhatsThis(self.tr(
-            """<b>Reset Sequences</b>"""
-            """<p>Prints the SQL statements for resetting sequences for """
-            """one or more applications.</p>"""
-        ))
-        self.databaseSqlResetSeqAct.triggered.connect(
-            self.__databaseSqlResetSequences)
+            self.tr("Reset Sequences"),
+            self.tr("Reset &Sequences"),
+            0,
+            0,
+            self,
+            "django_database_sql_reset_sequences",
+        )
+        self.databaseSqlResetSeqAct.setStatusTip(
+            self.tr(
+                "Prints the SQL statements for resetting sequences for "
+                "one or more applications"
+            )
+        )
+        self.databaseSqlResetSeqAct.setWhatsThis(
+            self.tr(
+                """<b>Reset Sequences</b>"""
+                """<p>Prints the SQL statements for resetting sequences for """
+                """one or more applications.</p>"""
+            )
+        )
+        self.databaseSqlResetSeqAct.triggered.connect(self.__databaseSqlResetSequences)
         self.actions.append(self.databaseSqlResetSeqAct)
-        
+
         self.databaseSqlMigrateAct = EricAction(
-            self.tr('Apply Migration'),
-            self.tr('&Apply Migration'),
-            0, 0,
-            self, 'django_database_sql_apply_migration')
-        self.databaseSqlMigrateAct.setStatusTip(self.tr(
-            'Prints the SQL statements to apply a migration of an'
-            ' application'))
-        self.databaseSqlMigrateAct.setWhatsThis(self.tr(
-            """<b>Apply Migration</b>"""
-            """<p>Prints the SQL statements to apply a migration of an"""
-            """ application.</p>"""
-        ))
-        self.databaseSqlMigrateAct.triggered.connect(
-            self.__databaseSqlMigrate)
+            self.tr("Apply Migration"),
+            self.tr("&Apply Migration"),
+            0,
+            0,
+            self,
+            "django_database_sql_apply_migration",
+        )
+        self.databaseSqlMigrateAct.setStatusTip(
+            self.tr(
+                "Prints the SQL statements to apply a migration of an" " application"
+            )
+        )
+        self.databaseSqlMigrateAct.setWhatsThis(
+            self.tr(
+                """<b>Apply Migration</b>"""
+                """<p>Prints the SQL statements to apply a migration of an"""
+                """ application.</p>"""
+            )
+        )
+        self.databaseSqlMigrateAct.triggered.connect(self.__databaseSqlMigrate)
         self.actions.append(self.databaseSqlMigrateAct)
-        
+
         self.databaseSqlMigrateBackwardsAct = EricAction(
-            self.tr('Unapply Migration'),
-            self.tr('&Unapply Migration'),
-            0, 0,
-            self, 'django_database_sql_unapply_migration')
-        self.databaseSqlMigrateBackwardsAct.setStatusTip(self.tr(
-            'Prints the SQL statements to unapply a migration of an'
-            ' application'))
-        self.databaseSqlMigrateBackwardsAct.setWhatsThis(self.tr(
-            """<b>Unapply Migration</b>"""
-            """<p>Prints the SQL statements to unapply a migration of an"""
-            """ application.</p>"""
-        ))
+            self.tr("Unapply Migration"),
+            self.tr("&Unapply Migration"),
+            0,
+            0,
+            self,
+            "django_database_sql_unapply_migration",
+        )
+        self.databaseSqlMigrateBackwardsAct.setStatusTip(
+            self.tr(
+                "Prints the SQL statements to unapply a migration of an" " application"
+            )
+        )
+        self.databaseSqlMigrateBackwardsAct.setWhatsThis(
+            self.tr(
+                """<b>Unapply Migration</b>"""
+                """<p>Prints the SQL statements to unapply a migration of an"""
+                """ application.</p>"""
+            )
+        )
         self.databaseSqlMigrateBackwardsAct.triggered.connect(
-            lambda: self.__databaseSqlMigrate(backwards=True))
+            lambda: self.__databaseSqlMigrate(backwards=True)
+        )
         self.actions.append(self.databaseSqlMigrateBackwardsAct)
-    
+
     def __initToolsActions(self):
         """
         Private method to define the tool actions.
         """
         self.diffSettingsAct = EricAction(
-            self.tr('Diff Settings'),
-            self.tr('&Diff Settings'),
-            0, 0,
-            self, 'django_tools_diffsettings')
-        self.diffSettingsAct.setStatusTip(self.tr(
-            'Shows the modification made to the settings'))
-        self.diffSettingsAct.setWhatsThis(self.tr(
-            """<b>Diff Settings</b>"""
-            """<p>Shows the modification made to the settings.</p>"""
-        ))
+            self.tr("Diff Settings"),
+            self.tr("&Diff Settings"),
+            0,
+            0,
+            self,
+            "django_tools_diffsettings",
+        )
+        self.diffSettingsAct.setStatusTip(
+            self.tr("Shows the modification made to the settings")
+        )
+        self.diffSettingsAct.setWhatsThis(
+            self.tr(
+                """<b>Diff Settings</b>"""
+                """<p>Shows the modification made to the settings.</p>"""
+            )
+        )
         self.diffSettingsAct.triggered.connect(self.__diffSettings)
         self.actions.append(self.diffSettingsAct)
-    
+
         self.runPythonShellAct = EricAction(
-            self.tr('Start Python Console'),
-            self.tr('Start &Python Console'),
-            0, 0,
-            self, 'django_tools_pythonconsole')
-        self.runPythonShellAct.setStatusTip(self.tr(
-            'Starts a Python interactive interpreter'))
-        self.runPythonShellAct.setWhatsThis(self.tr(
-            """<b>Start Python Console</b>"""
-            """<p>Starts a Python interactive interpreter.</p>"""
-        ))
+            self.tr("Start Python Console"),
+            self.tr("Start &Python Console"),
+            0,
+            0,
+            self,
+            "django_tools_pythonconsole",
+        )
+        self.runPythonShellAct.setStatusTip(
+            self.tr("Starts a Python interactive interpreter")
+        )
+        self.runPythonShellAct.setWhatsThis(
+            self.tr(
+                """<b>Start Python Console</b>"""
+                """<p>Starts a Python interactive interpreter.</p>"""
+            )
+        )
         self.runPythonShellAct.triggered.connect(self.__runPythonShell)
         self.actions.append(self.runPythonShellAct)
-    
+
         self.testEmailAct = EricAction(
-            self.tr('Send Test Email'),
-            self.tr('Send Test &Email'),
-            0, 0,
-            self, 'django_tools_sendtestemail')
-        self.testEmailAct.setStatusTip(self.tr(
-            'Send a test email through Django'))
-        self.testEmailAct.setWhatsThis(self.tr(
-            """<b>Send Test Email</b>"""
-            """<p>Sends a test email to confirm email sending through Django"""
-            """ is working.</p>"""
-        ))
+            self.tr("Send Test Email"),
+            self.tr("Send Test &Email"),
+            0,
+            0,
+            self,
+            "django_tools_sendtestemail",
+        )
+        self.testEmailAct.setStatusTip(self.tr("Send a test email through Django"))
+        self.testEmailAct.setWhatsThis(
+            self.tr(
+                """<b>Send Test Email</b>"""
+                """<p>Sends a test email to confirm email sending through Django"""
+                """ is working.</p>"""
+            )
+        )
         self.testEmailAct.triggered.connect(self.__sendTestEmail)
         self.actions.append(self.testEmailAct)
-    
+
     def __initTestingActions(self):
         """
         Private method to define the testing actions.
         """
         self.dumpDataAct = EricAction(
-            self.tr('Dump Data'),
-            self.tr('&Dump Data'),
-            0, 0,
-            self, 'django_tools_dumpdata')
-        self.dumpDataAct.setStatusTip(self.tr(
-            'Dump the database data to a fixture'))
-        self.dumpDataAct.setWhatsThis(self.tr(
-            """<b>Dump Data</b>"""
-            """<p>Dump the database data to a fixture.</p>"""
-        ))
+            self.tr("Dump Data"),
+            self.tr("&Dump Data"),
+            0,
+            0,
+            self,
+            "django_tools_dumpdata",
+        )
+        self.dumpDataAct.setStatusTip(self.tr("Dump the database data to a fixture"))
+        self.dumpDataAct.setWhatsThis(
+            self.tr(
+                """<b>Dump Data</b>""" """<p>Dump the database data to a fixture.</p>"""
+            )
+        )
         self.dumpDataAct.triggered.connect(self.__dumpData)
         self.actions.append(self.dumpDataAct)
-        
+
         self.loadDataAct = EricAction(
-            self.tr('Load Data'),
-            self.tr('&Load Data'),
-            0, 0,
-            self, 'django_tools_loaddata')
-        self.loadDataAct.setStatusTip(self.tr(
-            'Load data from fixture files'))
-        self.loadDataAct.setWhatsThis(self.tr(
-            """<b>Load Data</b>"""
-            """<p>Load data from fixture files.</p>"""
-        ))
+            self.tr("Load Data"),
+            self.tr("&Load Data"),
+            0,
+            0,
+            self,
+            "django_tools_loaddata",
+        )
+        self.loadDataAct.setStatusTip(self.tr("Load data from fixture files"))
+        self.loadDataAct.setWhatsThis(
+            self.tr("""<b>Load Data</b>""" """<p>Load data from fixture files.</p>""")
+        )
         self.loadDataAct.triggered.connect(self.__loadData)
         self.actions.append(self.loadDataAct)
-        
+
         self.runTestAct = EricAction(
-            self.tr('Run Testsuite'),
-            self.tr('Run &Testsuite'),
-            0, 0,
-            self, 'django_tools_run_test')
-        self.runTestAct.setStatusTip(self.tr(
-            'Run the test suite for applications or the whole site'))
-        self.runTestAct.setWhatsThis(self.tr(
-            """<b>Run Testsuite</b>"""
-            """<p>Run the test suite for applications or the whole site.</p>"""
-        ))
+            self.tr("Run Testsuite"),
+            self.tr("Run &Testsuite"),
+            0,
+            0,
+            self,
+            "django_tools_run_test",
+        )
+        self.runTestAct.setStatusTip(
+            self.tr("Run the test suite for applications or the whole site")
+        )
+        self.runTestAct.setWhatsThis(
+            self.tr(
+                """<b>Run Testsuite</b>"""
+                """<p>Run the test suite for applications or the whole site.</p>"""
+            )
+        )
         self.runTestAct.triggered.connect(self.__runTestSuite)
         self.actions.append(self.runTestAct)
-        
+
         self.runDeprecationTestAct = EricAction(
-            self.tr('Run Testsuite (-Wall)'),
-            self.tr('Run Testsuite (-Wall)'),
-            0, 0,
-            self, 'django_tools_run_deprecation_test')
-        self.runDeprecationTestAct.setStatusTip(self.tr(
-            'Run the test suite for applications or the whole site with'
-            ' activated deprecation warnings'))
-        self.runDeprecationTestAct.setWhatsThis(self.tr(
-            """<b>Run Testsuite (-Wall)</b>"""
-            """<p>Run the test suite for applications or the whole site"""
-            """ with activated deprecation warnings.</p>"""
-        ))
+            self.tr("Run Testsuite (-Wall)"),
+            self.tr("Run Testsuite (-Wall)"),
+            0,
+            0,
+            self,
+            "django_tools_run_deprecation_test",
+        )
+        self.runDeprecationTestAct.setStatusTip(
+            self.tr(
+                "Run the test suite for applications or the whole site with"
+                " activated deprecation warnings"
+            )
+        )
+        self.runDeprecationTestAct.setWhatsThis(
+            self.tr(
+                """<b>Run Testsuite (-Wall)</b>"""
+                """<p>Run the test suite for applications or the whole site"""
+                """ with activated deprecation warnings.</p>"""
+            )
+        )
         self.runDeprecationTestAct.triggered.connect(
-            lambda: self.__runTestSuite(deprecation=True))
+            lambda: self.__runTestSuite(deprecation=True)
+        )
         self.actions.append(self.runDeprecationTestAct)
-        
+
         self.runTestServerAct = EricAction(
-            self.tr('Run Testserver'),
-            self.tr('Run Test&server'),
-            0, 0,
-            self, 'django_tools_run_test_server')
-        self.runTestServerAct.setStatusTip(self.tr(
-            'Run a development server with data from a set of fixtures'))
-        self.runTestServerAct.setWhatsThis(self.tr(
-            """<b>Run Testserver</b>"""
-            """<p>Run a development server with data from a set of"""
-            """ fixtures.</p>"""
-        ))
+            self.tr("Run Testserver"),
+            self.tr("Run Test&server"),
+            0,
+            0,
+            self,
+            "django_tools_run_test_server",
+        )
+        self.runTestServerAct.setStatusTip(
+            self.tr("Run a development server with data from a set of fixtures")
+        )
+        self.runTestServerAct.setWhatsThis(
+            self.tr(
+                """<b>Run Testserver</b>"""
+                """<p>Run a development server with data from a set of"""
+                """ fixtures.</p>"""
+            )
+        )
         self.runTestServerAct.triggered.connect(self.__runTestServer)
         self.actions.append(self.runTestServerAct)
-    
+
     def __initAuthorizationActions(self):
         """
         Private method to define the authorization actions.
         """
         self.changePasswordAct = EricAction(
-            self.tr('Change Password'),
-            self.tr('Change &Password'),
-            0, 0,
-            self, 'django_auth_changepassword')
-        self.changePasswordAct.setStatusTip(self.tr(
-            'Change the password of a user'))
-        self.changePasswordAct.setWhatsThis(self.tr(
-            """<b>Change Password</b>"""
-            """<p>Change the password of a user of the Django project.</p>"""
-        ))
+            self.tr("Change Password"),
+            self.tr("Change &Password"),
+            0,
+            0,
+            self,
+            "django_auth_changepassword",
+        )
+        self.changePasswordAct.setStatusTip(self.tr("Change the password of a user"))
+        self.changePasswordAct.setWhatsThis(
+            self.tr(
+                """<b>Change Password</b>"""
+                """<p>Change the password of a user of the Django project.</p>"""
+            )
+        )
         self.changePasswordAct.triggered.connect(self.__changePassword)
         self.actions.append(self.changePasswordAct)
-        
+
         self.createSuperUserAct = EricAction(
-            self.tr('Create Superuser'),
-            self.tr('Create &Superuser'),
-            0, 0,
-            self, 'django_auth_createsuperuser')
-        self.createSuperUserAct.setStatusTip(self.tr(
-            'Create a superuser account'))
-        self.createSuperUserAct.setWhatsThis(self.tr(
-            """<b>Create Superuser</b>"""
-            """<p>Create a superuser account for the Django project.</p>"""
-        ))
+            self.tr("Create Superuser"),
+            self.tr("Create &Superuser"),
+            0,
+            0,
+            self,
+            "django_auth_createsuperuser",
+        )
+        self.createSuperUserAct.setStatusTip(self.tr("Create a superuser account"))
+        self.createSuperUserAct.setWhatsThis(
+            self.tr(
+                """<b>Create Superuser</b>"""
+                """<p>Create a superuser account for the Django project.</p>"""
+            )
+        )
         self.createSuperUserAct.triggered.connect(self.__createSuperUser)
         self.actions.append(self.createSuperUserAct)
-    
+
     def __initSessionActions(self):
         """
         Private method to define the session actions.
         """
         self.clearSessionsAct = EricAction(
-            self.tr('Clear Sessions'),
-            self.tr('Clear &Sessions'),
-            0, 0,
-            self, 'django_session_clearsessions')
-        self.clearSessionsAct.setStatusTip(self.tr(
-            'Clear expired sessions'))
-        self.clearSessionsAct.setWhatsThis(self.tr(
-            """<b>Clear Sessions</b>"""
-            """<p>Clear expired sessions of the Django project.</p>"""
-        ))
+            self.tr("Clear Sessions"),
+            self.tr("Clear &Sessions"),
+            0,
+            0,
+            self,
+            "django_session_clearsessions",
+        )
+        self.clearSessionsAct.setStatusTip(self.tr("Clear expired sessions"))
+        self.clearSessionsAct.setWhatsThis(
+            self.tr(
+                """<b>Clear Sessions</b>"""
+                """<p>Clear expired sessions of the Django project.</p>"""
+            )
+        )
         self.clearSessionsAct.triggered.connect(self.__clearSessions)
         self.actions.append(self.clearSessionsAct)
-    
+
     def __initMigrationActions(self):
         """
         Private method to define the migration actions.
         """
         self.showMigrationsAct = EricAction(
-            self.tr('Show Migrations'),
-            self.tr('&Show Migrations'),
-            0, 0,
-            self, 'django_migration_show')
-        self.showMigrationsAct.setStatusTip(self.tr(
-            'Show a list of available migrations'))
-        self.showMigrationsAct.setWhatsThis(self.tr(
-            """<b>Show Migrations</b>"""
-            """<p>This shows a list of available migrations of the Django"""
-            """ project and their status.</p>"""
-        ))
+            self.tr("Show Migrations"),
+            self.tr("&Show Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_show",
+        )
+        self.showMigrationsAct.setStatusTip(
+            self.tr("Show a list of available migrations")
+        )
+        self.showMigrationsAct.setWhatsThis(
+            self.tr(
+                """<b>Show Migrations</b>"""
+                """<p>This shows a list of available migrations of the Django"""
+                """ project and their status.</p>"""
+            )
+        )
         self.showMigrationsAct.triggered.connect(self.__showMigrationsList)
         self.actions.append(self.showMigrationsAct)
-        
+
         self.showMigrationsPlanAct = EricAction(
-            self.tr('Show Migrations Plan'),
-            self.tr('Show Migrations &Plan'),
-            0, 0,
-            self, 'django_migration_show_plan')
-        self.showMigrationsPlanAct.setStatusTip(self.tr(
-            'Show a list with the migrations plan'))
-        self.showMigrationsPlanAct.setWhatsThis(self.tr(
-            """<b>Show Migrations Plan</b>"""
-            """<p>This shows a list with the migrations plan of the Django"""
-            """ project.</p>"""
-        ))
+            self.tr("Show Migrations Plan"),
+            self.tr("Show Migrations &Plan"),
+            0,
+            0,
+            self,
+            "django_migration_show_plan",
+        )
+        self.showMigrationsPlanAct.setStatusTip(
+            self.tr("Show a list with the migrations plan")
+        )
+        self.showMigrationsPlanAct.setWhatsThis(
+            self.tr(
+                """<b>Show Migrations Plan</b>"""
+                """<p>This shows a list with the migrations plan of the Django"""
+                """ project.</p>"""
+            )
+        )
         self.showMigrationsPlanAct.triggered.connect(self.__showMigrationsPlan)
         self.actions.append(self.showMigrationsPlanAct)
-        
+
         self.migrateAllAct = EricAction(
-            self.tr('Apply All Migrations'),
-            self.tr('&Apply All Migrations'),
-            0, 0,
-            self, 'django_migration_apply_all')
-        self.migrateAllAct.setStatusTip(self.tr(
-            'Apply all available migrations'))
-        self.migrateAllAct.setWhatsThis(self.tr(
-            """<b>Apply All Migrations</b>"""
-            """<p>This applies all migrations of the Django project.</p>"""
-        ))
+            self.tr("Apply All Migrations"),
+            self.tr("&Apply All Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_apply_all",
+        )
+        self.migrateAllAct.setStatusTip(self.tr("Apply all available migrations"))
+        self.migrateAllAct.setWhatsThis(
+            self.tr(
+                """<b>Apply All Migrations</b>"""
+                """<p>This applies all migrations of the Django project.</p>"""
+            )
+        )
         self.migrateAllAct.triggered.connect(self.__applyAllMigrations)
         self.actions.append(self.migrateAllAct)
-        
+
         self.migrateSelectedAct = EricAction(
-            self.tr('Apply Selected Migrations'),
-            self.tr('Apply Selected Migrations'),
-            0, 0,
-            self, 'django_migration_apply_selected')
-        self.migrateSelectedAct.setStatusTip(self.tr(
-            'Apply selected migrations'))
-        self.migrateSelectedAct.setWhatsThis(self.tr(
-            """<b>Apply Selected Migrations</b>"""
-            """<p>This applies selected migrations of the Django"""
-            """ project.</p>"""
-        ))
-        self.migrateSelectedAct.triggered.connect(
-            self.__applySelectedMigrations)
+            self.tr("Apply Selected Migrations"),
+            self.tr("Apply Selected Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_apply_selected",
+        )
+        self.migrateSelectedAct.setStatusTip(self.tr("Apply selected migrations"))
+        self.migrateSelectedAct.setWhatsThis(
+            self.tr(
+                """<b>Apply Selected Migrations</b>"""
+                """<p>This applies selected migrations of the Django"""
+                """ project.</p>"""
+            )
+        )
+        self.migrateSelectedAct.triggered.connect(self.__applySelectedMigrations)
         self.actions.append(self.migrateSelectedAct)
-        
+
         self.unmigrateAct = EricAction(
-            self.tr('Unapply Migrations'),
-            self.tr('&Unapply Migrations'),
-            0, 0,
-            self, 'django_migration_unapply')
-        self.unmigrateAct.setStatusTip(self.tr(
-            'Unapply all migrations for an app'))
-        self.unmigrateAct.setWhatsThis(self.tr(
-            """<b>Unapply Migrations</b>"""
-            """<p>This unapplies all migrations for an app of the Django"""
-            """ project.</p>"""
-        ))
+            self.tr("Unapply Migrations"),
+            self.tr("&Unapply Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_unapply",
+        )
+        self.unmigrateAct.setStatusTip(self.tr("Unapply all migrations for an app"))
+        self.unmigrateAct.setWhatsThis(
+            self.tr(
+                """<b>Unapply Migrations</b>"""
+                """<p>This unapplies all migrations for an app of the Django"""
+                """ project.</p>"""
+            )
+        )
         self.unmigrateAct.triggered.connect(self.__unapplyMigrations)
         self.actions.append(self.unmigrateAct)
-        
+
         self.makeMigrationsAct = EricAction(
-            self.tr('Make Migrations'),
-            self.tr('&Make Migrations'),
-            0, 0,
-            self, 'django_migration_make')
-        self.makeMigrationsAct.setStatusTip(self.tr(
-            'Generate migrations for the project'))
-        self.makeMigrationsAct.setWhatsThis(self.tr(
-            """<b>Make Migrations</b>"""
-            """<p>This generates migrations for the Django project.</p>"""
-        ))
+            self.tr("Make Migrations"),
+            self.tr("&Make Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_make",
+        )
+        self.makeMigrationsAct.setStatusTip(
+            self.tr("Generate migrations for the project")
+        )
+        self.makeMigrationsAct.setWhatsThis(
+            self.tr(
+                """<b>Make Migrations</b>"""
+                """<p>This generates migrations for the Django project.</p>"""
+            )
+        )
         self.makeMigrationsAct.triggered.connect(self.__makeMigrations)
         self.actions.append(self.makeMigrationsAct)
-        
+
         self.squashMigrationsAct = EricAction(
-            self.tr('Squash Migrations'),
-            self.tr('S&quash Migrations'),
-            0, 0,
-            self, 'django_migration_squash')
-        self.squashMigrationsAct.setStatusTip(self.tr(
-            'Squash migrations of an application of the project'))
-        self.squashMigrationsAct.setWhatsThis(self.tr(
-            """<b>Squash Migrations</b>"""
-            """<p>This squashes migrations of an application of the"""
-            """ Django project.</p>"""
-        ))
+            self.tr("Squash Migrations"),
+            self.tr("S&quash Migrations"),
+            0,
+            0,
+            self,
+            "django_migration_squash",
+        )
+        self.squashMigrationsAct.setStatusTip(
+            self.tr("Squash migrations of an application of the project")
+        )
+        self.squashMigrationsAct.setWhatsThis(
+            self.tr(
+                """<b>Squash Migrations</b>"""
+                """<p>This squashes migrations of an application of the"""
+                """ Django project.</p>"""
+            )
+        )
         self.squashMigrationsAct.triggered.connect(self.__squashMigrations)
         self.actions.append(self.squashMigrationsAct)
-    
+
     def initMenu(self):
         """
         Public method to initialize the Django menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
-        self.__menus = {}   # clear menus references
-        
-        menu = QMenu(self.tr('D&jango'), self.__ui)
+        self.__menus = {}  # clear menus references
+
+        menu = QMenu(self.tr("D&jango"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.selectSiteAct)
         menu.addSeparator()
         menu.addAction(self.runServerAct)
@@ -794,21 +966,21 @@
         menu.addAction(self.aboutDjangoAct)
         menu.addSeparator()
         menu.addAction(self.helpAct)
-        
+
         self.__menus["main"] = menu
-        
+
         return menu
 
     def __initDatabaseMenu(self):
         """
         Private method to initialize the database menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("&Database"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.selectDatabaseNameAct)
         menu.addSeparator()
         menu.addAction(self.inspectDatabaseAct)
@@ -818,41 +990,41 @@
         menu.addAction(self.databaseClientAct)
         menu.addSeparator()
         menu.addMenu(self.__initDatabaseSqlMenu())
-        
+
         self.__menus["database"] = menu
-        
+
         return menu
-    
+
     def __initDatabaseSqlMenu(self):
         """
         Private method to initialize the database SQL submenu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("Show &SQL"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.databaseSqlFlushAct)
         menu.addAction(self.databaseSqlResetSeqAct)
         menu.addSeparator()
         menu.addAction(self.databaseSqlMigrateAct)
         menu.addAction(self.databaseSqlMigrateBackwardsAct)
-        
+
         self.__menus["sql"] = menu
-        
+
         return menu
-    
+
     def __initMigrationsMenu(self):
         """
         Private method to initialize the Migrations submenu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("&Migrations"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.showMigrationsAct)
         menu.addAction(self.showMigrationsPlanAct)
         menu.addSeparator()
@@ -863,89 +1035,89 @@
         menu.addAction(self.makeMigrationsAct)
         menu.addSeparator()
         menu.addAction(self.squashMigrationsAct)
-        
+
         self.__menus["migrations"] = menu
-        
+
         return menu
-    
+
     def __initToolsMenu(self):
         """
         Private method to initialize the tools menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("&Tools"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.diffSettingsAct)
         menu.addSeparator()
         menu.addAction(self.runPythonShellAct)
         menu.addSeparator()
         menu.addAction(self.testEmailAct)
-        
+
         self.__menus["tools"] = menu
-        
+
         return menu
-    
+
     def __initTestingMenu(self):
         """
         Private method to initialize the testing menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("T&esting"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.dumpDataAct)
         menu.addAction(self.loadDataAct)
         menu.addSeparator()
         menu.addAction(self.runTestAct)
         menu.addAction(self.runDeprecationTestAct)
         menu.addAction(self.runTestServerAct)
-        
+
         self.__menus["testing"] = menu
-        
+
         return menu
-    
+
     def __initAuthorizationMenu(self):
         """
         Private method to initialize the authorization menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("&Authorization"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.changePasswordAct)
         menu.addAction(self.createSuperUserAct)
-        
+
         self.__menus["authorization"] = menu
-        
+
         return menu
-    
+
     def __initSessionMenu(self):
         """
         Private method to initialize the authorization menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("&Session"), self.__ui)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.clearSessionsAct)
-        
+
         self.__menus["session"] = menu
-        
+
         return menu
-    
+
     def getMenu(self, name):
         """
         Public method to get a reference to the requested menu.
-        
+
         @param name name of the menu
         @type str
         @return reference to the menu or None, if no menu with the given
@@ -956,11 +1128,11 @@
             return self.__menus[name]
         else:
             return None
-    
+
     def getMenuNames(self):
         """
         Public method to get the names of all menus.
-        
+
         @return menu names
         @rtype list of str
         """
@@ -969,7 +1141,7 @@
     ##################################################################
     ## methods below implement the various hook related functions
     ##################################################################
-    
+
     def registerOpenHook(self):
         """
         Public method to register the open hook to open a translations file
@@ -981,55 +1153,60 @@
                 self.__translationsBrowser.addHookMethodAndMenuEntry(
                     "open",
                     self.openPOEditor,
-                    self.tr("Open with {0}").format(
-                        os.path.basename(editor)))
+                    self.tr("Open with {0}").format(os.path.basename(editor)),
+                )
             else:
                 self.__translationsBrowser.removeHookMethod("open")
-    
+
     def projectOpenedHooks(self):
         """
         Public method to add our hook methods.
         """
         if self.__ericProject.getProjectType() == "Django":
             self.__formsBrowser = (
-                ericApp().getObject("ProjectBrowser")
-                .getProjectBrowser("forms")
+                ericApp().getObject("ProjectBrowser").getProjectBrowser("forms")
             )
             self.__formsBrowser.addHookMethodAndMenuEntry(
-                "newForm",
-                self.newForm, self.tr("New template..."))
-            
+                "newForm", self.newForm, self.tr("New template...")
+            )
+
             self.__ericProject.projectLanguageAddedByCode.connect(
-                self.__projectLanguageAdded)
+                self.__projectLanguageAdded
+            )
             self.__translationsBrowser = (
-                ericApp().getObject("ProjectBrowser")
-                .getProjectBrowser("translations"))
+                ericApp().getObject("ProjectBrowser").getProjectBrowser("translations")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "generateAll",
-                self.updateCatalogs, self.tr("Update all catalogs"))
+                "generateAll", self.updateCatalogs, self.tr("Update all catalogs")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
                 "generateSelected",
                 self.updateSelectedCatalogs,
-                self.tr("Update selected catalogs"))
+                self.tr("Update selected catalogs"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "generateAllWithObsolete", self.updateCatalogsWithObsolete,
-                self.tr("Update all catalogs (with obsolete)"))
+                "generateAllWithObsolete",
+                self.updateCatalogsWithObsolete,
+                self.tr("Update all catalogs (with obsolete)"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
                 "generateSelectedWithObsolete",
                 self.updateSelectedCatalogsWithObsolete,
-                self.tr("Update selected catalogs (with obsolete)"))
+                self.tr("Update selected catalogs (with obsolete)"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "releaseAll",
-                self.compileCatalogs, self.tr("Compile all catalogs"))
+                "releaseAll", self.compileCatalogs, self.tr("Compile all catalogs")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
                 "releaseSelected",
                 self.compileSelectedCatalogs,
-                self.tr("Compile selected catalogs"))
-            
+                self.tr("Compile selected catalogs"),
+            )
+
             self.__hooksInstalled = True
-            
+
             self.registerOpenHook()
-    
+
     def projectClosedHooks(self):
         """
         Public method to remove our hook methods.
@@ -1037,30 +1214,25 @@
         if self.__hooksInstalled:
             self.__formsBrowser.removeHookMethod("newForm")
             self.__formsBrowser = None
-            
+
             self.__ericProject.projectLanguageAddedByCode.disconnect(
-                self.__projectLanguageAdded)
-            self.__translationsBrowser.removeHookMethod(
-                "generateAll")
-            self.__translationsBrowser.removeHookMethod(
-                "generateSelected")
-            self.__translationsBrowser.removeHookMethod(
-                "generateAllWithObsolete")
-            self.__translationsBrowser.removeHookMethod(
-                "generateSelectedWithObsolete")
-            self.__translationsBrowser.removeHookMethod(
-                "releaseAll")
-            self.__translationsBrowser.removeHookMethod(
-                "releaseSelected")
+                self.__projectLanguageAdded
+            )
+            self.__translationsBrowser.removeHookMethod("generateAll")
+            self.__translationsBrowser.removeHookMethod("generateSelected")
+            self.__translationsBrowser.removeHookMethod("generateAllWithObsolete")
+            self.__translationsBrowser.removeHookMethod("generateSelectedWithObsolete")
+            self.__translationsBrowser.removeHookMethod("releaseAll")
+            self.__translationsBrowser.removeHookMethod("releaseSelected")
             self.__translationsBrowser.removeHookMethod("open")
             self.__translationsBrowser = None
-            
+
         self.__hooksInstalled = False
-    
+
     def newForm(self, path):
         """
         Public method to create a new form.
-        
+
         @param path full directory path for the new form file
         @type str
         """
@@ -1070,66 +1242,72 @@
             path,
             filter,
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             # user aborted or didn't enter a filename
             return
-        
+
         ext = QFileInfo(fname).suffix()
         if not ext:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fname += ex
-        
+
         if os.path.exists(fname):
             res = EricMessageBox.yesNo(
                 self.__ui,
                 self.tr("New Form"),
                 self.tr("The file already exists! Overwrite it?"),
-                icon=EricMessageBox.Warning)
-            
+                icon=EricMessageBox.Warning,
+            )
+
             if not res:
                 # user selected to not overwrite
                 return
-        
+
         try:
             with open(fname, "w") as f:
-                f.write('<!DOCTYPE html>')
-                f.write('<html>\n')
-                f.write('  <head>\n')
+                f.write("<!DOCTYPE html>")
+                f.write("<html>\n")
+                f.write("  <head>\n")
                 f.write('    <meta content="" />\n')
-                f.write('    <title></title>\n')
-                f.write('    <link rel="stylesheet" type="text/css"'
-                        ' href="style.css"/>')
-                f.write('    <!--[if lte IE 7]>')
-                f.write('      <link rel="stylesheet" type="text/css"'
-                        ' href="ie.css"/>')
-                f.write('    <![endif]-->')
-                f.write('  </head>\n')
-                f.write('\n')
+                f.write("    <title></title>\n")
+                f.write(
+                    '    <link rel="stylesheet" type="text/css"' ' href="style.css"/>'
+                )
+                f.write("    <!--[if lte IE 7]>")
+                f.write(
+                    '      <link rel="stylesheet" type="text/css"' ' href="ie.css"/>'
+                )
+                f.write("    <![endif]-->")
+                f.write("  </head>\n")
+                f.write("\n")
                 f.write('  <body  class="bodyclass">\n')
                 f.write('    <div id="container">')
-                f.write('    </div>')
-                f.write('  </body>\n')
+                f.write("    </div>")
+                f.write("  </body>\n")
                 f.close()
-                f.write('</html>\n')
+                f.write("</html>\n")
         except OSError as e:
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("New Form"),
-                self.tr("<p>The new form file <b>{0}</b> could not be"
-                        " created.<br> Problem: {1}</p>")
-                .format(fname, str(e)))
+                self.tr(
+                    "<p>The new form file <b>{0}</b> could not be"
+                    " created.<br> Problem: {1}</p>"
+                ).format(fname, str(e)),
+            )
             return
-        
+
         self.__ericProject.appendFile(fname)
         self.__formsBrowser.sourceFile.emit(fname)
 
     ##################################################################
     ## slots below implement general functionality
     ##################################################################
-    
+
     def projectClosed(self):
         """
         Public method to handle the closing of a project.
@@ -1137,12 +1315,12 @@
         if self.__serverProc is not None:
             self.__serverProcFinished()
         self.__setCurrentSite(None)
-    
+
     def __getExecutablePaths(self, file):
         """
         Private method to build all full paths of an executable file from
         the environment.
-        
+
         @param file filename of the executable
         @type str
         @return list of full executable names, if the executable file is
@@ -1151,19 +1329,19 @@
         @rtype list of str
         """
         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) and os.access(cur_path, os.X_OK):
             paths.append(cur_path)
 
-        path = os.getenv('PATH')
-        
+        path = os.getenv("PATH")
+
         # environment variable not defined
         if path is not None:
             dirs = path.split(os.pathsep)
@@ -1171,18 +1349,18 @@
                 exe = os.path.join(directory, 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
         @rtype list of str
         """
         variants = []
-        for variant in ['Python3']:
+        for variant in ["Python3"]:
             virtEnv = self.__getVirtualEnvironment(variant)
             if virtEnv:
                 if self.__getDjangoAdminCommand(variant):
@@ -1200,21 +1378,21 @@
                             fullCmds = self.__getExecutablePaths(cmd)
                         for fullCmd in fullCmds:
                             try:
-                                with open(fullCmd, 'r', encoding='utf-8') as f:
+                                with open(fullCmd, "r", encoding="utf-8") as f:
                                     l0 = f.readline()
                             except OSError:
                                 l0 = ""
                             if self.__isSuitableForVariant(variant, l0):
                                 variants.append(variant)
                                 break
-        
+
         return variants
-    
+
     def __isSuitableForVariant(self, variant, line0):
         """
         Private method to test, if a detected command file is suitable for the
         given Python variant.
-        
+
         @param variant Python variant to test for
         @type str
         @param line0 first line of the executable
@@ -1223,16 +1401,15 @@
         @rtype bool
         """
         l0 = line0.lower()
-        ok = (variant.lower() in l0 or
-              "{0}.".format(variant[-1]) in l0)
+        ok = variant.lower() in l0 or "{0}.".format(variant[-1]) in l0
         ok |= "pypy3" in l0
-        
+
         return ok
-    
+
     def __getVirtualEnvironment(self, language=""):
         """
         Private method to get the path of the virtual environment.
-        
+
         @param language Python variant to get the virtual environment
             for (one of '' or 'Python3')
         @type str
@@ -1243,16 +1420,15 @@
             language = self.__ericProject.getProjectLanguage()
         venvName = (
             self.__plugin.getPreferences("VirtualEnvironmentNamePy3")
-            if language == "Python3" else
-            ""
+            if language == "Python3"
+            else ""
         )
         if venvName:
-            virtEnv = self.__virtualEnvManager.getVirtualenvDirectory(
-                venvName)
+            virtEnv = self.__virtualEnvManager.getVirtualenvDirectory(venvName)
             if not virtEnv:
                 virtEnv = os.path.dirname(
-                    self.__virtualEnvManager.getVirtualenvInterpreter(
-                        venvName))
+                    self.__virtualEnvManager.getVirtualenvInterpreter(venvName)
+                )
                 if virtEnv.endswith(("Scripts", "bin")):
                     virtEnv = os.path.dirname(virtEnv)
         else:
@@ -1264,7 +1440,7 @@
     def __getDebugEnvironment(self, language=""):
         """
         Private method to get the path of the debugger environment.
-        
+
         @param language Python variant to get the debugger environment
             for (one of '' or 'Python3')
         @type str
@@ -1279,10 +1455,9 @@
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
             else:
                 venvName = ""
-            
+
             if venvName:
-                debugEnv = self.__virtualEnvManager.getVirtualenvDirectory(
-                    venvName)
+                debugEnv = self.__virtualEnvManager.getVirtualenvDirectory(venvName)
             else:
                 debugEnv = ""
         return debugEnv
@@ -1290,7 +1465,7 @@
     def __getDjangoAdminCommand(self, language=""):
         """
         Private method to build a django-admin.py command.
-        
+
         @param language Python variant to get the django-admin.py
             command for (one of '' or 'Python3')
         @type str
@@ -1299,7 +1474,7 @@
         """
         if not language:
             language = self.__ericProject.getProjectLanguage()
-        
+
         virtualEnv = self.__getVirtualEnvironment(language)
         if virtualEnv:
             if isWindowsPlatform():
@@ -1318,8 +1493,7 @@
                     os.path.join(virtualEnv, "bin", "django-admin"),
                     os.path.join(virtualEnv, "bin", "django-admin.py"),
                     os.path.join(virtualEnv, "local", "bin", "django-admin"),
-                    os.path.join(virtualEnv, "local", "bin",
-                                 "django-admin.py"),
+                    os.path.join(virtualEnv, "local", "bin", "django-admin.py"),
                 ]
                 for cmd in cmds:
                     if os.path.exists(cmd):
@@ -1341,14 +1515,15 @@
                     cmd = ""
             else:
                 if language == "Python3":
-                    cmds = ["django-admin3",
-                            "django-admin3.py",
-                            "django-admin.py-3.10",
-                            "django-admin.py-3.9",
-                            "django-admin.py-3.8",
-                            "django-admin.py-3.7",
-                            "django-admin.py-3.6",
-                            ]
+                    cmds = [
+                        "django-admin3",
+                        "django-admin3.py",
+                        "django-admin.py-3.10",
+                        "django-admin.py-3.9",
+                        "django-admin.py-3.8",
+                        "django-admin.py-3.7",
+                        "django-admin.py-3.6",
+                    ]
                 else:
                     cmds = []
                 cmds.extend(["django-admin", "django-admin.py"])
@@ -1357,20 +1532,19 @@
                         break
                 else:
                     cmd = ""
-        
+
         return cmd
-    
+
     def __getPythonExecutable(self):
         """
         Private method to build the Python command.
-        
+
         @return python command
         @rtype str
         """
         language = self.__ericProject.getProjectLanguage()
         if language == "Python3":
-            venvName = self.__plugin.getPreferences(
-                "VirtualEnvironmentNamePy3")
+            venvName = self.__plugin.getPreferences("VirtualEnvironmentNamePy3")
             if not venvName:
                 # if none configured, use the global one
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
@@ -1378,19 +1552,19 @@
             venvName = ""
         python = (
             self.__virtualEnvManager.getVirtualenvInterpreter(venvName)
-            if venvName else
-            ""
+            if venvName
+            else ""
         )
-        
+
         return python
-    
+
     def __djangoInfo(self):
         """
         Private slot to show some info about Django.
         """
         version = self.getDjangoVersionString()
         url = "https://www.djangoproject.com"
-        
+
         msgBox = EricMessageBox.EricMessageBox(
             EricMessageBox.Question,
             self.tr("About Django"),
@@ -1400,50 +1574,54 @@
                 " design.</p>"
                 "<p><table>"
                 "<tr><td>Version:</td><td>{0}</td></tr>"
-                "<tr><td>URL:</td><td><a href=\"{1}\">"
+                '<tr><td>URL:</td><td><a href="{1}">'
                 "{1}</a></td></tr>"
                 "</table></p>"
             ).format(version, url),
             modal=True,
-            buttons=EricMessageBox.Ok)
-        msgBox.setIconPixmap(UI.PixmapCache.getPixmap(
-            os.path.join("ProjectDjango", "icons",
-                         "django64-{0}".format(self.__iconSuffix))))
+            buttons=EricMessageBox.Ok,
+        )
+        msgBox.setIconPixmap(
+            UI.PixmapCache.getPixmap(
+                os.path.join(
+                    "ProjectDjango", "icons", "django64-{0}".format(self.__iconSuffix)
+                )
+            )
+        )
         msgBox.exec()
-    
+
     def getDjangoVersionString(self):
         """
         Public method to get the Django version as a string.
-        
+
         @return Django version
         @rtype str
         """
         djangoVersion = ""
-        
-        args = ['--version']
+
+        args = ["--version"]
         ioEncoding = Preferences.getSystem("IOEncoding")
         cmd = self.__getDjangoAdminCommand()
         if cmd:
             if isWindowsPlatform():
                 args.insert(0, cmd)
                 cmd = self.__getPythonExecutable()
-            
+
             process = QProcess()
             process.start(cmd, args)
             procStarted = process.waitForStarted()
             if procStarted:
                 finished = process.waitForFinished(30000)
                 if finished and process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(), ioEncoding,
-                                 'replace')
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                     djangoVersion = output.splitlines()[0].strip()
-        
+
         return djangoVersion
-    
+
     def getDjangoVersion(self):
         """
         Public method to get the Django version as a tuple.
-        
+
         @return Django version
         @rtype tuple of int
         """
@@ -1455,13 +1633,13 @@
                     djangoVersionList.append(int(part))
                 except ValueError:
                     djangoVersionList.append(part)
-        
+
         return tuple(djangoVersionList)
-    
+
     def __getApplications(self):
         """
         Private method to ask the user for a list of application names.
-        
+
         @return list of application names
         @rtype list of str
         """
@@ -1470,7 +1648,9 @@
             self.tr("Select Applications"),
             self.tr("Enter the list of applications separated by spaces."),
             self.getRecentApplications(),
-            0, True)
+            0,
+            True,
+        )
         if ok and applStr != "":
             self.setMostRecentApplication(applStr)
             return applStr.split()
@@ -1487,41 +1667,41 @@
         if ra is not None:
             maxRecentApps = self.__plugin.getPreferences("RecentNumberApps")
             self.__recentApplications = ra[:maxRecentApps]
-    
+
     def __saveRecentApplications(self):
         """
         Private method to save the list of recently used applications list.
         """
-        Preferences.Prefs.rsettings.setValue(self.RecentApplicationsKey,
-                                             self.__recentApplications)
+        Preferences.Prefs.rsettings.setValue(
+            self.RecentApplicationsKey, self.__recentApplications
+        )
         Preferences.Prefs.rsettings.sync()
-    
+
     def getRecentApplications(self):
         """
         Public method to get the list of recent applications.
-        
+
         @return list of recent applications entries (list of strings)
         """
         self.__loadRecentApplications()
         return self.__recentApplications
-    
+
     def setMostRecentApplication(self, applStr):
         """
         Public method to set the most recently used applications entry.
-        
+
         @param applStr applications entry
         @type str
         """
         if applStr in self.__recentApplications:
             self.__recentApplications.remove(applStr)
         self.__recentApplications.insert(0, applStr)
-        
+
         maxRecentApps = self.__plugin.getPreferences("RecentNumberApps")
         if len(self.__recentApplications) > maxRecentApps:
-            self.__recentApplications = (
-                self.__recentApplications[:maxRecentApps])
+            self.__recentApplications = self.__recentApplications[:maxRecentApps]
         self.__saveRecentApplications()
-    
+
     def __loadRecentTestData(self):
         """
         Private method to load the recently used test data lists.
@@ -1532,26 +1712,26 @@
             "RecentTestExcludeTags": [],
         }
         Preferences.Prefs.rsettings.sync()
-        maxRecentTestData = self.__plugin.getPreferences(
-            "RecentNumberTestData")
+        maxRecentTestData = self.__plugin.getPreferences("RecentNumberTestData")
         for key in self.__recentTestData:
             recent = Preferences.Prefs.rsettings.value("Django/" + key)
             if recent is not None:
                 self.__recentTestData[key] = recent[:maxRecentTestData]
-    
+
     def __saveRecentTestData(self):
         """
         Private method to save the list of recently used test data.
         """
         for key in self.__recentTestData:
-            Preferences.Prefs.rsettings.setValue("Django/" + key,
-                                                 self.__recentTestData[key])
+            Preferences.Prefs.rsettings.setValue(
+                "Django/" + key, self.__recentTestData[key]
+            )
         Preferences.Prefs.rsettings.sync()
-    
+
     def getRecentTestData(self, key):
         """
         Public method to get the list of recent test data.
-        
+
         @param key key (name) of the test data to get
         @type str
         @return list of recent test data entries
@@ -1559,11 +1739,11 @@
         """
         self.__loadRecentTestData()
         return self.__recentTestData[key]
-    
+
     def setMostRecentTestData(self, key, data):
         """
         Public method to set the most recently used test data entry.
-        
+
         @param key key (name) of the test data to set
         @type str
         @param data test data entry to be set
@@ -1572,50 +1752,49 @@
         if data in self.__recentTestData[key]:
             self.__recentTestData[key].remove(data)
         self.__recentTestData[key].insert(0, data)
-        
-        maxRecentTestData = self.__plugin.getPreferences(
-            "RecentNumberTestData")
+
+        maxRecentTestData = self.__plugin.getPreferences("RecentNumberTestData")
         if len(self.__recentTestData[key]) > maxRecentTestData:
-            self.__recentTestData[key] = (
-                self.__recentTestData[key][:maxRecentTestData])
+            self.__recentTestData[key] = self.__recentTestData[key][:maxRecentTestData]
         self.__saveRecentTestData()
-    
+
     def getProjectPath(self):
         """
         Public method to get the path of the eric7 project.
-        
+
         @return path of the eric7 project
         @rtype str
         """
         return self.__ericProject.getProjectPath()
-    
+
     def __showHelpIndex(self):
         """
         Private slot to show the help index page.
         """
-        page = os.path.join(os.path.dirname(__file__),
-                            "Documentation", "help", "index.html")
+        page = os.path.join(
+            os.path.dirname(__file__), "Documentation", "help", "index.html"
+        )
         self.__ui.launchHelpViewer(page)
-    
+
     def __isSpawningConsole(self, consoleCmd):
         """
         Private method to check, if the given console is a spawning console.
-        
+
         @param consoleCmd console command
         @type str
         @return tuple of two entries giving an indication, if the console
             is spawning and the (possibly) cleaned console command
         @rtype tuple of (bool, str)
         """
-        if consoleCmd and consoleCmd[0] == '@':
+        if consoleCmd and consoleCmd[0] == "@":
             return (True, consoleCmd[1:])
         else:
             return (False, consoleCmd)
-    
+
     def __adjustWorkingDirectory(self, args, wd):
         """
         Private method to adjust the working directory in the arguments list.
-        
+
         @param args list of arguments to be modified
         @type list of str
         @param wd working directory
@@ -1629,24 +1808,24 @@
                 if args[index].startswith("--working-directory="):
                     args[index] = "--working-directory={0}".format(wd)
                     break
-    
+
     ##################################################################
     ## slots below implement creation functions
     ##################################################################
-    
+
     def newProjectCreated(self):
         """
         Public slot to finish up the newly generated project.
         """
         if self.__ericProject.getProjectType() == "Django":
             ppath = self.__ericProject.getProjectPath()
-            
+
             # get rid of an __init__.py file because it would be in our way
             initModule = os.path.join(ppath, "__init__.py")
             if os.path.exists(initModule):
                 self.__ericProject.deleteFile("__init__.py")
                 self.__ericProject.saveProject()
-    
+
     def startProjectOrApplication(self):
         """
         Public slot to start a new Django project or application.
@@ -1658,25 +1837,29 @@
             selection, ok = QInputDialog.getItem(
                 self.__ui,
                 self.tr("Start Django"),
-                self.tr("Select if this project should be a "
-                        "Django Project or Application.<br />"
-                        "Select the empty entry for none."),
+                self.tr(
+                    "Select if this project should be a "
+                    "Django Project or Application.<br />"
+                    "Select the empty entry for none."
+                ),
                 selections,
-                0, False)
+                0,
+                False,
+            )
             if ok and bool(selection):
                 if selection == projectStr:
                     path, projectName = os.path.split(
-                        self.__ericProject.getProjectPath())
+                        self.__ericProject.getProjectPath()
+                    )
                     self.__createProject(projectName, path)
                 elif selection == applStr:
-                    path, applName = os.path.split(
-                        self.__ericProject.getProjectPath())
+                    path, applName = os.path.split(self.__ericProject.getProjectPath())
                     self.__createApplication(applName, path)
-    
+
     def __createProject(self, projectName, path):
         """
         Private slot to create a new Django project.
-        
+
         @param projectName name of the new project
         @type str
         @param path the directory where the project should be created
@@ -1685,26 +1868,32 @@
         @rtype bool
         """
         title = self.tr("Start Django Project")
-        
+
         # remove the project directory if it exists already
         ppath = os.path.join(path, projectName)
         if os.path.exists(ppath):
             okToRemove = EricMessageBox.yesNo(
                 self.__ui,
                 title,
-                self.tr("""<p>The Django project path <b>{0}</b> exists"""
-                        """ already. Shall it be removed and recreated?"""
-                        """</p>""").format(ppath))
+                self.tr(
+                    """<p>The Django project path <b>{0}</b> exists"""
+                    """ already. Shall it be removed and recreated?"""
+                    """</p>"""
+                ).format(ppath),
+            )
             if not okToRemove:
                 EricMessageBox.information(
                     self.__ui,
                     title,
-                    self.tr("""<p>Please add the files to the eric project"""
-                            """ manually.</p>"""))
+                    self.tr(
+                        """<p>Please add the files to the eric project"""
+                        """ manually.</p>"""
+                    ),
+                )
                 return True
-            
+
             shutil.rmtree(ppath, ignore_errors=True)
-        
+
         args = []
         cmd = self.__getDjangoAdminCommand()
         if cmd:
@@ -1715,35 +1904,35 @@
             EricMessageBox.critical(
                 self.__ui,
                 title,
-                self.tr("""<p>The <b>django-admin.py</b> script is"""
-                        """ not in the path. Aborting...</p>"""))
+                self.tr(
+                    """<p>The <b>django-admin.py</b> script is"""
+                    """ not in the path. Aborting...</p>"""
+                ),
+            )
             return False
-        
+
         args.append("startproject")
         args.append(projectName)
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("Django project created successfully."))
+            title, msgSuccess=self.tr("Django project created successfully.")
+        )
         res = dia.startProcess(args, path)
         if res:
             dia.exec()
-            
+
             # create the base directory for translations
             i18nPath = os.path.join(path, projectName, "locale")
             if not os.path.exists(i18nPath):
                 os.makedirs(i18nPath)
-            
-            if (
-                os.path.join(path, projectName) ==
-                self.__ericProject.getProjectPath()
-            ):
+
+            if os.path.join(path, projectName) == self.__ericProject.getProjectPath():
                 self.__setCurrentSite("")
             else:
                 self.__setCurrentSite(projectName)
-            
+
         return res
-    
+
     def __startProject(self):
         """
         Private slot to start a new Django project.
@@ -1752,23 +1941,24 @@
             self.__ui,
             self.tr("Start Django Project"),
             self.tr("Enter the name of the new Django project."),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and projectName != "":
-            res = self.__createProject(projectName,
-                                       self.__ericProject.getProjectPath())
+            res = self.__createProject(projectName, self.__ericProject.getProjectPath())
             if res:
                 # search for new files and add them to the project
-                sitePath = os.path.join(self.__ericProject.getProjectPath(),
-                                        projectName)
+                sitePath = os.path.join(
+                    self.__ericProject.getProjectPath(), projectName
+                )
                 for entry in os.walk(sitePath):
                     for fileName in entry[2]:
                         fullName = os.path.join(entry[0], fileName)
                         self.__ericProject.appendFile(fullName)
-    
+
     def __createApplication(self, applName, path, isGlobal=True):
         """
         Private slot to create a new Django application.
-        
+
         @param applName name of the new application
         @type str
         @param path the directory where the application should be created
@@ -1779,12 +1969,12 @@
         @rtype bool
         """
         title = self.tr("Start Django Application")
-        
+
         # remove the application directory if it exists already
         apath = os.path.join(path, applName)
         if os.path.exists(apath):
             shutil.rmtree(apath, ignore_errors=True)
-        
+
         args = []
         if isGlobal:
             cmd = self.__getDjangoAdminCommand()
@@ -1796,28 +1986,31 @@
                 EricMessageBox.critical(
                     self.__ui,
                     title,
-                    self.tr("""<p>The <b>django-admin.py</b> script"""
-                            """ is not in the path."""
-                            """ Aborting...</p>"""))
+                    self.tr(
+                        """<p>The <b>django-admin.py</b> script"""
+                        """ is not in the path."""
+                        """ Aborting...</p>"""
+                    ),
+                )
                 return False
         else:
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
             try:
                 path = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 return False
         args.append("startapp")
         args.append(applName)
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("Django application created successfully."))
+            title, msgSuccess=self.tr("Django application created successfully.")
+        )
         res = dia.startProcess(args, path)
         if res:
             dia.exec()
         return res
-    
+
     def __startGlobalApplication(self):
         """
         Private slot to start a new global Django application.
@@ -1825,21 +2018,21 @@
         applName, ok = QInputDialog.getText(
             self.__ui,
             self.tr("Start Global Django Application"),
-            self.tr("Enter the name of the new global Django"
-                    " application."),
-            QLineEdit.EchoMode.Normal)
+            self.tr("Enter the name of the new global Django" " application."),
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and applName != "":
-            res = self.__createApplication(applName,
-                                           self.__ericProject.getProjectPath())
+            res = self.__createApplication(
+                applName, self.__ericProject.getProjectPath()
+            )
             if res:
                 # search for new files and add them to the project
-                appPath = os.path.join(self.__ericProject.getProjectPath(),
-                                       applName)
+                appPath = os.path.join(self.__ericProject.getProjectPath(), applName)
                 for entry in os.walk(appPath):
                     for fileName in entry[2]:
                         fullName = os.path.join(entry[0], fileName)
                         self.__ericProject.appendFile(fullName)
-    
+
     def __startLocalApplication(self):
         """
         Private slot to start a new local Django application.
@@ -1848,7 +2041,8 @@
             self.__ui,
             self.tr("Start Local Django Application"),
             self.tr("Enter the name of the new local Django application."),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and applName != "":
             res = self.__createApplication(applName, "", False)
             if res:
@@ -1859,17 +2053,17 @@
                         for fileName in entry[2]:
                             fullName = os.path.join(entry[0], fileName)
                             self.__ericProject.appendFile(fullName)
-                except DjangoNoSiteSelectedException:
+                except DjangoNoSiteSelectedError:
                     return
-    
+
     ##################################################################
     ## methods below implement site related functions
     ##################################################################
-    
+
     def __findSites(self):
         """
         Private method to determine the relative path to all manage.py scripts.
-        
+
         @return list of sites
         @rtype list of str
         """
@@ -1878,7 +2072,7 @@
             if os.path.basename(file) == "manage.py":
                 sites.append(os.path.dirname(file))
         return sites
-    
+
     def __selectSite(self):
         """
         Private method to select a site to work with.
@@ -1899,33 +2093,34 @@
                 self.tr("Select Project"),
                 self.tr("Select the Django project to work with."),
                 sites,
-                cur, False)
+                cur,
+                False,
+            )
             if not ok:
                 site = None
         self.__setCurrentSite(site)
-    
+
     def __sitePath(self):
         """
         Private method to calculate the full path of the Django site.
-        
+
         @return path of the site
         @rtype str
-        @exception DjangoNoSiteSelectedException raised, if no site is selected
+        @exception DjangoNoSiteSelectedError raised, if no site is selected
         """
         if self.__currentSite is None:
             self.__selectSite()
-        
+
         if self.__currentSite is None:
-            raise DjangoNoSiteSelectedException
+            raise DjangoNoSiteSelectedError
         else:
-            path = os.path.join(self.__ericProject.getProjectPath(),
-                                self.__currentSite)
+            path = os.path.join(self.__ericProject.getProjectPath(), self.__currentSite)
             return path
-    
+
     def __setCurrentSite(self, site):
         """
         Private slot to set the current site.
-        
+
         @param site name of the site
         @type str
         """
@@ -1937,42 +2132,43 @@
         else:
             curSite = self.__currentSite
         self.selectSiteAct.setText(
-            self.tr('&Current Django project ({0})').format(curSite))
-        
+            self.tr("&Current Django project ({0})").format(curSite)
+        )
+
         if self.__currentSite is None:
             self.__ericProject.setTranslationPattern("")
         else:
             self.__ericProject.setTranslationPattern(
-                os.path.join(site, "locale", "%language%", "LC_MESSAGES",
-                             "django.po")
+                os.path.join(site, "locale", "%language%", "LC_MESSAGES", "django.po")
             )
-    
+
     def __site(self):
         """
         Private method to get the name of the current site.
-        
+
         @return name of the site
         @rtype str
-        @exception DjangoNoSiteSelectedException raised, if no site is selected
+        @exception DjangoNoSiteSelectedError raised, if no site is selected
         """
         if self.__currentSite is None:
             self.__selectSite()
-        
+
         if self.__currentSite is None:
-            raise DjangoNoSiteSelectedException
+            raise DjangoNoSiteSelectedError
         else:
             return self.__currentSite
 
     ##################################################################
     ## slots below implement run functions
     ##################################################################
-    
+
     def __runServer(self):
         """
         Private slot to start the Django Web server.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommand"))[1]
+            self.__plugin.getPreferences("ConsoleCommand")
+        )[1]
         if consoleCmd:
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
@@ -1986,40 +2182,41 @@
             addr = self.__plugin.getPreferences("ServerAddress")
             if addr:
                 args.append(addr)
-            
-            with contextlib.suppress(DjangoNoSiteSelectedException):
+
+            with contextlib.suppress(DjangoNoSiteSelectedError):
                 if Utilities.isWindowsPlatform():
                     serverProcStarted, pid = QProcess.startDetached(
-                        args[0], args[1:], self.__sitePath())
+                        args[0], args[1:], self.__sitePath()
+                    )
                 else:
                     if self.__serverProc is not None:
                         self.__serverProcFinished()
-                    
+
                     self.__serverProc = QProcess()
-                    self.__serverProc.finished.connect(
-                        self.__serverProcFinished)
+                    self.__serverProc.finished.connect(self.__serverProcFinished)
                     self.__serverProc.setWorkingDirectory(self.__sitePath())
                     self.__serverProc.start(args[0], args[1:])
                     serverProcStarted = self.__serverProc.waitForStarted()
                 if not serverProcStarted:
                     EricMessageBox.critical(
                         None,
-                        self.tr('Process Generation Error'),
-                        self.tr('The Django server could not be started.'))
-    
+                        self.tr("Process Generation Error"),
+                        self.tr("The Django server could not be started."),
+                    )
+
     def __serverProcFinished(self):
         """
         Private slot connected to the finished signal.
         """
         if (
-            self.__serverProc is not None and
-            self.__serverProc.state() != QProcess.ProcessState.NotRunning
+            self.__serverProc is not None
+            and self.__serverProc.state() != QProcess.ProcessState.NotRunning
         ):
             self.__serverProc.terminate()
             QTimer.singleShot(2000, self.__serverProc.kill)
             self.__serverProc.waitForFinished(3000)
         self.__serverProc = None
-    
+
     def __runBrowser(self):
         """
         Private slot to start the default web browser with the server URL.
@@ -2028,10 +2225,10 @@
         ipv6 = self.__plugin.getPreferences("UseIPv6")
         if addr:
             # test for an IPv6 and port address
-            if ']:' in addr:
-                addr, port = addr.rsplit(':', 1)
-            elif ':' in addr:
-                addr, port = addr.split(':', 1)
+            if "]:" in addr:
+                addr, port = addr.rsplit(":", 1)
+            elif ":" in addr:
+                addr, port = addr.split(":", 1)
             else:
                 port = addr
                 if ipv6:
@@ -2050,9 +2247,11 @@
             if not res:
                 EricMessageBox.critical(
                     None,
-                    self.tr('Run Web-Browser'),
-                    self.tr('Could not start the web-browser for the'
-                            ' url "{0}".').format(url.toString()))
+                    self.tr("Run Web-Browser"),
+                    self.tr(
+                        "Could not start the web-browser for the" ' url "{0}".'
+                    ).format(url.toString()),
+                )
         else:
             self.__ui.launchHelpViewer(url)
 
@@ -2060,7 +2259,7 @@
     ## slots below implement functions to save and load recently used
     ## database names
     ##################################################################
-    
+
     def __loadRecentDatabaseNames(self):
         """
         Private method to load the list of recently used database names.
@@ -2069,46 +2268,50 @@
         Preferences.Prefs.rsettings.sync()
         rdb = Preferences.Prefs.rsettings.value(self.RecentDatabaseNamesKey)
         if rdb is not None:
-            maxRecentDatabaseNames = (
-                self.__plugin.getPreferences("RecentNumberDatabaseNames"))
+            maxRecentDatabaseNames = self.__plugin.getPreferences(
+                "RecentNumberDatabaseNames"
+            )
             self.__recentDatabaseNames = rdb[:maxRecentDatabaseNames]
-    
+
     def __saveRecentDatabaseNames(self):
         """
         Private method to save the list of recently used database names.
         """
-        Preferences.Prefs.rsettings.setValue(self.RecentDatabaseNamesKey,
-                                             self.__recentDatabaseNames)
+        Preferences.Prefs.rsettings.setValue(
+            self.RecentDatabaseNamesKey, self.__recentDatabaseNames
+        )
         Preferences.Prefs.rsettings.sync()
-    
+
     def getRecentDatabaseNames(self):
         """
         Public method to get the list of recently used database names.
-        
+
         @return list of recently used database names
         @rtype list of str
         """
         self.__loadRecentDatabaseNames()
         return self.__recentDatabaseNames
-    
+
     def setMostRecentDatabaseNames(self, dbName):
         """
         Public method to set the most recently used database names.
-        
+
         @param dbName database name
         @type str
         """
         if dbName in self.__recentDatabaseNames:
             self.__recentDatabaseNames.remove(dbName)
         self.__recentDatabaseNames.insert(0, dbName)
-        
-        maxRecentDatabaseNames = (
-            self.__plugin.getPreferences("RecentNumberDatabaseNames"))
+
+        maxRecentDatabaseNames = self.__plugin.getPreferences(
+            "RecentNumberDatabaseNames"
+        )
         if len(self.__recentDatabaseNames) > maxRecentDatabaseNames:
-            self.__recentDatabaseNames = (
-                self.__recentDatabaseNames[:maxRecentDatabaseNames])
+            self.__recentDatabaseNames = self.__recentDatabaseNames[
+                :maxRecentDatabaseNames
+            ]
         self.__saveRecentDatabaseNames()
-    
+
     def __selectDatabaseName(self):
         """
         Private method to select the name of the database to work with.
@@ -2116,70 +2319,73 @@
         recentDatabases = self.getRecentDatabaseNames()[:]
         if "" not in recentDatabases:
             recentDatabases.insert(1, "")
-        
+
         selectedDatabase, ok = QInputDialog.getItem(
             self.__ui,
             self.tr("Database Name"),
             self.tr("Select a database name (leave empty for default):"),
             recentDatabases,
-            0, True)
-        
+            0,
+            True,
+        )
+
         if ok:
             self.setMostRecentDatabaseNames(selectedDatabase)
             self.__setCurrentDatabase(selectedDatabase)
-    
+
     def __setCurrentDatabase(self, database):
         """
         Private method to set the database name to be used.
-        
+
         @param database name of the database
         @type str
         """
         if database is None:
             database = self.getRecentDatabaseNames()[0]
-        
+
         self.__currentDatabase = database
         curDb = database if database else self.tr("<default>")
         self.selectDatabaseNameAct.setText(
-            self.tr('&Current Database ({0})').format(curDb))
-    
+            self.tr("&Current Database ({0})").format(curDb)
+        )
+
     def currentDatabase(self):
         """
         Public method to get the database name to be used.
-        
+
         @return database name
         @rtype str
         """
         return self.__currentDatabase
-    
+
     ##################################################################
     ## slots below implement database related functions
     ##################################################################
-    
+
     def __databaseInspect(self):
         """
         Private slot to introspect the database and output a Django model
         module.
         """
         title = self.tr("Introspect Database")
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("inspectdb")
         if self.__currentDatabase:
             args.append("--database={0}".format(self.__currentDatabase))
-        
+
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         dia = DjangoDialog(title, fixed=True, linewrap=False)
         res = dia.startProcess(args, path, False)
         if res:
             dia.exec()
-    
+
     def __databaseFlush(self):
         """
         Private slot to return all database tables to the state just after
@@ -2187,16 +2393,18 @@
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         title = self.tr("Flush Database")
-        
+
         res = EricMessageBox.yesNo(
             self.__ui,
             title,
-            self.tr("""Flushing the database will destroy all data."""
-                    """ Are you sure?"""))
+            self.tr(
+                """Flushing the database will destroy all data.""" """ Are you sure?"""
+            ),
+        )
         if res:
             args = []
             args.append(self.__getPythonExecutable())
@@ -2205,21 +2413,21 @@
             args.append("--noinput")
             if self.__currentDatabase:
                 args.append("--database={0}".format(self.__currentDatabase))
-            
+
             dia = DjangoDialog(
-                title,
-                msgSuccess=self.tr("Database tables flushed"
-                                   " successfully."))
+                title, msgSuccess=self.tr("Database tables flushed" " successfully.")
+            )
             res = dia.startProcess(args, path)
             if res:
                 dia.exec()
-    
+
     def __runDatabaseClient(self):
         """
         Private slot to start a database client for a Django project.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommand"))[1]
+            self.__plugin.getPreferences("ConsoleCommand")
+        )[1]
         if consoleCmd:
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
@@ -2228,24 +2436,25 @@
             args.append("dbshell")
             if self.__currentDatabase:
                 args.append("--database={0}".format(self.__currentDatabase))
-            with contextlib.suppress(DjangoNoSiteSelectedException):
+            with contextlib.suppress(DjangoNoSiteSelectedError):
                 wd = self.__sitePath()
                 self.__adjustWorkingDirectory(args, wd)
                 started, pid = QProcess.startDetached(args[0], args[1:], wd)
                 if not started:
                     EricMessageBox.critical(
                         None,
-                        self.tr('Process Generation Error'),
-                        self.tr('The Django process could not be started.'))
-    
+                        self.tr("Process Generation Error"),
+                        self.tr("The Django process could not be started."),
+                    )
+
     #######################################################################
     ## slots below implement database functions outputting SQL statements
     #######################################################################
-    
+
     def __sqlCommand(self, title, command, requestApps=True):
         """
         Private method to perform an SQL creation function.
-        
+
         @param title dialog title
         @type str
         @param command Django sql... command
@@ -2256,16 +2465,16 @@
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         if requestApps:
             apps = self.__getApplications()
             if not apps:
                 return
         else:
             apps = []
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
@@ -2273,62 +2482,59 @@
         if self.__currentDatabase:
             args.append("--database={0}".format(self.__currentDatabase))
         args += apps
-        
+
         fileFilter = self.tr("SQL Files (*.sql)")
-        
-        dia = DjangoDialog(title, fixed=True, linewrap=False,
-                           saveFilters=fileFilter)
+
+        dia = DjangoDialog(title, fixed=True, linewrap=False, saveFilters=fileFilter)
         res = dia.startProcess(args, path, False)
         if res:
             dia.exec()
-    
+
     def __databaseSqlFlushDatabase(self):
         """
         Private slot to print a list of statements to return all database
         tables to their initial state.
         """
         self.__sqlCommand(self.tr("Flush Database"), "sqlflush", False)
-    
+
     def __databaseSqlResetSequences(self):
         """
         Private slot to print the SQL statements for resetting sequences for
         one or more applications.
         """
         self.__sqlCommand(self.tr("Reset Sequences"), "sqlsequencereset")
-    
+
     def __databaseSqlMigrate(self, backwards=False):
         """
         Private slot to print the SQL statements for a migration of an
         application.
-        
+
         @param backwards flag indicating to generate the SQL code to revert
             a migration
         @type bool
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         migrations = self.__getMigrations()
         if not migrations:
             EricMessageBox.information(
-                None,
-                self.tr("SQL Migrate"),
-                self.tr("""No migrations available."""))
+                None, self.tr("SQL Migrate"), self.tr("""No migrations available.""")
+            )
             return
-        
+
         title = self.tr("SQL Migrate")
-        
-        from .DjangoMigrationSelectionDialog import (
-            DjangoMigrationSelectionDialog
+
+        from .DjangoMigrationSelectionDialog import DjangoMigrationSelectionDialog
+
+        dlg = DjangoMigrationSelectionDialog(
+            migrations, migrationRequired=True, suffix=self.__iconSuffix
         )
-        dlg = DjangoMigrationSelectionDialog(migrations,
-                                             migrationRequired=True,
-                                             suffix=self.__iconSuffix)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             app, migration = dlg.getData()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2339,57 +2545,64 @@
                 args.append("--backwards")
             args.append(app)
             args.append(migration)
-            
+
             fileFilter = self.tr("SQL Files (*.sql)")
-            
-            dia = DjangoDialog(title, fixed=True, linewrap=False,
-                               saveFilters=fileFilter)
+
+            dia = DjangoDialog(
+                title, fixed=True, linewrap=False, saveFilters=fileFilter
+            )
             res = dia.startProcess(args, path, False)
             if res:
                 dia.exec()
-    
+
     ##################################################################
     ## slots below implement migration related functions
     ##################################################################
-    
+
     def __showMigrationsList(self):
         """
         Private slot to show the available migrations and their status.
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         from .DjangoMigrationsListDialog import DjangoMigrationsListDialog
+
         self.__migrationsListDialog = DjangoMigrationsListDialog(
-            DjangoMigrationsListDialog.MigrationsListMode, self, self.__ui)
+            DjangoMigrationsListDialog.MigrationsListMode, self, self.__ui
+        )
         self.__migrationsListDialog.show()
-        self.__migrationsListDialog.start(self.__getPythonExecutable(), path,
-                                          self.__currentDatabase)
-    
+        self.__migrationsListDialog.start(
+            self.__getPythonExecutable(), path, self.__currentDatabase
+        )
+
     def __showMigrationsPlan(self):
         """
         Private slot to show the migrations plan.
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         from .DjangoMigrationsListDialog import DjangoMigrationsListDialog
+
         self.__migrationsPlanDialog = DjangoMigrationsListDialog(
-            DjangoMigrationsListDialog.MigrationsPlanMode, self, self.__ui)
+            DjangoMigrationsListDialog.MigrationsPlanMode, self, self.__ui
+        )
         self.__migrationsPlanDialog.show()
-        self.__migrationsPlanDialog.start(self.__getPythonExecutable(), path,
-                                          self.__currentDatabase)
-    
+        self.__migrationsPlanDialog.start(
+            self.__getPythonExecutable(), path, self.__currentDatabase
+        )
+
     def __applyAllMigrations(self):
         """
         Private slot to apply all migrations.
         """
         self.applyMigrations()
-    
+
     def __applySelectedMigrations(self):
         """
         Private slot to apply selected migrations of a selected app.
@@ -2399,22 +2612,21 @@
             EricMessageBox.information(
                 None,
                 self.tr("Apply Selected Migrations"),
-                self.tr("""No migrations available."""))
+                self.tr("""No migrations available."""),
+            )
             return
-        
-        from .DjangoMigrationSelectionDialog import (
-            DjangoMigrationSelectionDialog
-        )
-        dlg = DjangoMigrationSelectionDialog(migrations,
-                                             suffix=self.__iconSuffix)
+
+        from .DjangoMigrationSelectionDialog import DjangoMigrationSelectionDialog
+
+        dlg = DjangoMigrationSelectionDialog(migrations, suffix=self.__iconSuffix)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             app, migration = dlg.getData()
             self.applyMigrations(app=app, migration=migration)
-    
+
     def applyMigrations(self, app=None, migration=None):
         """
         Public slot to apply migrations.
-        
+
         @param app name of an application to apply migrations for
         @type str
         @param migration name of a migration to update to
@@ -2422,15 +2634,15 @@
         """
         title = (
             self.tr("Unapply Migrations")
-            if migration == "zero" else
-            self.tr("Apply Migrations")
+            if migration == "zero"
+            else self.tr("Apply Migrations")
         )
-        
+
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
@@ -2440,12 +2652,12 @@
             args.append(app)
             if migration:
                 args.append(migration)
-        
+
         dia = DjangoDialog(title)
         res = dia.startProcess(args, path)
         if res:
             dia.exec()
-    
+
     def __unapplyMigrations(self):
         """
         Private slot to revert all migrations of an application.
@@ -2455,46 +2667,52 @@
             EricMessageBox.information(
                 None,
                 self.tr("Unapply Migrations"),
-                self.tr("""No migrations available."""))
+                self.tr("""No migrations available."""),
+            )
             return
-        
+
         app, ok = QInputDialog.getItem(
             None,
             self.tr("Unapply Migrations"),
             self.tr("Select an application:"),
             [""] + apps,
-            0, False)
+            0,
+            False,
+        )
         if ok and app:
             self.applyMigrations(app=app, migration="zero")
-    
+
     def __getMigrations(self):
         """
         Private method to get the available migrations.
-        
+
         @return dictionary containing the available migrations
         @rtype dict with app name as key (str) and list of tuples of
             applied indication (bool) and migration name (str) as value
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return {}
-        
+
         args = []
         args.append("manage.py")
         args.append("showmigrations")
         args.append("--list")
         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() and proc.waitForFinished():
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"), 'replace')
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             if output:
                 recentApp = ""
                 for line in output.splitlines():
@@ -2510,12 +2728,13 @@
                         if recentApp:
                             migrations[recentApp].append((applied, name))
         return migrations
-    
+
     def __makeMigrations(self):
         """
         Private slot to generate migrations for the Django project.
         """
         from .DjangoMakeMigrationsDialog import DjangoMakeMigrationsDialog
+
         dlg = DjangoMakeMigrationsDialog(self.getRecentApplications())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             apps, migration, dryRun, empty, merge = dlg.getData()
@@ -2523,12 +2742,13 @@
                 self.setMostRecentApplication(apps)
             apps = apps.split()
             self.makeMigrations(apps, migration, dryRun, empty, merge)
-    
-    def makeMigrations(self, apps, migration=None, dryRun=False, empty=False,
-                       merge=False):
+
+    def makeMigrations(
+        self, apps, migration=None, dryRun=False, empty=False, merge=False
+    ):
         """
         Public method to generate migrations.
-        
+
         @param apps list of application names to generate migrations for
         @type list of str
         @param migration name of the migration to generate
@@ -2541,12 +2761,12 @@
         @type bool
         """
         title = self.tr("Make Migrations")
-        
+
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
@@ -2562,12 +2782,12 @@
             args.append("--merge")
         if apps:
             args += apps
-        
+
         dia = DjangoDialog(title, showInput=True)
         res = dia.startProcess(args, path)
         if res:
             dia.exec()
-    
+
     def __squashMigrations(self):
         """
         Private slot to squash migrations.
@@ -2577,24 +2797,25 @@
             EricMessageBox.information(
                 None,
                 self.tr("Squash Migrations"),
-                self.tr("""No migrations available."""))
+                self.tr("""No migrations available."""),
+            )
             return
-        
+
         from .DjangoSquashMigrationSelectionDialog import (
-            DjangoSquashMigrationSelectionDialog
+            DjangoSquashMigrationSelectionDialog,
         )
-        dlg = DjangoSquashMigrationSelectionDialog(
-            migrations, self, self.__iconSuffix)
+
+        dlg = DjangoSquashMigrationSelectionDialog(migrations, self, self.__iconSuffix)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             app, start, end, noOptimize, name = dlg.getData()
-            
+
             title = self.tr("Squash Migrations")
-            
+
             try:
                 path = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 return
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2608,27 +2829,28 @@
             if start:
                 args.append(start)
             args.append(end)
-            
+
             dia = DjangoDialog(title)
             res = dia.startProcess(args, path)
             if res:
                 dia.exec()
-    
+
     ##################################################################
     ## slots below implement some tool functions
     ##################################################################
-    
+
     def __diffSettings(self):
         """
         Private slot to show the changes made to the settings.py file.
         """
         title = self.tr("Diff Settings")
-        
+
         from .DjangoDiffsettingsDataDialog import DjangoDiffsettingsDataDialog
+
         dlg = DjangoDiffsettingsDataDialog(self, self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             showAll, defaultModule, outputFormat = dlg.getData()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2639,54 +2861,58 @@
                 args.append("--default={0}".format(defaultModule))
             if outputFormat:
                 args.append("--output={0}".format(outputFormat))
-            
+
             try:
                 path = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 return
-            
+
             dia = DjangoDialog(title, fixed=True, linewrap=False)
             res = dia.startProcess(args, path, False)
             if res:
                 dia.exec()
-    
+
     def __runPythonShell(self):
         """
         Private slot to start a Python console for a Django project.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommand"))[1]
+            self.__plugin.getPreferences("ConsoleCommand")
+        )[1]
         if consoleCmd:
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
             args.append("shell")
-            args.append("--interface={0}".format(
-                self.__plugin.getPreferences("Python3ConsoleType")))
-            with contextlib.suppress(DjangoNoSiteSelectedException):
+            args.append(
+                "--interface={0}".format(
+                    self.__plugin.getPreferences("Python3ConsoleType")
+                )
+            )
+            with contextlib.suppress(DjangoNoSiteSelectedError):
                 wd = self.__sitePath()
                 self.__adjustWorkingDirectory(args, wd)
                 started, pid = QProcess.startDetached(args[0], args[1:], wd)
                 if not started:
                     EricMessageBox.critical(
                         None,
-                        self.tr('Process Generation Error'),
-                        self.tr('The Django process could not be started.'))
-    
+                        self.tr("Process Generation Error"),
+                        self.tr("The Django process could not be started."),
+                    )
+
     def __sendTestEmail(self):
         """
         Private slot to send a test email through Django.
         """
         title = self.tr("Send Test Email")
-        
-        from .DjangoSendTestEmailDataDialog import (
-            DjangoSendTestEmailDataDialog
-        )
+
+        from .DjangoSendTestEmailDataDialog import DjangoSendTestEmailDataDialog
+
         dlg = DjangoSendTestEmailDataDialog(self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             managers, admins, recipients = dlg.getData()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2696,71 +2922,72 @@
             if admins:
                 args.append("--admins")
             args.extend(recipients)
-            
+
             try:
                 path = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 return
-            
+
             dia = DjangoDialog(
                 title,
                 linewrap=False,
                 msgSuccess=self.tr("Test Email sent successfully."),
-                msgError=self.tr("Test Email could not be sent.")
+                msgError=self.tr("Test Email could not be sent."),
             )
             res = dia.startProcess(args, path, False)
             if res:
                 dia.exec()
-    
+
     ##################################################################
     ## slots below implement caching functions
     ##################################################################
-    
+
     def __createCacheTables(self):
         """
         Private slot to create the tables for the SQL caching backend.
         """
         title = self.tr("Create Cache Tables")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("createcachetable")
         if self.__currentDatabase:
             args.append("--database={0}".format(self.__currentDatabase))
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("Cache tables created successfully."))
+            title, msgSuccess=self.tr("Cache tables created successfully.")
+        )
         res = dia.startProcess(args, wd)
         if res:
             dia.exec()
-    
+
     ##################################################################
     ## slots below implement testing functions
     ##################################################################
-    
+
     def __dumpData(self):
         """
         Private slot to dump the database data to a fixture.
         """
         title = self.tr("Dump Data")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         from .DjangoDumpdataDataDialog import DjangoDumpdataDataDialog
+
         dlg = DjangoDumpdataDataDialog(self, self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             appls, excls, dumpFormat, indent = dlg.getData()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2772,36 +2999,38 @@
             if self.__currentDatabase:
                 args.append("--database={0}".format(self.__currentDatabase))
             args += appls
-            
+
             if dumpFormat == "json":
                 fileFilters = self.tr("JSON Files (*.json)")
             elif dumpFormat == "xml":
                 fileFilters = self.tr("XML Files (*.xml)")
             elif dumpFormat == "yaml":
                 fileFilters = self.tr("YAML Files (*.yaml)")
-            
+
             dia = DjangoDialog(
-                title, fixed=True, linewrap=False, saveFilters=fileFilters)
+                title, fixed=True, linewrap=False, saveFilters=fileFilters
+            )
             res = dia.startProcess(args, wd, showCommand=False)
             if res:
                 dia.exec()
-    
+
     def __loadData(self):
         """
         Private slot to load data from fixture files.
         """
         title = self.tr("Load Data")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         from .DjangoLoaddataDataDialog import DjangoLoaddataDataDialog
+
         dlg = DjangoLoaddataDataDialog(self, self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             fixtures, excludes, appLabel, ignore = dlg.getData()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -2815,37 +3044,38 @@
             if self.__currentDatabase:
                 args.append("--database={0}".format(self.__currentDatabase))
             args += fixtures
-            
+
             dia = DjangoDialog(title)
             res = dia.startProcess(args, wd)
             if res:
                 dia.exec()
-    
+
     def __runTestSuite(self, deprecation=False):
         """
         Private slot to run the test suite for applications or the whole site.
-        
+
         @param deprecation flag indicating to test for deprecation warnings
         @type bool
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommandNoClose"))[1]
+            self.__plugin.getPreferences("ConsoleCommandNoClose")
+        )[1]
         if consoleCmd:
             try:
                 wd = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 return
-            
+
             from .DjangoTestDataDialog import DjangoTestDataDialog
+
             dlg = DjangoTestDataDialog(
-                self, self.__plugin.getPreferences("KeepTestDatabase"),
-                self.__ui)
+                self, self.__plugin.getPreferences("KeepTestDatabase"), self.__ui
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                labels, pattern, tags, excludeTags, keep, reverse = (
-                    dlg.getData())
-                
+                labels, pattern, tags, excludeTags, keep, reverse = dlg.getData()
+
                 self.__plugin.setPreferences("KeepTestDatabase", keep)
-                
+
                 args = Utilities.parseOptionString(consoleCmd)
                 args[0] = Utilities.getExecutablePath(args[0])
                 args.append(self.__getPythonExecutable())
@@ -2864,30 +3094,31 @@
                 if reverse:
                     args.append("--reverse")
                 args.extend(labels)
-                
+
                 self.__adjustWorkingDirectory(args, wd)
                 started, pid = QProcess.startDetached(args[0], args[1:], wd)
                 if not started:
                     EricMessageBox.critical(
                         None,
-                        self.tr('Process Generation Error'),
-                        self.tr('The Django process could not be started.'))
-    
+                        self.tr("Process Generation Error"),
+                        self.tr("The Django process could not be started."),
+                    )
+
     def __runTestServer(self):
         """
         Private slot to run a development server with data from a set of
         fixtures.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommand"))[1]
+            self.__plugin.getPreferences("ConsoleCommand")
+        )[1]
         if consoleCmd:
-            from .DjangoRunTestServerDataDialog import (
-                DjangoRunTestServerDataDialog
-            )
+            from .DjangoRunTestServerDataDialog import DjangoRunTestServerDataDialog
+
             dlg = DjangoRunTestServerDataDialog(self, self.__ui)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 fixtures = dlg.getData()
-                
+
                 args = Utilities.parseOptionString(consoleCmd)
                 args[0] = Utilities.getExecutablePath(args[0])
                 args.append(self.__getPythonExecutable())
@@ -2899,59 +3130,61 @@
                 if addr:
                     args.append("--addrport={0}".format(addr))
                 args += fixtures
-                
-                with contextlib.suppress(DjangoNoSiteSelectedException):
+
+                with contextlib.suppress(DjangoNoSiteSelectedError):
                     if Utilities.isWindowsPlatform():
                         serverProcStarted, pid = QProcess.startDetached(
-                            args[0], args[1:], self.__sitePath())
+                            args[0], args[1:], self.__sitePath()
+                        )
                     else:
                         if self.__testServerProc is not None:
                             self.__testServerProcFinished()
-                        
+
                         self.__testServerProc = QProcess()
                         self.__testServerProc.finished.connect(
-                            self.__serverProcFinished)
-                        self.__testServerProc.setWorkingDirectory(
-                            self.__sitePath())
+                            self.__serverProcFinished
+                        )
+                        self.__testServerProc.setWorkingDirectory(self.__sitePath())
                         self.__testServerProc.start(args[0], args[1:])
-                        serverProcStarted = (
-                            self.__testServerProc.waitForStarted())
+                        serverProcStarted = self.__testServerProc.waitForStarted()
                     if not serverProcStarted:
                         EricMessageBox.critical(
                             None,
-                            self.tr('Process Generation Error'),
-                            self.tr('The Django test server could not be'
-                                    ' started.'))
-    
+                            self.tr("Process Generation Error"),
+                            self.tr("The Django test server could not be" " started."),
+                        )
+
     def __testServerProcFinished(self):
         """
         Private slot connected to the finished signal of the test server.
         """
         if (
-            self.__testServerProc is not None and
-            self.__testServerProc.state() != QProcess.ProcessState.NotRunning
+            self.__testServerProc is not None
+            and self.__testServerProc.state() != QProcess.ProcessState.NotRunning
         ):
             self.__testServerProc.terminate()
             QTimer.singleShot(2000, self.__testServerProc.kill)
             self.__testServerProc.waitForFinished(3000)
         self.__testServerProc = None
-    
+
     ##################################################################
     ## slots below implement authorization functions
     ##################################################################
-    
+
     def __changePassword(self):
         """
         Private slot to change the password of a user.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommandNoClose"))[1]
+            self.__plugin.getPreferences("ConsoleCommandNoClose")
+        )[1]
         if consoleCmd:
             userName, ok = QInputDialog.getText(
                 self.__ui,
                 self.tr("Change Password"),
                 self.tr("Enter the name of the user:"),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and userName != "":
                 args = Utilities.parseOptionString(consoleCmd)
                 args[0] = Utilities.getExecutablePath(args[0])
@@ -2959,84 +3192,84 @@
                 args.append("manage.py")
                 args.append("changepassword")
                 args.append(userName)
-                with contextlib.suppress(DjangoNoSiteSelectedException):
+                with contextlib.suppress(DjangoNoSiteSelectedError):
                     wd = self.__sitePath()
                     self.__adjustWorkingDirectory(args, wd)
-                    started, pid = QProcess.startDetached(
-                        args[0], args[1:], wd)
+                    started, pid = QProcess.startDetached(args[0], args[1:], wd)
                     if not started:
                         EricMessageBox.critical(
                             None,
-                            self.tr('Process Generation Error'),
-                            self.tr('The Django process could not be'
-                                    ' started.'))
-    
+                            self.tr("Process Generation Error"),
+                            self.tr("The Django process could not be" " started."),
+                        )
+
     def __createSuperUser(self):
         """
         Private slot to create a super user account.
         """
         consoleCmd = self.__isSpawningConsole(
-            self.__plugin.getPreferences("ConsoleCommandNoClose"))[1]
+            self.__plugin.getPreferences("ConsoleCommandNoClose")
+        )[1]
         if consoleCmd:
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
             args.append("createsuperuser")
-            with contextlib.suppress(DjangoNoSiteSelectedException):
+            with contextlib.suppress(DjangoNoSiteSelectedError):
                 wd = self.__sitePath()
                 self.__adjustWorkingDirectory(args, wd)
                 started, pid = QProcess.startDetached(args[0], args[1:], wd)
                 if not started:
                     EricMessageBox.critical(
                         None,
-                        self.tr('Process Generation Error'),
-                        self.tr('The Django process could not be started.'))
-    
+                        self.tr("Process Generation Error"),
+                        self.tr("The Django process could not be started."),
+                    )
+
     ##################################################################
     ## slots below implement session functions
     ##################################################################
-    
+
     def __clearSessions(self):
         """
         Private slot to clear expired sessions.
         """
         title = self.tr("Clear Sessions")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("clearsessions")
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("Expired sessions cleared successfully."))
+            title, msgSuccess=self.tr("Expired sessions cleared successfully.")
+        )
         res = dia.startProcess(args, wd)
         if res:
             dia.exec()
-    
+
     ##################################################################
     ## slots below implement translation functions
     ##################################################################
-    
+
     def __getLocale(self, filename):
         """
         Private method to extract the locale out of a file name.
-        
+
         @param filename name of the file used for extraction
         @type str
         @return extracted locale or None
         @rtype str
         """
         if self.__ericProject.getTranslationPattern():
-            pattern = (
-                self.__ericProject.getTranslationPattern()
-                .replace("%language%", "(.*?)")
+            pattern = self.__ericProject.getTranslationPattern().replace(
+                "%language%", "(.*?)"
             )
             match = re.search(pattern, filename)
             if match is not None:
@@ -3046,13 +3279,13 @@
                 loc = None
         else:
             loc = None
-        
+
         return loc
-    
+
     def __normalizeList(self, filenames):
         """
         Private method to normalize a list of file names.
-        
+
         @param filenames list of file names to normalize
         @type list of str
         @return normalized file names
@@ -3064,13 +3297,13 @@
                 filename = filename.replace(".mo", ".po")
             if filename not in nfilenames:
                 nfilenames.append(filename)
-        
+
         return nfilenames
-    
+
     def __siteFilteredList(self, filenames):
         """
         Private method to filter a list of file names by site.
-        
+
         @param filenames list of file names to be filtered
         @type list of str
         @return file names belonging to the current site
@@ -3081,74 +3314,72 @@
         for filename in filenames:
             if site == "" or filename.startswith(site + os.sep):
                 nfilenames.append(filename)
-        
+
         return nfilenames
-    
+
     def __projectLanguageAdded(self, code):
         """
         Private slot handling the addition of a new language.
-        
+
         @param code language code of the new language
         @type str
         """
-        title = (
-            self.tr("Initializing message catalog for '{0}'")
-            .format(code)
-        )
-        
+        title = self.tr("Initializing message catalog for '{0}'").format(code)
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("makemessages")
         args.append("--locale={0}".format(code))
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr(
-                "\nMessage catalog initialized successfully."))
+            title, msgSuccess=self.tr("\nMessage catalog initialized successfully.")
+        )
         res = dia.startProcess(args, wd)
         if res:
             dia.exec()
-            
-            langFile = (
-                self.__ericProject.getTranslationPattern()
-                .replace("%language%", code)
+
+            langFile = self.__ericProject.getTranslationPattern().replace(
+                "%language%", code
             )
             self.__ericProject.appendFile(langFile)
-    
+
     def updateSelectedCatalogs(self, filenames):
         """
         Public method to update the message catalogs.
-        
+
         @param filenames list of file names
         @type list of str
         """
         title = self.tr("Updating message catalogs")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         argsLists = []
-        
-        for filename in self.__normalizeList(
-                self.__siteFilteredList(filenames)):
+
+        for filename in self.__normalizeList(self.__siteFilteredList(filenames)):
             locale = self.__getLocale(filename)
             if locale:
                 args = []
@@ -3158,45 +3389,44 @@
                 args.append("--no-obsolete")
                 args.append("--locale={0}".format(locale))
                 argsLists.append(args)
-        
+
         if len(argsLists) == 0:
             EricMessageBox.warning(
-                None,
-                title,
-                self.tr('No locales detected. Aborting...'))
+                None, title, self.tr("No locales detected. Aborting...")
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("\nMessage catalogs updated successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+        )
         res = dia.startBatchProcesses(argsLists, wd)
         if res:
             dia.exec()
-    
+
     def updateSelectedCatalogsWithObsolete(self, filenames):
         """
         Public method to update the message catalogs keeping obsolete messages.
-        
+
         @param filenames list of filenames
         @type list of str
         """
-        title = self.tr("Updating message catalogs (keeping obsolete"
-                        " messages)")
-        
+        title = self.tr("Updating message catalogs (keeping obsolete" " messages)")
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         argsLists = []
-        
-        for filename in self.__normalizeList(
-                self.__siteFilteredList(filenames)):
+
+        for filename in self.__normalizeList(self.__siteFilteredList(filenames)):
             locale = self.__getLocale(filename)
             if locale:
                 args = []
@@ -3205,110 +3435,113 @@
                 args.append("makemessages")
                 args.append("--locale={0}".format(locale))
                 argsLists.append(args)
-        
+
         if len(argsLists) == 0:
             EricMessageBox.warning(
-                None,
-                title,
-                self.tr('No locales detected. Aborting...'))
+                None, title, self.tr("No locales detected. Aborting...")
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("\nMessage catalogs updated successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+        )
         res = dia.startBatchProcesses(argsLists, wd)
         if res:
             dia.exec()
-    
+
     def updateCatalogs(self, filenames):
         """
         Public method to update the message catalogs.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """
         title = self.tr("Updating message catalogs")
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("makemessages")
         args.append("--all")
         args.append("--no-obsolete")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("\nMessage catalogs updated successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+        )
         res = dia.startProcess(args, wd)
         if res:
             dia.exec()
-    
+
     def updateCatalogsWithObsolete(self, filenames):
         """
         Public method to update the message catalogs keeping obsolete messages.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """
-        title = self.tr("Updating message catalogs (keeping obsolete"
-                        " messages)")
-        
+        title = self.tr("Updating message catalogs (keeping obsolete" " messages)")
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("makemessages")
         args.append("--all")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr("\nMessage catalogs updated successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+        )
         res = dia.startProcess(args, wd)
         if res:
             dia.exec()
-    
+
     def compileSelectedCatalogs(self, filenames):
         """
         Public method to update the message catalogs.
-        
+
         @param filenames list of filenames
         @type list of str
         """
         title = self.tr("Compiling message catalogs")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         argsLists = []
-        
-        for filename in self.__normalizeList(
-                self.__siteFilteredList(filenames)):
+
+        for filename in self.__normalizeList(self.__siteFilteredList(filenames)):
             locale = self.__getLocale(filename)
             if locale:
                 args = []
@@ -3319,72 +3552,71 @@
                 if self.__plugin.getPreferences("FuzzyTranslations"):
                     args.append("--use-fuzzy")
                 argsLists.append(args)
-        
+
         if len(argsLists) == 0:
             EricMessageBox.warning(
-                None,
-                title,
-                self.tr('No locales detected. Aborting...'))
+                None, title, self.tr("No locales detected. Aborting...")
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr(
-                "\nMessage catalogs compiled successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs compiled successfully.")
+        )
         res = dia.startBatchProcesses(argsLists, wd, mergedOutput=True)
         if res:
             dia.exec()
-            
+
             for entry in os.walk(self.__sitePath()):
                 for fileName in entry[2]:
                     fullName = os.path.join(entry[0], fileName)
-                    if fullName.endswith('.mo'):
+                    if fullName.endswith(".mo"):
                         self.__ericProject.appendFile(fullName)
-    
+
     def compileCatalogs(self, filenames):
         """
         Public method to compile the message catalogs.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """
         title = self.tr("Compiling message catalogs")
-        
+
         args = []
         args.append(self.__getPythonExecutable())
         args.append("manage.py")
         args.append("compilemessages")
         if self.__plugin.getPreferences("FuzzyTranslations"):
             args.append("--use-fuzzy")
-        
+
         try:
             wd = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             EricMessageBox.warning(
                 None,
                 title,
-                self.tr('No current site selected or no site created yet.'
-                        ' Aborting...'))
+                self.tr(
+                    "No current site selected or no site created yet." " Aborting..."
+                ),
+            )
             return
-        
+
         dia = DjangoDialog(
-            title,
-            msgSuccess=self.tr(
-                "\nMessage catalogs compiled successfully."))
+            title, msgSuccess=self.tr("\nMessage catalogs compiled successfully.")
+        )
         res = dia.startProcess(args, wd, mergedOutput=True)
         if res:
             dia.exec()
-            
+
             for entry in os.walk(self.__sitePath()):
                 for fileName in entry[2]:
                     fullName = os.path.join(entry[0], fileName)
-                    if fullName.endswith('.mo'):
+                    if fullName.endswith(".mo"):
                         self.__ericProject.appendFile(fullName)
-    
+
     def openPOEditor(self, poFile):
         """
         Public method to edit the given file in an external .po editor.
-        
+
         @param poFile name of the .po file
         @type str
         """
@@ -3392,33 +3624,37 @@
         if poFile.endswith(".po") and editor:
             try:
                 wd = self.__sitePath()
-            except DjangoNoSiteSelectedException:
+            except DjangoNoSiteSelectedError:
                 wd = ""
             started, pid = QProcess.startDetached(editor, [poFile], wd)
             if not started:
                 EricMessageBox.critical(
                     None,
-                    self.tr('Process Generation Error'),
-                    self.tr('The translations editor process ({0}) could'
-                            ' not be started.')
-                    .format(os.path.basename(editor)))
-    
+                    self.tr("Process Generation Error"),
+                    self.tr(
+                        "The translations editor process ({0}) could" " not be started."
+                    ).format(os.path.basename(editor)),
+                )
+
     ##################################################################
     ## slots below implement check functions
     ##################################################################
-    
+
     def __performCheck(self):
         """
         Private slot to inspect the project for common problems.
         """
         try:
             path = self.__sitePath()
-        except DjangoNoSiteSelectedException:
+        except DjangoNoSiteSelectedError:
             return
-        
+
         from .DjangoCheckOptionsDialog import DjangoCheckOptionsDialog
+
         dlg = DjangoCheckOptionsDialog(
-            self.__getPythonExecutable(), path, self.getRecentApplications(),
+            self.__getPythonExecutable(),
+            path,
+            self.getRecentApplications(),
             self.__plugin.getPreferences("CheckDeployMode"),
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -3427,7 +3663,7 @@
             if appsStr != "":
                 self.setMostRecentApplication(appsStr)
             apps = appsStr.split()
-            
+
             args = []
             args.append(self.__getPythonExecutable())
             args.append("manage.py")
@@ -3440,7 +3676,7 @@
                 if settingsFile:
                     args.append("--settings={0}".format(settingsFile))
             args += apps
-            
+
             dia = DjangoDialog(self.tr("Check Project"))
             res = dia.startProcess(args, path, mergedOutput=True)
             if res:

eric ide

mercurial