diff -r 5aac667c4f0f -r b73e9af0d496 ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py --- a/ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py Mon Nov 23 18:11:28 2020 +0100 +++ b/ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py Mon Nov 23 19:50:07 2020 +0100 @@ -68,7 +68,37 @@ self.__configurePyBabel) self.actions.append(self.pybabelConfigAct) - # TODO: add action to install flask-babel + self.pybabelInstallAct = E5Action( + self.tr('Install flask-babel'), + self.tr('&Install flask-babel'), + 0, 0, + self, 'flask_install_pybabel') + self.pybabelInstallAct.setStatusTip(self.tr( + 'Installs the flask-babel extension into the configured' + ' environment')) + self.pybabelInstallAct.setWhatsThis(self.tr( + """<b>Install flask-babel</b>""" + """<p>Installs the flask-babel extension into the configured""" + """ environment using the pip interface.</p>""" + )) + self.pybabelInstallAct.triggered.connect( + self.__installFlaskBabel) + self.actions.append(self.pybabelInstallAct) + + self.pybabelAvailabilityAct = E5Action( + self.tr('Check flask-babel Availability'), + self.tr('&Check flask-babel Availability'), + 0, 0, + self, 'flask_check_pybabel') + self.pybabelAvailabilityAct.setStatusTip(self.tr( + 'Check the availability of the flask-babel extension')) + self.pybabelAvailabilityAct.setWhatsThis(self.tr( + """<b>Check flask-babel Availability</b>""" + """<p>Check the availability of the flask-babel extension.</p>""" + )) + self.pybabelAvailabilityAct.triggered.connect( + self.__checkAvailability) + self.actions.append(self.pybabelAvailabilityAct) def initMenu(self): """ @@ -81,6 +111,9 @@ menu.setTearOffEnabled(True) menu.addAction(self.pybabelConfigAct) + menu.addSeparator() + menu.addAction(self.pybabelAvailabilityAct) + menu.addAction(self.pybabelInstallAct) return menu @@ -171,7 +204,7 @@ self.__project.setCapability("pybabel", available) self.pybabelConfigAct.setEnabled(available) - # TODO: disable install action, if flask-babel is available + self.pybabelInstallAct.setEnabled(not available) ################################################################## ## slots and methods below implement general functionality @@ -303,6 +336,46 @@ ) return False + @pyqtSlot() + def __installFlaskBabel(self): + """ + Private slot to install the flask-babel extension into the configured + environment. + """ + language = self.__e5project.getProjectLanguage() + if language == "Python3": + venvName = self.__plugin.getPreferences( + "VirtualEnvironmentNamePy3") + else: + venvName = "" + if venvName: + interpreter = self.__project.getFullCommand("python") + pip = e5App().getObject("Pip") + pip.installPackages(["flask-babel"], interpreter=interpreter) + self.determineCapability() + else: + E5MessageBox.critical( + None, + self.tr("Install flask-babel"), + self.tr("The 'flask-babel' extension could not be installed" + " because no virtual environment has been" + " configured.")) + + @pyqtSlot() + def __checkAvailability(self): + """ + Private slot to check the availability of the 'flask-babel' extension. + """ + self.determineCapability() + if self.__project.hasCapability("pybabel"): + msg = self.tr("The 'flask-babel' extension is installed.") + else: + msg = self.tr("The 'flask-babel' extension is not installed.") + E5MessageBox.information( + None, + self.tr("flask-babel Availability"), + msg) + def __getLocale(self, filename): """ Private method to extract the locale out of a file name.