Preferences/ConfigurationPages/EmailPage.py

changeset 6828
bb6667ea9ae7
parent 6825
e659bb96cdfa
diff -r e659bb96cdfa -r bb6667ea9ae7 Preferences/ConfigurationPages/EmailPage.py
--- a/Preferences/ConfigurationPages/EmailPage.py	Sat Mar 02 11:12:25 2019 +0100
+++ b/Preferences/ConfigurationPages/EmailPage.py	Sat Mar 02 17:33:58 2019 +0100
@@ -11,12 +11,16 @@
 
 import smtplib
 import socket
+import sys
 
 from PyQt5.QtCore import pyqtSlot, Qt
 from PyQt5.QtGui import QCursor
 from PyQt5.QtWidgets import QApplication
 
 from E5Gui import E5MessageBox
+from E5Gui.E5Application import e5App
+
+from E5Network.E5GoogleMailHelpers import getInstallCommand, RequiredPackages
 
 from .ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EmailPage import Ui_EmailPage
@@ -46,30 +50,7 @@
             " ".join(pipPackages))
         
         # set initial values
-        try:
-            import googleapiclient      # __IGNORE_WARNING__
-            self.googleMailCheckBox.setChecked(
-                Preferences.getUser("UseGoogleMailOAuth2"))
-            
-            from E5Network.E5GoogleMail import isClientSecretFileAvailable
-            if not isClientSecretFileAvailable():
-                # credentials file is not installed
-                self.googleMailCheckBox.setChecked(False)
-                self.googleMailCheckBox.setEnabled(False)
-                self.googleMailInfoLabel.setText(self.tr(
-                    "<p>The credentials file is not present. Has the Gmail API"
-                    " been enabled?</p>"))
-                Preferences.setUser("UseGoogleMailOAuth2", False)
-        except ImportError:
-            # missing libraries, disable Google Mail
-            self.googleMailCheckBox.setChecked(False)
-            self.googleMailCheckBox.setEnabled(False)
-            self.googleMailInfoLabel.setText(self.tr(
-                "<p>The Google Mail Client API is not installed."
-                " Use <code>{0}</code> to install it.</p>")
-                .format(self.__pipCommand))
-            self.googleHelpButton.setEnabled(False)
-            Preferences.setUser("UseGoogleMailOAuth2", False)
+        self.__checkGoogleMail()
         
         self.mailServerEdit.setText(Preferences.getUser("MailServer"))
         self.portSpin.setValue(Preferences.getUser("MailServerPort"))
@@ -87,7 +68,7 @@
             self.useSslButton.setChecked(True)
         else:
             self.noEncryptionButton.setChecked(True)
-        
+    
     def save(self):
         """
         Public slot to save the Email configuration.
@@ -290,10 +271,10 @@
                 from E5Network.E5GoogleMail import GoogleMailHelp
                 helpStr = GoogleMailHelp()
             except ImportError:
-                    helpStr = self.tr(
-                        "<p>The Google Mail Client API is not installed."
-                        " Use <code>{0}</code> to install it.</p>"
-                    ).format(self.__pipCommand)
+                helpStr = self.tr(
+                    "<p>The Google Mail Client API is not installed."
+                    " Use <code>{0}</code> to install it.</p>"
+                ).format(getInstallCommand())
             
             from E5Gui.E5SimpleHelpDialog import E5SimpleHelpDialog
             self.__helpDialog = E5SimpleHelpDialog(
@@ -301,6 +282,65 @@
                 helpStr=helpStr, parent=self)
         
         self.__helpDialog.show()
+    
+    @pyqtSlot()
+    def on_googleInstallButton_clicked(self):
+        """
+        Private slot to install the required packages for use of Google Mail.
+        """
+        pip = e5App().getObject("Pip")
+        pip.installPackages(RequiredPackages, interpreter=sys.executable)
+        self.__checkGoogleMail()
+    
+    @pyqtSlot()
+    def on_googleCheckAgainButton_clicked(self):
+        """
+        Private slot to check again the availability of Google Mail.
+        """
+        self.__checkGoogleMail()
+    
+    def __checkGoogleMail(self):
+        """
+        Private method to check the Google Mail availability and set the
+        widgets accordingly.
+        """
+        self.googleMailInfoLabel.hide()
+        self.googleInstallButton.show()
+        self.googleCheckAgainButton.show()
+        self.googleHelpButton.setEnabled(True)
+        self.googleMailCheckBox.setEnabled(True)
+        
+        try:
+            import E5Network.E5GoogleMail      # __IGNORE_WARNING__
+            from E5Network.E5GoogleMailHelpers import \
+                isClientSecretFileAvailable
+            
+            self.googleInstallButton.hide()
+            if not isClientSecretFileAvailable():
+                # secrets file is not installed
+                self.googleMailCheckBox.setChecked(False)
+                self.googleMailCheckBox.setEnabled(False)
+                self.googleMailInfoLabel.setText(self.tr(
+                    "<p>The client secrets file is not present."
+                    " Has the Gmail API been enabled?</p>"))
+                self.googleMailInfoLabel.show()
+                Preferences.setUser("UseGoogleMailOAuth2", False)
+            else:
+                self.googleMailCheckBox.setChecked(
+                    Preferences.getUser("UseGoogleMailOAuth2"))
+                self.googleMailInfoLabel.hide()
+                self.googleCheckAgainButton.hide()
+        except ImportError:
+            # missing libraries, disable Google Mail
+            self.googleMailCheckBox.setChecked(False)
+            self.googleMailCheckBox.setEnabled(False)
+            self.googleMailInfoLabel.setText(self.tr(
+                "<p>The Google Mail Client API is not installed."
+                " Use <code>{0}</code> to install it.</p>"
+            ).format(getInstallCommand()))
+            self.googleMailInfoLabel.show()
+            self.googleHelpButton.setEnabled(False)
+            Preferences.setUser("UseGoogleMailOAuth2", False)
 
 
 def create(dlg):

eric ide

mercurial