From 365c30fadb5923a0809a252b9925afce9251b6b8 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 21 Jan 2020 09:52:33 +0100 Subject: [PATCH 01/12] Added check to reevaluate dismissed incompatible packages (in case the package gets updated and has the correct SDK version) CURA-7090-addition --- .../Toolbox/src/CloudSync/CloudPackageChecker.py | 8 ++++++-- .../src/CloudSync/SubscribedPackagesModel.py | 13 ++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index 78d13f34fe..2246051fe4 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -43,15 +43,19 @@ class CloudPackageChecker(QObject): def _handleCompatibilityData(self, json_data) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in json_data] user_installed_packages = self._package_manager.getUserInstalledPackages() + + # We need to re-evaluate the dismissed packages + # (i.e. some package might got updated to the correct SDK version in the meantime, + # hence remove them from the Dismissed Incompatible list) + self._package_manager.reEvaluateDismissedPackages(json_data) user_dismissed_packages = self._package_manager.getDismissedPackages() if user_dismissed_packages: user_installed_packages += user_dismissed_packages # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages)) - self._model.setMetadata(json_data) self._model.addDiscrepancies(package_discrepancy) - self._model.initialize() + self._model.initialize(json_data) if not self._model.hasCompatiblePackages: return None diff --git a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py index 4a0f559748..833879a9fe 100644 --- a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py @@ -37,27 +37,22 @@ class SubscribedPackagesModel(ListModel): return True return False - # Sets the "is_compatible" to True for the given package, in memory - @pyqtSlot() def dismissPackage(self, package_id: str) -> None: package = self.find(key="package_id", value=package_id) - if package != -1: + if package != -1: # find() returns -1 if it doesn't finds what is looking for self.setProperty(package, property="is_dismissed", value=True) Logger.debug("Package {} has been dismissed".format(package_id)) - def setMetadata(self, data: List[Dict[str, List[Any]]]) -> None: - self._metadata = data - def addDiscrepancies(self, discrepancy: List[str]) -> None: self._discrepancies = discrepancy def getCompatiblePackages(self): - return [x for x in self._items if x["is_compatible"]] + return [package for package in self._items if package["is_compatible"]] - def initialize(self) -> None: + def initialize(self, json_data: List[Dict[str, List[Any]]]) -> None: self._items.clear() - for item in self._metadata: + for item in json_data: if item["package_id"] not in self._discrepancies: continue package = { From 8abaa600522dd21a9f2aa5e987ef0fd094e2cd17 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 21 Jan 2020 11:24:31 +0100 Subject: [PATCH 02/12] Passed the sdk_version to the reevalute() function CURA-7090 --- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 8 +++++--- plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index 2246051fe4..cadb3435fc 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -8,11 +8,12 @@ from UM import i18nCatalog from UM.Logger import Logger from UM.Message import Message from UM.Signal import Signal -from cura.CuraApplication import CuraApplication +from cura.CuraApplication import CuraApplication, ApplicationMetadata from ..CloudApiModel import CloudApiModel from .SubscribedPackagesModel import SubscribedPackagesModel from ..UltimakerCloudScope import UltimakerCloudScope +from typing import List, Dict, Any class CloudPackageChecker(QObject): def __init__(self, application: CuraApplication) -> None: @@ -25,6 +26,7 @@ class CloudPackageChecker(QObject): self._application.initializationFinished.connect(self._onAppInitialized) self._i18n_catalog = i18nCatalog("cura") + self._sdk_version = ApplicationMetadata.CuraSDKVersion # This is a plugin, so most of the components required are not ready when # this is initialized. Therefore, we wait until the application is ready. @@ -40,14 +42,14 @@ class CloudPackageChecker(QObject): if self._application.getCuraAPI().account.isLoggedIn: self._getUserPackages() - def _handleCompatibilityData(self, json_data) -> None: + def _handleCompatibilityData(self, json_data: List[Dict[str, List[Any]]]) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in json_data] user_installed_packages = self._package_manager.getUserInstalledPackages() # We need to re-evaluate the dismissed packages # (i.e. some package might got updated to the correct SDK version in the meantime, # hence remove them from the Dismissed Incompatible list) - self._package_manager.reEvaluateDismissedPackages(json_data) + self._package_manager.reEvaluateDismissedPackages(json_data, self._sdk_version) user_dismissed_packages = self._package_manager.getDismissedPackages() if user_dismissed_packages: user_installed_packages += user_dismissed_packages diff --git a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py index 833879a9fe..270f0a2b01 100644 --- a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py @@ -47,7 +47,7 @@ class SubscribedPackagesModel(ListModel): def addDiscrepancies(self, discrepancy: List[str]) -> None: self._discrepancies = discrepancy - def getCompatiblePackages(self): + def getCompatiblePackages(self) -> List[str]: return [package for package in self._items if package["is_compatible"]] def initialize(self, json_data: List[Dict[str, List[Any]]]) -> None: From e7ed93c132ea05a238526bb3ab48308aa38b404b Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 21 Jan 2020 14:51:53 +0100 Subject: [PATCH 03/12] fixed typing CURA-7090 --- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 2 +- plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index cadb3435fc..f631a81fb2 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -42,7 +42,7 @@ class CloudPackageChecker(QObject): if self._application.getCuraAPI().account.isLoggedIn: self._getUserPackages() - def _handleCompatibilityData(self, json_data: List[Dict[str, List[Any]]]) -> None: + def _handleCompatibilityData(self, json_data: List[Dict[str, Any]]) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in json_data] user_installed_packages = self._package_manager.getUserInstalledPackages() diff --git a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py index 270f0a2b01..fd5eae254d 100644 --- a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py @@ -47,10 +47,10 @@ class SubscribedPackagesModel(ListModel): def addDiscrepancies(self, discrepancy: List[str]) -> None: self._discrepancies = discrepancy - def getCompatiblePackages(self) -> List[str]: + def getCompatiblePackages(self) -> List[Dict[str, Any]]: return [package for package in self._items if package["is_compatible"]] - def initialize(self, json_data: List[Dict[str, List[Any]]]) -> None: + def initialize(self, json_data: List[Dict[str, Any]]) -> None: self._items.clear() for item in json_data: if item["package_id"] not in self._discrepancies: From 5c498de1e47f9d413dd007cc2d309017fa6ab982 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 21 Jan 2020 15:07:11 +0100 Subject: [PATCH 04/12] Use meaningful variable name && some TODOs for later. CURA-7090 --- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index f631a81fb2..ee068e6115 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -42,24 +42,24 @@ class CloudPackageChecker(QObject): if self._application.getCuraAPI().account.isLoggedIn: self._getUserPackages() - def _handleCompatibilityData(self, json_data: List[Dict[str, Any]]) -> None: - user_subscribed_packages = [plugin["package_id"] for plugin in json_data] + def _handleCompatibilityData(self, subscribed_packages_payload: List[Dict[str, Any]]) -> None: + user_subscribed_packages = [plugin["package_id"] for plugin in subscribed_packages_payload] user_installed_packages = self._package_manager.getUserInstalledPackages() # We need to re-evaluate the dismissed packages # (i.e. some package might got updated to the correct SDK version in the meantime, # hence remove them from the Dismissed Incompatible list) - self._package_manager.reEvaluateDismissedPackages(json_data, self._sdk_version) + self._package_manager.reEvaluateDismissedPackages(subscribed_packages_payload, self._sdk_version) user_dismissed_packages = self._package_manager.getDismissedPackages() if user_dismissed_packages: user_installed_packages += user_dismissed_packages # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages)) - self._model.addDiscrepancies(package_discrepancy) - self._model.initialize(json_data) + self._model.addDiscrepancies(package_discrepancy) # TODO: Move these two lines below, under if package_discrepancy: + self._model.initialize(subscribed_packages_payload) - if not self._model.hasCompatiblePackages: + if not self._model.hasCompatiblePackages: # TODO: Remove these two lines... return None if package_discrepancy: From ae494110ba60e506d8d3aae02a40c18c2e758b3b Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 11:28:36 +0100 Subject: [PATCH 05/12] Removed unnecessary line (because we still want to show the Compatability Dialog even if there are only Incompatible packages) CURA-7090 --- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index ee068e6115..6e9409705d 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -59,9 +59,6 @@ class CloudPackageChecker(QObject): self._model.addDiscrepancies(package_discrepancy) # TODO: Move these two lines below, under if package_discrepancy: self._model.initialize(subscribed_packages_payload) - if not self._model.hasCompatiblePackages: # TODO: Remove these two lines... - return None - if package_discrepancy: self._handlePackageDiscrepancies() From 7ee8270b2e5431f645cad7c585e9a02f6988b731 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 13:51:49 +0100 Subject: [PATCH 06/12] Added the mechanism to dismiss all Incompatible packages when the Compatibility Dialog is closed CURA-7090 --- plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py | 4 +++- plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py index f6b5622aad..78587117a0 100644 --- a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py +++ b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py @@ -36,5 +36,7 @@ class DiscrepanciesPresenter(QObject): def _onConfirmClicked(self, model: SubscribedPackagesModel) -> None: # For now, all compatible packages presented to the user should be installed. # Later, we might remove items for which the user unselected the package + if model.getIncompatiblePackages(): + self._package_manager.dismissAllIncompatiblePackages(model.getIncompatiblePackages()) model.setItems(model.getCompatiblePackages()) - self.packageMutations.emit(model) + self.packageMutations.emit(model) # #### proveri sho e ova??? diff --git a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py index fd5eae254d..dc684a11a7 100644 --- a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py @@ -50,9 +50,12 @@ class SubscribedPackagesModel(ListModel): def getCompatiblePackages(self) -> List[Dict[str, Any]]: return [package for package in self._items if package["is_compatible"]] - def initialize(self, json_data: List[Dict[str, Any]]) -> None: + def getIncompatiblePackages(self) -> List[str]: + return [package["package_id"] for package in self._items if not package["is_compatible"]] + + def initialize(self, subscribed_packages_payload: List[Dict[str, Any]]) -> None: self._items.clear() - for item in json_data: + for item in subscribed_packages_payload: if item["package_id"] not in self._discrepancies: continue package = { From 05e17843c6bd6a24a4ebb61bd6efe5c6914c637b Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 13:56:59 +0100 Subject: [PATCH 07/12] Removed previous variants of the dismiss incompatible package functionality CURA-7090 --- .../qml/dialogs/CompatibilityDialog.qml | 20 ------------------- .../src/CloudSync/DiscrepanciesPresenter.py | 5 ----- .../src/CloudSync/SubscribedPackagesModel.py | 7 ------- 3 files changed, 32 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index 32b4da4823..84f69d8d4e 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -125,26 +125,6 @@ UM.Dialog{ color: UM.Theme.getColor("text") elide: Text.ElideRight } - UM.TooltipArea - { - width: childrenRect.width; - height: childrenRect.height; - text: catalog.i18nc("@info:tooltip", "Dismisses the package and won't be shown in this dialog anymore") - anchors.right: parent.right - anchors.verticalCenter: packageIcon.verticalCenter - Label - { - text: "(Dismiss)" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text") - MouseArea - { - cursorShape: Qt.PointingHandCursor - anchors.fill: parent - onClicked: handler.dismissIncompatiblePackage(subscribedPackagesModel, model.package_id) - } - } - } } } } diff --git a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py index 78587117a0..d5c6e38b85 100644 --- a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py +++ b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py @@ -28,11 +28,6 @@ class DiscrepanciesPresenter(QObject): assert self._dialog self._dialog.accepted.connect(lambda: self._onConfirmClicked(model)) - @pyqtSlot("QVariant", str) - def dismissIncompatiblePackage(self, model: SubscribedPackagesModel, package_id: str) -> None: - model.dismissPackage(package_id) # update the model to update the view - self._package_manager.dismissPackage(package_id) # adds this package_id as dismissed in the user config file - def _onConfirmClicked(self, model: SubscribedPackagesModel) -> None: # For now, all compatible packages presented to the user should be installed. # Later, we might remove items for which the user unselected the package diff --git a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py index dc684a11a7..614d397d91 100644 --- a/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py @@ -37,13 +37,6 @@ class SubscribedPackagesModel(ListModel): return True return False - @pyqtSlot() - def dismissPackage(self, package_id: str) -> None: - package = self.find(key="package_id", value=package_id) - if package != -1: # find() returns -1 if it doesn't finds what is looking for - self.setProperty(package, property="is_dismissed", value=True) - Logger.debug("Package {} has been dismissed".format(package_id)) - def addDiscrepancies(self, discrepancy: List[str]) -> None: self._discrepancies = discrepancy From d82940534743982fb4d15bb9242acca3ac648a38 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 14:54:12 +0100 Subject: [PATCH 08/12] Update plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py --- plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py index d5c6e38b85..3dc46f71de 100644 --- a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py +++ b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py @@ -34,4 +34,4 @@ class DiscrepanciesPresenter(QObject): if model.getIncompatiblePackages(): self._package_manager.dismissAllIncompatiblePackages(model.getIncompatiblePackages()) model.setItems(model.getCompatiblePackages()) - self.packageMutations.emit(model) # #### proveri sho e ova??? + self.packageMutations.emit(model) From 38c7d80f82b7a91ec59e57760419e0a53db7b336 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 15:39:58 +0100 Subject: [PATCH 09/12] Refactored the onConfirmClicked function. Added the ability to auto-dismiss the incompatible packages. Changed the button text depending on the displayed list --- .../resources/qml/dialogs/CompatibilityDialog.qml | 4 +++- .../Toolbox/src/CloudSync/DiscrepanciesPresenter.py | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index 84f69d8d4e..73a1b7ec18 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -20,6 +20,8 @@ UM.Dialog{ maximumHeight: minimumHeight margin: 0 + property string buttonText: subscribedPackagesModel.hasIncompatiblePackages && !subscribedPackagesModel.hasCompatiblePackages ? "Dismiss" : "Next" + Rectangle { id: root @@ -138,7 +140,7 @@ UM.Dialog{ anchors.bottom: parent.bottom anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").height - text: catalog.i18nc("@button", "Next") + text: catalog.i18nc("@button", buttonText) onClicked: accept() leftPadding: UM.Theme.getSize("dialog_primary_button_padding").width rightPadding: UM.Theme.getSize("dialog_primary_button_padding").width diff --git a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py index d5c6e38b85..950d6c57c1 100644 --- a/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py +++ b/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py @@ -29,9 +29,12 @@ class DiscrepanciesPresenter(QObject): self._dialog.accepted.connect(lambda: self._onConfirmClicked(model)) def _onConfirmClicked(self, model: SubscribedPackagesModel) -> None: - # For now, all compatible packages presented to the user should be installed. - # Later, we might remove items for which the user unselected the package + # If there are incompatible packages - automatically dismiss them if model.getIncompatiblePackages(): self._package_manager.dismissAllIncompatiblePackages(model.getIncompatiblePackages()) - model.setItems(model.getCompatiblePackages()) - self.packageMutations.emit(model) # #### proveri sho e ova??? + + # For now, all compatible packages presented to the user should be installed. + # Later, we might remove items for which the user unselected the package + if model.getCompatiblePackages(): + model.setItems(model.getCompatiblePackages()) + self.packageMutations.emit(model) # #### proveri sho e ova??? From 537891d80b9af4c6ba9110724db8e55784f6b589 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 24 Jan 2020 16:05:35 +0100 Subject: [PATCH 10/12] Further improvements and refactors to the CloudPackageChecker --- .../src/CloudSync/CloudPackageChecker.py | 71 +++++++++---------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index 6e9409705d..8b20fe93ad 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -32,7 +32,6 @@ class CloudPackageChecker(QObject): # this is initialized. Therefore, we wait until the application is ready. def _onAppInitialized(self) -> None: self._package_manager = self._application.getPackageManager() - # initial check self._fetchUserSubscribedPackages() # check again whenever the login state changes @@ -40,7 +39,33 @@ class CloudPackageChecker(QObject): def _fetchUserSubscribedPackages(self) -> None: if self._application.getCuraAPI().account.isLoggedIn: - self._getUserPackages() + self._getUserSubscribedPackages() + + def _getUserSubscribedPackages(self) -> None: + Logger.log("d", "Requesting subscribed packages metadata from server.") + url = CloudApiModel.api_url_user_packages + self._application.getHttpRequestManager().get(url, + callback = self._onUserPackagesRequestFinished, + error_callback = self._onUserPackagesRequestFinished, + scope = self._scope) + + def _onUserPackagesRequestFinished(self, reply: "QNetworkReply", error: Optional["QNetworkReply.NetworkError"] = None) -> None: + if error is not None or reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: + Logger.log("w", + "Requesting user packages failed, response code %s while trying to connect to %s", + reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), reply.url()) + return + + try: + json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) + # Check for errors: + if "errors" in json_data: + for error in json_data["errors"]: + Logger.log("e", "%s", error["title"]) + return + self._handleCompatibilityData(json_data["data"]) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received invalid JSON for user subscribed packages from the Web Marketplace") def _handleCompatibilityData(self, subscribed_packages_payload: List[Dict[str, Any]]) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in subscribed_packages_payload] @@ -53,13 +78,12 @@ class CloudPackageChecker(QObject): user_dismissed_packages = self._package_manager.getDismissedPackages() if user_dismissed_packages: user_installed_packages += user_dismissed_packages - # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace + + # We check if there are packages installed in Web Marketplace but not in Cura marketplace package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages)) - - self._model.addDiscrepancies(package_discrepancy) # TODO: Move these two lines below, under if package_discrepancy: - self._model.initialize(subscribed_packages_payload) - if package_discrepancy: + self._model.addDiscrepancies(package_discrepancy) + self._model.initialize(subscribed_packages_payload) self._handlePackageDiscrepancies() def _handlePackageDiscrepancies(self) -> None: @@ -79,35 +103,4 @@ class CloudPackageChecker(QObject): def _onSyncButtonClicked(self, sync_message: Message, sync_message_action: str) -> None: sync_message.hide() - self.discrepancies.emit(self._model) - - def _getUserPackages(self) -> None: - Logger.log("d", "Requesting subscribed packages metadata from server.") - url = CloudApiModel.api_url_user_packages - - self._application.getHttpRequestManager().get(url, - callback = self._onUserPackagesRequestFinished, - error_callback = self._onUserPackagesRequestFinished, - scope = self._scope) - - def _onUserPackagesRequestFinished(self, - reply: "QNetworkReply", - error: Optional["QNetworkReply.NetworkError"] = None) -> None: - if error is not None or reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: - Logger.log("w", - "Requesting user packages failed, response code %s while trying to connect to %s", - reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), reply.url()) - return - - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - - # Check for errors: - if "errors" in json_data: - for error in json_data["errors"]: - Logger.log("e", "%s", error["title"]) - return - - self._handleCompatibilityData(json_data["data"]) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received invalid JSON for user packages") + self.discrepancies.emit(self._model) \ No newline at end of file From aa2c612925fc15066a07393af456208130d6797d Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Mon, 27 Jan 2020 13:25:29 +0100 Subject: [PATCH 11/12] PR review changes --- plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml | 4 ++-- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index 73a1b7ec18..7c0b50c655 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -20,7 +20,7 @@ UM.Dialog{ maximumHeight: minimumHeight margin: 0 - property string buttonText: subscribedPackagesModel.hasIncompatiblePackages && !subscribedPackagesModel.hasCompatiblePackages ? "Dismiss" : "Next" + property string actionButtonText: subscribedPackagesModel.hasIncompatiblePackages && !subscribedPackagesModel.hasCompatiblePackages ? "Dismiss" : "Next" Rectangle { @@ -140,7 +140,7 @@ UM.Dialog{ anchors.bottom: parent.bottom anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").height - text: catalog.i18nc("@button", buttonText) + text: catalog.i18nc("@button", actionButtonText) onClicked: accept() leftPadding: UM.Theme.getSize("dialog_primary_button_padding").width rightPadding: UM.Theme.getSize("dialog_primary_button_padding").width diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index 8b20fe93ad..a14341a4b7 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -42,7 +42,7 @@ class CloudPackageChecker(QObject): self._getUserSubscribedPackages() def _getUserSubscribedPackages(self) -> None: - Logger.log("d", "Requesting subscribed packages metadata from server.") + Logger.debug("Requesting subscribed packages metadata from server.") url = CloudApiModel.api_url_user_packages self._application.getHttpRequestManager().get(url, callback = self._onUserPackagesRequestFinished, From a08bea1376ae098d9ee17cca515b6c5c4387ec6a Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Mon, 27 Jan 2020 14:00:47 +0100 Subject: [PATCH 12/12] String translate improvements CURA-7090 --- plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index 7c0b50c655..f0df441f1d 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -20,7 +20,7 @@ UM.Dialog{ maximumHeight: minimumHeight margin: 0 - property string actionButtonText: subscribedPackagesModel.hasIncompatiblePackages && !subscribedPackagesModel.hasCompatiblePackages ? "Dismiss" : "Next" + property string actionButtonText: subscribedPackagesModel.hasIncompatiblePackages && !subscribedPackagesModel.hasCompatiblePackages ? catalog.i18nc("@button", "Dismiss") : catalog.i18nc("@button", "Next") Rectangle { @@ -140,7 +140,7 @@ UM.Dialog{ anchors.bottom: parent.bottom anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").height - text: catalog.i18nc("@button", actionButtonText) + text: actionButtonText onClicked: accept() leftPadding: UM.Theme.getSize("dialog_primary_button_padding").width rightPadding: UM.Theme.getSize("dialog_primary_button_padding").width