Refactored most of the code into separate functions

CURA-7038
This commit is contained in:
Dimitriovski 2019-12-23 16:58:44 +01:00
parent bd8c1e4c96
commit 4375118a9f
No known key found for this signature in database
GPG key ID: 4E62757E2B0D304D
2 changed files with 44 additions and 112 deletions

View file

@ -1,17 +1,9 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import re from PyQt5.QtCore import Qt
from typing import Dict
from PyQt5.QtCore import Qt, pyqtProperty
from UM.Logger import Logger
from UM.Qt.ListModel import ListModel from UM.Qt.ListModel import ListModel
from .ConfigsModel import ConfigsModel
from UM.PluginRegistry import PluginRegistry from UM.PluginRegistry import PluginRegistry
## Model that holds Cura packages. By setting the filter property the instances held by this model can be changed. ## Model that holds Cura packages. By setting the filter property the instances held by this model can be changed.
@ -19,32 +11,10 @@ class SubscribedPackagesModel(ListModel):
def __init__(self, parent = None): def __init__(self, parent = None):
super().__init__(parent) super().__init__(parent)
self.addRoleName(Qt.UserRole + 1, "name") self.addRoleName(Qt.UserRole + 1, "name")
self.addRoleName(Qt.UserRole + 2, "icon_url") self.addRoleName(Qt.UserRole + 2, "icon_url")
self.addRoleName(Qt.UserRole + 3, "is_compatible") self.addRoleName(Qt.UserRole + 3, "is_compatible")
def update(self): def update(self):
# items1 = []
# items2 = []
toolbox = PluginRegistry.getInstance().getPluginObject("Toolbox") toolbox = PluginRegistry.getInstance().getPluginObject("Toolbox")
# print("Compatible: {}".format(toolbox.subscribed_compatible_packages))
# print("Incompatible: {}".format(toolbox.subscribed_incompatible_packages))
# for incompatible in toolbox.subscribed_incompatible_packages:
# items1.append({
# "name": incompatible.package_id,
# "icon_url": incompatible.icon_url
# })
#
# for compatible in toolbox.subscribed_compatible_packages:
# items2.append({
# "name": compatible.package_id,
# "icon_url": compatible.icon_url
# })
print("self.subscribed_packages: {}".format(toolbox.subscribed_packages))
# final_list = items1 + items2
self.setItems(toolbox.subscribed_packages) self.setItems(toolbox.subscribed_packages)
# self.setItems(final_list)

View file

@ -5,6 +5,7 @@ import json
import os import os
import tempfile import tempfile
import platform import platform
import functools
from typing import cast, Any, Dict, List, Set, TYPE_CHECKING, Tuple, Optional, Union from typing import cast, Any, Dict, List, Set, TYPE_CHECKING, Tuple, Optional, Union
from PyQt5.QtCore import QUrl, QObject, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtCore import QUrl, QObject, pyqtProperty, pyqtSignal, pyqtSlot
@ -26,8 +27,6 @@ from .AuthorsModel import AuthorsModel
from .PackagesModel import PackagesModel from .PackagesModel import PackagesModel
from .SubscribedPackagesModel import SubscribedPackagesModel from .SubscribedPackagesModel import SubscribedPackagesModel
from PyQt5.QtQml import qmlRegisterType
if TYPE_CHECKING: if TYPE_CHECKING:
from cura.Settings.GlobalStack import GlobalStack from cura.Settings.GlobalStack import GlobalStack
@ -41,9 +40,6 @@ class Toolbox(QObject, Extension):
self._application = application # type: CuraApplication self._application = application # type: CuraApplication
# self._application.qm
# qmlRegisterType(Toolbox, "Cura", 1, 6, "Toolbox")
self._sdk_version = ApplicationMetadata.CuraSDKVersion # type: Union[str, int] self._sdk_version = ApplicationMetadata.CuraSDKVersion # type: Union[str, int]
self._cloud_api_version = UltimakerCloudAuthentication.CuraCloudAPIVersion # type: str self._cloud_api_version = UltimakerCloudAuthentication.CuraCloudAPIVersion # type: str
self._cloud_api_root = UltimakerCloudAuthentication.CuraCloudAPIRoot # type: str self._cloud_api_root = UltimakerCloudAuthentication.CuraCloudAPIRoot # type: str
@ -63,8 +59,6 @@ class Toolbox(QObject, Extension):
self._old_plugin_ids = set() # type: Set[str] self._old_plugin_ids = set() # type: Set[str]
self._old_plugin_metadata = dict() # type: Dict[str, Dict[str, Any]] self._old_plugin_metadata = dict() # type: Dict[str, Dict[str, Any]]
# self.subscribed_compatible_packages = [] # type: List[str]
# self.subscribed_incompatible_packages = [] # type: List[str]
self.subscribed_packages = [] # type: List[Dict[str, str]] self.subscribed_packages = [] # type: List[Dict[str, str]]
# The responses as given by the server parsed to a list. # The responses as given by the server parsed to a list.
@ -689,76 +683,7 @@ class Toolbox(QObject, Extension):
packages = set([pkg["package_id"] for pkg in self._server_response_data[response_type]]) packages = set([pkg["package_id"] for pkg in self._server_response_data[response_type]])
self._package_manager.setPackagesWithUpdate(packages) self._package_manager.setPackagesWithUpdate(packages)
elif response_type == "subscribed_packages": elif response_type == "subscribed_packages":
self._checkCompatibilities(json_data["data"])
# import collections
# Package = collections.namedtuple("Package", ["package_id", "icon_url", "sdk_versions", "is_compatible"])
# Package.__new__.__defaults__ = (None, ) * len(Package._fields)
# There is not always an ICON_URL in the response payload !
# user_subscribed = [Package(plugin['package_id'], plugin.get("icon_url", ""), plugin['sdk_versions']) for plugin in json_data["data"]]
user_subscribed_list = [plugin["package_id"] for plugin in json_data["data"]]
all_subscribed_packages = []
self.subscribed_packages.clear()
for package in json_data["data"]:
packagex = {
"name": package["package_id"],
"sdk_versions": package["sdk_versions"]
}
# packagex = Package(package["package_id"], package["sdk_versions"], )
if self._sdk_version not in package["sdk_versions"]:
packagex.update({"is_compatible": False})
# packagex._replace(is_compatible=0)
# packagex.is_compatible = "1"
else:
# packagex._replace(is_compatible="1")
# packagex.is_compatible = "0"
packagex.update({"is_compatible": True})
try:
packagex.update({"icon_url": package["icon_url"]})
except KeyError: # There is no 'icon_url" in the response payload for this package
packagex.update({"icon_url": ""})
self.subscribed_packages.append(packagex)
# all_subscribed_packages.append(packagex)
# print("ALL PACKAGES: {}".format(all_subscribed_packages))
# self.subscribed_compatible_packages.clear()
# self.subscribed_incompatible_packages.clear()
# for subscribed in user_subscribed:
# if self._sdk_version not in subscribed.sdk_versions:
# self.subscribed_incompatible_packages.append(subscribed)
# else:
# self.subscribed_compatible_packages.append(subscribed)
self._models["subscribed_packages"].update()
user_installed = self._package_manager.getUserInstalledPackages()
Logger.log("d", "User has installed locally {} package(s).".format(len(user_installed)))
# We check if there are packages installed in Cloud Marketplace but not in Cura marketplace
if list(set(user_subscribed_list).difference(user_installed)):
Logger.log("d", "Mismatch found between Cloud subscribed packages and Cura installed packages")
sync_message = Message(i18n_catalog.i18nc(
"@info:generic",
"\nDo you want to sync material and software packages with your account?"),
lifetime = 0,
title = i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account", ))
sync_message.addAction("sync",
name = i18n_catalog.i18nc("@action:button", "Sync"),
icon = "",
description = "Sync your Cloud subscribed packages to your local environment.",
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT)
sync_message.show()
sync_message.actionTriggered.connect(self.some_function)
self.metadataChanged.emit() self.metadataChanged.emit()
@ -776,13 +701,50 @@ class Toolbox(QObject, Extension):
# Ignore any operation that is not a get operation # Ignore any operation that is not a get operation
pass pass
def some_function(self, messageId: str, actionId: str) -> None: def _checkCompatibilities(self, json_data):
print("Clicked the BUTTON") user_subscribed_list = [plugin["package_id"] for plugin in json_data]
user_installed_packages = self._package_manager.getUserInstalledPackages()
# We check if there are packages installed in Cloud Marketplace but not in Cura marketplace
if list(set(user_subscribed_list).difference(user_installed_packages)):
Logger.log("d", "Mismatch found between Cloud subscribed packages and Cura installed packages")
sync_message = Message(i18n_catalog.i18nc(
"@info:generic",
"\nDo you want to sync material and software packages with your account?"),
lifetime=0,
title=i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account", ))
sync_message.addAction("sync",
name=i18n_catalog.i18nc("@action:button", "Sync"),
icon="",
description="Sync your Cloud subscribed packages to your local environment.",
button_align=Message.ActionButtonAlignment.ALIGN_RIGHT)
self._onSyncButtonClickedHelper = functools.partial(self._onSyncButtonClicked, json_data)
sync_message.actionTriggered.connect(self._onSyncButtonClickedHelper)
sync_message.show()
def _onSyncButtonClicked(self, json_data, messageId: str, actionId: str) -> None:
self.subscribed_packages.clear()
# We create the packages from the HTTP payload
for item in json_data:
package = {"name": item["package_id"], "sdk_versions": item["sdk_versions"]}
if self._sdk_version not in item["sdk_versions"]:
package.update({"is_compatible": False})
else:
package.update({"is_compatible": True})
try:
package.update({"icon_url": item["icon_url"]})
except KeyError: # There is no 'icon_url" in the response payload for this package
package.update({"icon_url": ""})
self.subscribed_packages.append(package)
self._models["subscribed_packages"].update()
compatibilityDialog = "resources/qml/dialogs/CompatibilityDialog.qml" compatibilityDialog = "resources/qml/dialogs/CompatibilityDialog.qml"
path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), compatibilityDialog) path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), compatibilityDialog)
self._view = self._application.getInstance().createQmlComponent(path, {"toolbox": self}) # what is toolbox: self self.compatibility_dialog_view = self._application.getInstance().createQmlComponent(path, {"toolbox": self})
# This function goes through all known remote versions of a package and notifies the package manager of this change # This function goes through all known remote versions of a package and notifies the package manager of this change
def _notifyPackageManager(self): def _notifyPackageManager(self):