--- 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()