Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py

changeset 6412
d71b094845e7
parent 6411
7fd9b7ecbcfe
child 6645
ad476851d7e0
diff -r 7fd9b7ecbcfe -r d71b094845e7 Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py	Sat Jul 07 14:38:13 2018 +0200
+++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py	Sun Jul 08 13:05:23 2018 +0200
@@ -15,10 +15,16 @@
 
 import json
 
-from PyQt5.QtCore import QUrl, QByteArray
+from PyQt5.QtCore import QUrl, QByteArray, QTimer
+from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, \
+    QNetworkReply
 
 from E5Gui import E5MessageBox
 
+from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired
+
+from Globals import qVersionTuple
+
 from .TranslationEngine import TranslationEngine
 
 
@@ -46,10 +52,16 @@
         
         self.__ui = parent
         
+        self.__networkManager = QNetworkAccessManager(self)
+        self.__networkManager.proxyAuthenticationRequired.connect(
+            proxyAuthenticationRequired)
+        
         self.__availableTranslations = {}
         # dictionary of sets of available translations
         
-        self.__getTranslationModels()
+        self.__replies = []
+        
+        QTimer.singleShot(0, self.__getTranslationModels)
     
     def engineName(self):
         """
@@ -200,33 +212,64 @@
                  b"apikey:" + apiKey.encode("utf-8")).toBase64())
         ]
         
-        from ..TranslatorRequest import TranslatorRequest
-        requestObject = TranslatorRequest(self)
-        response, ok = requestObject.get(url, extraHeaders=extraHeaders)
-        if ok:
-            response = str(response, "utf-8", "replace")
-            try:
-                responseDict = json.loads(response)
-            except ValueError:
+        request = QNetworkRequest(url)
+        if qVersionTuple() >= (5, 6, 0):
+            request.setAttribute(QNetworkRequest.FollowRedirectsAttribute,
+                                 True)
+        if extraHeaders:
+            for name, value in extraHeaders:
+                request.setRawHeader(name, value)
+        reply = self.__networkManager.get(request)
+        reply.finished.connect(
+            lambda: self.__getTranslationModelsReplyFinished(reply))
+        self.__replies.append(reply)
+    
+    def __getTranslationModelsReplyFinished(self, reply):
+        """
+        Private slot handling the receipt of the available translations.
+        
+        @param reply reference to the network reply object
+        @type QNetworkReply
+        """
+        if reply in self.__replies:
+            self.__replies.remove(reply)
+            reply.deleteLater()
+            
+            if reply.error() != QNetworkReply.NoError:
+                errorStr = reply.errorString()
                 E5MessageBox.critical(
                     self.__ui,
                     self.tr("Error Getting Available Translations"),
-                    self.tr("Invalid response received")
+                    self.tr("The server sent an error indication.\n"
+                            "Error: {0}").format(errorStr)
                 )
                 return
-            
-            if "models" not in responseDict:
-                E5MessageBox.critical(
-                    self.__ui,
-                    self.tr("Error Getting Available Translations"),
-                    self.tr("No translation available.")
-                )
-                return
-            
-            for model in responseDict["models"]:
-                if model["status"] == "available":
-                    source = self.__adjustLanguageCode(model["source"])
-                    target = self.__adjustLanguageCode(model["target"])
-                    if source not in self.__availableTranslations:
-                        self.__availableTranslations[source] = set()
-                    self.__availableTranslations[source].add(target)
+            else:
+                response = str(reply.readAll(), "utf-8", "replace")
+                try:
+                    responseDict = json.loads(response)
+                except ValueError:
+                    E5MessageBox.critical(
+                        self.__ui,
+                        self.tr("Error Getting Available Translations"),
+                        self.tr("Invalid response received")
+                    )
+                    return
+                
+                if "models" not in responseDict:
+                    E5MessageBox.critical(
+                        self.__ui,
+                        self.tr("Error Getting Available Translations"),
+                        self.tr("No translation available.")
+                    )
+                    return
+                
+                for model in responseDict["models"]:
+                    if model["status"] == "available":
+                        source = self.__adjustLanguageCode(model["source"])
+                        target = self.__adjustLanguageCode(model["target"])
+                        if source not in self.__availableTranslations:
+                            self.__availableTranslations[source] = set()
+                        self.__availableTranslations[source].add(target)
+                
+                self.availableTranslationsLoaded.emit()

eric ide

mercurial