From dec76a19ed2ee1bf5c9baaf3da8ad6110a875c92 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 31 Aug 2018 16:13:01 +0200 Subject: [PATCH 1/4] Build models using reserved tags Contributes to CURA-5670 --- .../resources/qml/ToolboxDownloadsPage.qml | 2 +- plugins/Toolbox/src/Toolbox.py | 84 +++++++++++++++---- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml index 1089fcc51e..bcca02583d 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml @@ -30,7 +30,7 @@ ScrollView id: allPlugins width: parent.width heading: toolbox.viewCategory == "material" ? catalog.i18nc("@label", "Community Contributions") : catalog.i18nc("@label", "Community Plugins") - model: toolbox.viewCategory == "material" ? toolbox.authorsModel : toolbox.packagesModel + model: toolbox.viewCategory == "material" ? toolbox.materialsAvailableModel : toolbox.pluginsAvailableModel } ToolboxDownloadsGrid diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index c4205b8ed5..48219494bd 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -83,7 +83,7 @@ class Toolbox(QObject, Extension): "plugins_available": PackagesModel(self), "plugins_installed": PackagesModel(self), "materials_showcase": AuthorsModel(self), - "materials_available": PackagesModel(self), + "materials_available": AuthorsModel(self), "materials_installed": PackagesModel(self), "materials_generic": PackagesModel(self) } # type: Dict[str, ListModel] @@ -517,7 +517,7 @@ class Toolbox(QObject, Extension): @pyqtSlot(str, result = int) def getTotalNumberOfPackagesByAuthor(self, author_id: str) -> int: count = 0 - for package in self._metadata["materials_available"]: + for package in self._metadata["packages"]: if package["author"]["author_id"] == author_id: count += 1 return count @@ -624,24 +624,27 @@ class Toolbox(QObject, Extension): Logger.log("e", "Could not find the %s model.", type) break - # HACK: Eventually get rid of the code from here... - if type is "plugins_showcase" or type is "materials_showcase": - self._metadata["plugins_showcase"] = json_data["data"]["plugin"]["packages"] - self._models["plugins_showcase"].setMetadata(self._metadata["plugins_showcase"]) - self._metadata["materials_showcase"] = json_data["data"]["material"]["authors"] - self._models["materials_showcase"].setMetadata(self._metadata["materials_showcase"]) - else: - # ...until here. - # This hack arises for multiple reasons but the main - # one is because there are not separate API calls - # for different kinds of showcases. - self._metadata[type] = json_data["data"] - self._models[type].setMetadata(self._metadata[type]) + # HACK + do_not_handle = [ + "materials_available", + "materials_showcase", + "plugins_available", + "plugins_showcase", + ] + + # Do nothing because we'll handle these from the "packages" call + if type in do_not_handle: + return + + self._metadata[type] = json_data["data"] + self._models[type].setMetadata(self._metadata[type]) # Do some auto filtering # TODO: Make multiple API calls in the future to handle this if type is "packages": self._models[type].setFilter({"type": "plugin"}) + self.buildMaterialsModels() + self.buildPluginsModels() if type is "authors": self._models[type].setFilter({"package_types": "material"}) if type is "materials_generic": @@ -755,6 +758,10 @@ class Toolbox(QObject, Extension): def pluginsShowcaseModel(self) -> PackagesModel: return cast(PackagesModel, self._models["plugins_showcase"]) + @pyqtProperty(QObject, notify = metadataChanged) + def pluginsAvailableModel(self) -> PackagesModel: + return cast(PackagesModel, self._models["plugins_available"]) + @pyqtProperty(QObject, notify = metadataChanged) def pluginsInstalledModel(self) -> PackagesModel: return cast(PackagesModel, self._models["plugins_installed"]) @@ -763,6 +770,10 @@ class Toolbox(QObject, Extension): def materialsShowcaseModel(self) -> AuthorsModel: return cast(AuthorsModel, self._models["materials_showcase"]) + @pyqtProperty(QObject, notify = metadataChanged) + def materialsAvailableModel(self) -> AuthorsModel: + return cast(AuthorsModel, self._models["materials_available"]) + @pyqtProperty(QObject, notify = metadataChanged) def materialsInstalledModel(self) -> PackagesModel: return cast(PackagesModel, self._models["materials_installed"]) @@ -798,3 +809,46 @@ class Toolbox(QObject, Extension): return self._models[model_type].setFilter({}) self.filterChanged.emit() + + + # HACK(S): + # -------------------------------------------------------------------------- + def buildMaterialsModels(self) -> None: + + self._metadata["materials_showcase"] = [] + self._metadata["materials_available"] = [] + + processed_authors = [] + + for item in self._metadata["packages"]: + if item["package_type"] == "material": + + author = item["author"] + if author["author_id"] in processed_authors: + continue + + if "showcase" in item["tags"]: + self._metadata["materials_showcase"].append(author) + else: + self._metadata["materials_available"].append(author) + + processed_authors.append(author["author_id"]) + + self._models["materials_showcase"].setMetadata(self._metadata["materials_showcase"]) + self._models["materials_available"].setMetadata(self._metadata["materials_available"]) + + def buildPluginsModels(self) -> None: + + self._metadata["plugins_showcase"] = [] + self._metadata["plugins_available"] = [] + + for item in self._metadata["packages"]: + if item["package_type"] == "plugin": + + if "showcase" in item["tags"]: + self._metadata["plugins_showcase"].append(item) + else: + self._metadata["plugins_available"].append(item) + + self._models["plugins_showcase"].setMetadata(self._metadata["plugins_showcase"]) + self._models["plugins_available"].setMetadata(self._metadata["plugins_available"]) From 988b9059b9d7966cc1daae28561ea16cc24ff11b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 31 Aug 2018 16:55:03 +0200 Subject: [PATCH 2/4] Fix code-style Contributes to CURA-5670 --- plugins/Toolbox/src/Toolbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 48219494bd..52b00f5069 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -818,7 +818,7 @@ class Toolbox(QObject, Extension): self._metadata["materials_showcase"] = [] self._metadata["materials_available"] = [] - processed_authors = [] + processed_authors = [] # type: List[str] for item in self._metadata["packages"]: if item["package_type"] == "material": From bf1d3b964f87ad587f5cb2cb2c02ea5a3d167b35 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 3 Sep 2018 14:30:05 +0200 Subject: [PATCH 3/4] Skip loading a reply if it's not later handled. Contributes to CURA-5670. --- .../qml/ToolboxDownloadsGridTile.qml | 2 +- .../qml/ToolboxDownloadsShowcaseTile.qml | 2 +- plugins/Toolbox/src/Toolbox.py | 30 ++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index ebd4c006f8..4366db041c 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -9,7 +9,7 @@ import UM 1.1 as UM Item { - property int packageCount: (toolbox.viewCategory == "material" && model.type === undefined) ? toolbox.getTotalNumberOfPackagesByAuthor(model.id) : 1 + property int packageCount: (toolbox.viewCategory == "material" && model.type === undefined) ? toolbox.getTotalNumberOfMaterialPackagesByAuthor(model.id) : 1 property int installedPackages: (toolbox.viewCategory == "material" && model.type === undefined) ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) height: childrenRect.height Layout.alignment: Qt.AlignTop | Qt.AlignLeft diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml index 15d1ae302c..845bbe8f91 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml @@ -9,7 +9,7 @@ import UM 1.1 as UM Rectangle { - property int packageCount: toolbox.viewCategory == "material" ? toolbox.getTotalNumberOfPackagesByAuthor(model.id) : 1 + property int packageCount: toolbox.viewCategory == "material" ? toolbox.getTotalNumberOfMaterialPackagesByAuthor(model.id) : 1 property int installedPackages: toolbox.viewCategory == "material" ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) id: tileBase width: UM.Theme.getSize("toolbox_thumbnail_large").width + (2 * UM.Theme.getSize("default_lining").width) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 52b00f5069..615fc06ebc 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -514,10 +514,11 @@ class Toolbox(QObject, Extension): count += 1 return count + # This slot is only used to get the number of material packages by author, not any other type of packages. @pyqtSlot(str, result = int) - def getTotalNumberOfPackagesByAuthor(self, author_id: str) -> int: + def getTotalNumberOfMaterialPackagesByAuthor(self, author_id: str) -> int: count = 0 - for package in self._metadata["packages"]: + for package in self._metadata["materials_available"]: if package["author"]["author_id"] == author_id: count += 1 return count @@ -606,8 +607,21 @@ class Toolbox(QObject, Extension): self.resetDownload() return + # HACK: These request are not handled independently at this moment, but together from the "packages" call + do_not_handle = [ + "materials_available", + "materials_showcase", + "plugins_available", + "plugins_showcase", + ] + if reply.operation() == QNetworkAccessManager.GetOperation: for type, url in self._request_urls.items(): + + # HACK: Do nothing because we'll handle these from the "packages" call + if type in do_not_handle: + return + if reply.url() == url: if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) == 200: try: @@ -623,18 +637,6 @@ class Toolbox(QObject, Extension): if not self._models[type]: Logger.log("e", "Could not find the %s model.", type) break - - # HACK - do_not_handle = [ - "materials_available", - "materials_showcase", - "plugins_available", - "plugins_showcase", - ] - - # Do nothing because we'll handle these from the "packages" call - if type in do_not_handle: - return self._metadata[type] = json_data["data"] self._models[type].setMetadata(self._metadata[type]) From b638b2274a25070aad0450d0e1fe0c4103ee7d3c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 3 Sep 2018 15:12:52 +0200 Subject: [PATCH 4/4] Count only the material packages by author, not all packages. Contributes to CURA-5670. --- plugins/Toolbox/src/Toolbox.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 615fc06ebc..00864c6b4e 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -518,9 +518,10 @@ class Toolbox(QObject, Extension): @pyqtSlot(str, result = int) def getTotalNumberOfMaterialPackagesByAuthor(self, author_id: str) -> int: count = 0 - for package in self._metadata["materials_available"]: - if package["author"]["author_id"] == author_id: - count += 1 + for package in self._metadata["packages"]: + if package["package_type"] == "material": + if package["author"]["author_id"] == author_id: + count += 1 return count @pyqtSlot(str, result = bool)