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:
Diffstat (limited to 'plugins/Marketplace/CloudSync/CloudApiClient.py')
-rw-r--r--plugins/Marketplace/CloudSync/CloudApiClient.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/plugins/Marketplace/CloudSync/CloudApiClient.py b/plugins/Marketplace/CloudSync/CloudApiClient.py
new file mode 100644
index 0000000000..cf83567f17
--- /dev/null
+++ b/plugins/Marketplace/CloudSync/CloudApiClient.py
@@ -0,0 +1,55 @@
+# Copyright (c) 2022 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from UM.Logger import Logger
+from UM.TaskManagement.HttpRequestManager import HttpRequestManager
+from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
+from cura.CuraApplication import CuraApplication
+from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
+from ..CloudApiModel import CloudApiModel
+
+
+class CloudApiClient:
+ """Manages Cloud subscriptions
+
+ When a package is added to a user's account, the user is 'subscribed' to that package.
+ Whenever the user logs in on another instance of Cura, these subscriptions can be used to sync the user's plugins
+
+ Singleton: use CloudApiClient.getInstance() instead of CloudApiClient()
+ """
+
+ __instance = None
+
+ @classmethod
+ def getInstance(cls, app: CuraApplication):
+ if not cls.__instance:
+ cls.__instance = CloudApiClient(app)
+ return cls.__instance
+
+ def __init__(self, app: CuraApplication) -> None:
+ if self.__instance is not None:
+ raise RuntimeError("This is a Singleton. use getInstance()")
+
+ self._scope: JsonDecoratorScope = JsonDecoratorScope(UltimakerCloudScope(app))
+
+ app.getPackageManager().packageInstalled.connect(self._onPackageInstalled)
+
+ def unsubscribe(self, package_id: str) -> None:
+ url = CloudApiModel.userPackageUrl(package_id)
+ HttpRequestManager.getInstance().delete(url = url, scope = self._scope)
+
+ def _subscribe(self, package_id: str) -> None:
+ """You probably don't want to use this directly. All installed packages will be automatically subscribed."""
+
+ Logger.debug("Subscribing to {}", package_id)
+ data = "{\"data\": {\"package_id\": \"%s\", \"sdk_version\": \"%s\"}}" % (package_id, CloudApiModel.sdk_version)
+ HttpRequestManager.getInstance().put(
+ url = CloudApiModel.api_url_user_packages,
+ data = data.encode(),
+ scope = self._scope
+ )
+
+ def _onPackageInstalled(self, package_id: str):
+ if CuraApplication.getInstance().getCuraAPI().account.isLoggedIn:
+ # We might already be subscribed, but checking would take one extra request. Instead, simply subscribe
+ self._subscribe(package_id)