Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelle Spijker <spijker.jelle@gmail.com>2021-12-05 17:11:35 +0300
committerJelle Spijker <spijker.jelle@gmail.com>2021-12-05 17:11:35 +0300
commit09709ede8b27f02ae0dc2f8131a15f9ca94183c6 (patch)
treed1a0d20c8ae8080a5ccb43d2eb5900af8beda21b /cura/CuraPackageManager.py
parent42e7ef4a8989786576636d517c61d659651fdf0a (diff)
Fix duplicate packages in get AlllocalPackages
The helper class is needed because dict's aren't hashable which complicates the `in` check. Contributes to: CURA-8587
Diffstat (limited to 'cura/CuraPackageManager.py')
-rw-r--r--cura/CuraPackageManager.py49
1 files changed, 27 insertions, 22 deletions
diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py
index 98e0e592aa..21cd0c69dc 100644
--- a/cura/CuraPackageManager.py
+++ b/cura/CuraPackageManager.py
@@ -23,7 +23,7 @@ class CuraPackageManager(PackageManager):
self.installedPackagesChanged.connect(self._updateLocallyInstalledPackages)
def _updateLocallyInstalledPackages(self):
- self._locally_installed_packages = list(self.iterateAllLocalPackages())
+ self._locally_installed_packages = self.getAllLocalPackages()
@property
def locally_installed_packages(self):
@@ -66,24 +66,29 @@ class CuraPackageManager(PackageManager):
return machine_with_materials, machine_with_qualities
- def iterateAllLocalPackages(self) -> Generator[Dict[str, Any], None, None]:
- """ A generator which returns an unordered list of all the PackageModels"""
- handled_packages = {}
-
- for packages in self.getAllInstalledPackagesInfo().values():
- for package_info in packages:
- handled_packages.add(package_info["package_id"])
- yield package_info
-
- # Get all to be removed package_info's. These packages are still used in the current session so the user might
- # still want to interact with these.
- for package_data in self.getPackagesToRemove().values():
- if not package_data["package_info"]["package_id"] in handled_packages:
- handled_packages.add(package_data["package_info"]["package_id"])
- yield package_data["package_info"]
-
- # Get all to be installed package_info's. Since the user might want to interact with these
- for package_data in self.getPackagesToInstall().values():
- if not package_data["package_info"]["package_id"] in handled_packages:
- handled_packages.add(package_data["package_info"]["package_id"])
- yield package_data["package_info"]
+ def getAllLocalPackages(self) -> List[Dict[str, Any]]:
+ """ returns an unordered list of all the package_info installed, to be installed or to be returned"""
+
+ class PkgInfo:
+ # Needed helper class because a dict isn't hashable
+ def __init__(self, package_info):
+ self._info = package_info
+
+ def __contains__(self, item):
+ return item == self._info["package_id"]
+
+ def __repr__(self):
+ return repr(self._info)
+
+ def __iter__(self):
+ for k, v in self._info.items():
+ yield k, v
+
+ def asdict(self):
+ return self._info
+
+ packages = [PkgInfo(package_info) for package in self.getAllInstalledPackagesInfo().values() for package_info in package]
+ packages.extend([PkgInfo(package["package_info"]) for package in self.getPackagesToRemove().values() if package["package_info"]["package_id"] not in packages])
+ packages.extend([PkgInfo(package["package_info"]) for package in self.getPackagesToInstall().values() if package["package_info"]["package_id"] not in packages])
+
+ return [dict(package) for package in packages]