mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-07 06:59:00 +08:00
More implementation for getting remote clusters, add some TODOs
This commit is contained in:
parent
ca1c5fb48c
commit
04cc6193d6
@ -60,6 +60,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
# TODO: show message to user to sign in
|
# TODO: show message to user to sign in
|
||||||
self.setAuthenticationState(AuthState.NotAuthenticated)
|
self.setAuthenticationState(AuthState.NotAuthenticated)
|
||||||
else:
|
else:
|
||||||
|
# TODO: not execute call at all when not signed in?
|
||||||
self.setAuthenticationState(AuthState.Authenticated)
|
self.setAuthenticationState(AuthState.Authenticated)
|
||||||
request.setRawHeader(b"Authorization", "Bearer {}".format(self._account.accessToken).encode())
|
request.setRawHeader(b"Authorization", "Bearer {}".format(self._account.accessToken).encode())
|
||||||
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
from typing import TYPE_CHECKING, Dict
|
import json
|
||||||
|
from typing import TYPE_CHECKING, Dict, Optional
|
||||||
|
|
||||||
|
from PyQt5.QtCore import QUrl
|
||||||
|
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
|
||||||
|
|
||||||
|
from UM.Logger import Logger
|
||||||
from plugins.UM3NetworkPrinting.src.Cloud.CloudOutputDevice import CloudOutputDevice
|
from plugins.UM3NetworkPrinting.src.Cloud.CloudOutputDevice import CloudOutputDevice
|
||||||
|
|
||||||
|
|
||||||
@ -19,13 +24,17 @@ if TYPE_CHECKING:
|
|||||||
class CloudOutputDeviceManager:
|
class CloudOutputDeviceManager:
|
||||||
|
|
||||||
# The cloud URL to use for remote clusters.
|
# The cloud URL to use for remote clusters.
|
||||||
API_ROOT_PATH = "https://api-staging.ultimaker.com/connect/v1"
|
API_ROOT_PATH = "https://api.ultimaker.com/connect/v1"
|
||||||
|
|
||||||
def __init__(self, application: "CuraApplication"):
|
def __init__(self, application: "CuraApplication"):
|
||||||
self._application = application
|
self._application = application
|
||||||
self._output_device_manager = application.getOutputDeviceManager()
|
self._output_device_manager = application.getOutputDeviceManager()
|
||||||
self._account = application.getCuraAPI().account
|
self._account = application.getCuraAPI().account
|
||||||
|
|
||||||
|
# Network manager for getting the cluster list.
|
||||||
|
self._network_manager = QNetworkAccessManager()
|
||||||
|
self._network_manager.finished.connect(self._onNetworkRequestFinished)
|
||||||
|
|
||||||
# Persistent dict containing the remote clusters for the authenticated user.
|
# Persistent dict containing the remote clusters for the authenticated user.
|
||||||
self._remote_clusters = {} # type: Dict[str, CloudOutputDevice]
|
self._remote_clusters = {} # type: Dict[str, CloudOutputDevice]
|
||||||
|
|
||||||
@ -33,17 +42,61 @@ class CloudOutputDeviceManager:
|
|||||||
self._application.globalContainerStackChanged.connect(self._activeMachineChanged)
|
self._application.globalContainerStackChanged.connect(self._activeMachineChanged)
|
||||||
|
|
||||||
# Fetch all remote clusters for the authenticated user.
|
# Fetch all remote clusters for the authenticated user.
|
||||||
self._getRemoteClusters()
|
# TODO: update remote clusters periodically
|
||||||
|
self._account.loginStateChanged.connect(self._getRemoteClusters)
|
||||||
|
|
||||||
## Gets all remote clusters from the API.
|
## Gets all remote clusters from the API.
|
||||||
def _getRemoteClusters(self):
|
def _getRemoteClusters(self):
|
||||||
# TODO: get list of remote clusters and create an output device for each.
|
url = QUrl("{}/clusters".format(self.API_ROOT_PATH))
|
||||||
# For testing we add a dummy device:
|
request = QNetworkRequest(url)
|
||||||
self._addCloudOutputDevice({"cluster_id": "LJ0tciiuZZjarrXAvFLEZ6ox4Cvx8FvtXUlQv4vIhV6w"})
|
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
|
||||||
|
|
||||||
|
if not self._account.isLoggedIn:
|
||||||
|
# TODO: show message to user to sign in
|
||||||
|
Logger.log("w", "User is not signed in, cannot get remote print clusters")
|
||||||
|
return
|
||||||
|
|
||||||
|
request.setRawHeader(b"Authorization", "Bearer {}".format(self._account.accessToken).encode())
|
||||||
|
self._network_manager.get(request)
|
||||||
|
|
||||||
|
## Callback for network requests.
|
||||||
|
def _onNetworkRequestFinished(self, reply: QNetworkReply):
|
||||||
|
# TODO: right now we assume that each reply is from /clusters, we should fix this
|
||||||
|
status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
|
||||||
|
if status_code != 200:
|
||||||
|
# TODO: add correct scopes to OAuth2 client to use remote connect API.
|
||||||
|
Logger.log("w", "Got unexpected response while trying to get cloud cluster data: {}, {}"
|
||||||
|
.format(status_code, reply.readAll()))
|
||||||
|
return
|
||||||
|
|
||||||
|
# Parse the response (returns the "data" field from the body).
|
||||||
|
clusters_data = self._parseStatusResponse(reply)
|
||||||
|
if not clusters_data:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Add an output device for each remote cluster.
|
||||||
|
# The clusters are an array of objects in a field called "data".
|
||||||
|
for cluster in clusters_data:
|
||||||
|
self._addCloudOutputDevice(cluster)
|
||||||
|
|
||||||
|
# # For testing we add a dummy device:
|
||||||
|
# self._addCloudOutputDevice({ "cluster_id": "LJ0tciiuZZjarrXAvFLEZ6ox4Cvx8FvtXUlQv4vIhV6w" })
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _parseStatusResponse(reply: QNetworkReply) -> Optional[dict]:
|
||||||
|
try:
|
||||||
|
result = json.loads(bytes(reply.readAll()).decode("utf-8"))
|
||||||
|
print("result=====", result)
|
||||||
|
# TODO: use model or named tuple here.
|
||||||
|
return result.data
|
||||||
|
except json.decoder.JSONDecodeError:
|
||||||
|
Logger.logException("w", "Unable to decode JSON from reply.")
|
||||||
|
return None
|
||||||
|
|
||||||
## Adds a CloudOutputDevice for each entry in the remote cluster list from the API.
|
## Adds a CloudOutputDevice for each entry in the remote cluster list from the API.
|
||||||
def _addCloudOutputDevice(self, cluster_data: Dict[str, any]):
|
def _addCloudOutputDevice(self, cluster_data: Dict[str, any]):
|
||||||
# TODO: use model or named tuple for cluster_data
|
# TODO: use model or named tuple for cluster_data
|
||||||
|
print("cluster_data====", cluster_data)
|
||||||
device = CloudOutputDevice(cluster_data["cluster_id"])
|
device = CloudOutputDevice(cluster_data["cluster_id"])
|
||||||
self._output_device_manager.addOutputDevice(device)
|
self._output_device_manager.addOutputDevice(device)
|
||||||
self._remote_clusters[cluster_data["cluster_id"]] = device
|
self._remote_clusters[cluster_data["cluster_id"]] = device
|
||||||
|
Loading…
x
Reference in New Issue
Block a user