Periodically update the remote clusters and printjobs

This commit is contained in:
Marijn Deé 2018-12-04 13:06:27 +01:00
parent 1bcabc6f42
commit 894c69685a

View file

@ -8,6 +8,7 @@ from typing import Dict, Optional
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
from UM.Logger import Logger from UM.Logger import Logger
from UM.Signal import Signal
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.NetworkClient import NetworkClient from cura.NetworkClient import NetworkClient
@ -42,10 +43,14 @@ class CloudOutputDeviceManager(NetworkClient):
# When switching machines we check if we have to activate a remote cluster. # When switching machines we check if we have to activate a remote cluster.
application.globalContainerStackChanged.connect(self._connectToActiveMachine) application.globalContainerStackChanged.connect(self._connectToActiveMachine)
# TODO: fix this
# Periodically check all remote clusters for the authenticated user. # Periodically check all remote clusters for the authenticated user.
# self._update_clusters_thread = Thread(target=self._updateClusters, daemon=True) # This is done by emitting to _on_cluster_received by _update_clusters_thread
# self._update_clusters_thread.start() # The thread is only started after the user is authenticated, otherwise the api call results in
# an authentication error
self._on_cluster_received = Signal()
self._on_cluster_received.connect(self._getRemoteClusters)
self._update_clusters_thread = Thread(target=self._updateClusters, daemon=True)
## Override _createEmptyRequest to add the needed authentication header for talking to the Ultimaker Cloud API. ## Override _createEmptyRequest to add the needed authentication header for talking to the Ultimaker Cloud API.
def _createEmptyRequest(self, path: str, content_type: Optional[str] = "application/json") -> QNetworkRequest: def _createEmptyRequest(self, path: str, content_type: Optional[str] = "application/json") -> QNetworkRequest:
@ -59,14 +64,26 @@ class CloudOutputDeviceManager(NetworkClient):
## Update the clusters ## Update the clusters
def _updateClusters(self) -> None: def _updateClusters(self) -> None:
while True: while True:
self._getRemoteClusters()
sleep(self.CHECK_CLUSTER_INTERVAL) # Stop if the application is shutting down
if CuraApplication.getInstance().isShuttingDown():
return
self._on_cluster_received.emit()
sleep(5)
## Gets all remote clusters from the API. ## Gets all remote clusters from the API.
def _getRemoteClusters(self) -> None: def _getRemoteClusters(self) -> None:
Logger.log("i", "Retrieving remote clusters") Logger.log("i", "Retrieving remote clusters")
if self._account.isLoggedIn:
self.get("/clusters", on_finished = self._onGetRemoteClustersFinished) self.get("/clusters", on_finished = self._onGetRemoteClustersFinished)
# Only start the polling thread after the user is authenticated
# The first call to _getRemoteClusters comes from self._account.loginStateChanged
if not self._update_clusters_thread.is_alive():
self._update_clusters_thread.start()
## Callback for when the request for getting the clusters. is finished. ## Callback for when the request for getting the clusters. is finished.
def _onGetRemoteClustersFinished(self, reply: QNetworkReply) -> None: def _onGetRemoteClustersFinished(self, reply: QNetworkReply) -> None:
Logger.log("i", "Received remote clusters") Logger.log("i", "Received remote clusters")