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
This commit is contained in:
Jelle Spijker 2021-12-05 15:11:35 +01:00
parent 42e7ef4a89
commit 09709ede8b
No known key found for this signature in database
GPG key ID: 6662DC033BE6B99A

View file

@ -23,7 +23,7 @@ class CuraPackageManager(PackageManager):
self.installedPackagesChanged.connect(self._updateLocallyInstalledPackages) self.installedPackagesChanged.connect(self._updateLocallyInstalledPackages)
def _updateLocallyInstalledPackages(self): def _updateLocallyInstalledPackages(self):
self._locally_installed_packages = list(self.iterateAllLocalPackages()) self._locally_installed_packages = self.getAllLocalPackages()
@property @property
def locally_installed_packages(self): def locally_installed_packages(self):
@ -66,24 +66,29 @@ class CuraPackageManager(PackageManager):
return machine_with_materials, machine_with_qualities return machine_with_materials, machine_with_qualities
def iterateAllLocalPackages(self) -> Generator[Dict[str, Any], None, None]: def getAllLocalPackages(self) -> List[Dict[str, Any]]:
""" A generator which returns an unordered list of all the PackageModels""" """ returns an unordered list of all the package_info installed, to be installed or to be returned"""
handled_packages = {}
for packages in self.getAllInstalledPackagesInfo().values(): class PkgInfo:
for package_info in packages: # Needed helper class because a dict isn't hashable
handled_packages.add(package_info["package_id"]) def __init__(self, package_info):
yield package_info self._info = package_info
# Get all to be removed package_info's. These packages are still used in the current session so the user might def __contains__(self, item):
# still want to interact with these. return item == self._info["package_id"]
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 def __repr__(self):
for package_data in self.getPackagesToInstall().values(): return repr(self._info)
if not package_data["package_info"]["package_id"] in handled_packages:
handled_packages.add(package_data["package_info"]["package_id"]) def __iter__(self):
yield package_data["package_info"] 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]