mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-16 03:07:53 -06:00
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:
parent
42e7ef4a89
commit
09709ede8b
1 changed files with 24 additions and 19 deletions
|
@ -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 = {}
|
||||
def getAllLocalPackages(self) -> List[Dict[str, Any]]:
|
||||
""" returns an unordered list of all the package_info installed, to be installed or to be returned"""
|
||||
|
||||
for packages in self.getAllInstalledPackagesInfo().values():
|
||||
for package_info in packages:
|
||||
handled_packages.add(package_info["package_id"])
|
||||
yield package_info
|
||||
class PkgInfo:
|
||||
# Needed helper class because a dict isn't hashable
|
||||
def __init__(self, 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
|
||||
# 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"]
|
||||
def __contains__(self, item):
|
||||
return item == self._info["package_id"]
|
||||
|
||||
# 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 __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]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue