|
@@ -1,23 +1,51 @@
|
|
|
+from UM.Logger import Logger
|
|
|
+from UM.TaskManagement.HttpRequestManager import HttpRequestManager
|
|
|
from cura.CuraApplication import CuraApplication
|
|
|
from ..CloudApiModel import CloudApiModel
|
|
|
from ..UltimakerCloudScope import UltimakerCloudScope
|
|
|
|
|
|
|
|
|
-## 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
|
|
|
class CloudPackageManager:
|
|
|
+ """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 CloudPackageManager.getInstance() instead of CloudPackageManager()
|
|
|
+ """
|
|
|
+
|
|
|
+ __instance = None
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def getInstance(cls, app: CuraApplication):
|
|
|
+ if not cls.__instance:
|
|
|
+ cls.__instance = CloudPackageManager(app)
|
|
|
+ return cls.__instance
|
|
|
+
|
|
|
def __init__(self, app: CuraApplication) -> None:
|
|
|
- self._request_manager = app.getHttpRequestManager()
|
|
|
- self._scope = UltimakerCloudScope(app)
|
|
|
+ if self.__instance is not None:
|
|
|
+ raise RuntimeError("This is a Singleton. use getInstance()")
|
|
|
|
|
|
- def subscribe(self, package_id: str) -> None:
|
|
|
- data = "{\"data\": {\"package_id\": \"%s\", \"sdk_version\": \"%s\"}}" % (package_id, CloudApiModel.sdk_version)
|
|
|
- self._request_manager.put(url=CloudApiModel.api_url_user_packages,
|
|
|
- data=data.encode(),
|
|
|
- scope=self._scope
|
|
|
- )
|
|
|
+ self._scope = UltimakerCloudScope(app) # type: UltimakerCloudScope
|
|
|
+
|
|
|
+ app.getPackageManager().packageInstalled.connect(self._onPackageInstalled)
|
|
|
|
|
|
def unsubscribe(self, package_id: str) -> None:
|
|
|
url = CloudApiModel.userPackageUrl(package_id)
|
|
|
- self._request_manager.delete(url=url, scope=self._scope)
|
|
|
+ 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)
|