From 7be2da587b9e37b0171d644543c77f3ab63a4e21 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 8 Dec 2021 10:18:08 +0100 Subject: [PATCH] Automatic abortRequest for each API request Defensive programming Contributes to: CURA-8587 --- plugins/Marketplace/PackageList.py | 23 +++++++++++++------ plugins/Marketplace/RemotePackageList.py | 12 ---------- .../Marketplace/resources/qml/Packages.qml | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/plugins/Marketplace/PackageList.py b/plugins/Marketplace/PackageList.py index 7e64373e9c..e3af31d81a 100644 --- a/plugins/Marketplace/PackageList.py +++ b/plugins/Marketplace/PackageList.py @@ -5,7 +5,7 @@ import json import os.path from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, Qt -from typing import cast, Dict, List, Optional, Set, TYPE_CHECKING +from typing import cast, Dict, Optional, Set, TYPE_CHECKING from UM.i18n import i18nCatalog from UM.Qt.ListModel import ListModel @@ -53,17 +53,26 @@ class PackageList(ListModel): self._scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance())) self._license_dialogs: Dict[str, QObject] = {} + def __del__(self) -> None: + """ When this object is deleted it will loop through all registered API requests and aborts them """ + self.cleanUpAPIRequest() + + def abortRequest(self, request_id: str) -> None: + """Aborts a single request""" + if request_id in self._ongoing_requests and self._ongoing_requests[request_id]: + HttpRequestManager.getInstance().abortRequest(self._ongoing_requests[request_id]) + self._ongoing_requests[request_id] = None + + @pyqtSlot() + def cleanUpAPIRequest(self) -> None: + for request_id in self._ongoing_requests: + self.abortRequest(request_id) + @pyqtSlot() def updatePackages(self) -> None: """ A Qt slot which will update the List from a source. Actual implementation should be done in the child class""" pass - @pyqtSlot() - def abortUpdating(self) -> None: - """ A Qt slot which allows the update process to be aborted. Override this for child classes with async/callback - updatePackges methods""" - pass - def reset(self) -> None: """ Resets and clears the list""" self.clear() diff --git a/plugins/Marketplace/RemotePackageList.py b/plugins/Marketplace/RemotePackageList.py index 583a427c44..d20cb5f4b0 100644 --- a/plugins/Marketplace/RemotePackageList.py +++ b/plugins/Marketplace/RemotePackageList.py @@ -33,13 +33,6 @@ class RemotePackageList(PackageList): self.isLoadingChanged.connect(self._onLoadingChanged) self.isLoadingChanged.emit() - def __del__(self) -> None: - """ - When deleting this object, abort the request so that we don't get a callback from it later on a deleted C++ - object. - """ - self.abortUpdating() - @pyqtSlot() def updatePackages(self) -> None: """ @@ -57,11 +50,6 @@ class RemotePackageList(PackageList): error_callback = self._onError ) - @pyqtSlot() - def abortUpdating(self) -> None: - HttpRequestManager.getInstance().abortRequest(self._ongoing_requests["get_packages"]) - self._ongoing_requests["get_packages"] = None - def reset(self) -> None: self.clear() self._request_url = self._initialRequestUrl() diff --git a/plugins/Marketplace/resources/qml/Packages.qml b/plugins/Marketplace/resources/qml/Packages.qml index 62c0f92149..194c90c248 100644 --- a/plugins/Marketplace/resources/qml/Packages.qml +++ b/plugins/Marketplace/resources/qml/Packages.qml @@ -24,7 +24,7 @@ ListView clip: true Component.onCompleted: model.updatePackages() - Component.onDestruction: model.abortUpdating() + Component.onDestruction: model.cleanUpAPIRequest() spacing: UM.Theme.getSize("default_margin").height