From eb8d353e115eeaaea35c03193b022bd2640e3407 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 19 Jun 2019 13:58:11 +0200 Subject: [PATCH 1/7] Add basic support for print job actions via Cloud output device --- .../resources/qml/MonitorPrintJobCard.qml | 5 -- .../resources/qml/MonitorPrinterCard.qml | 1 - .../resources/qml/MonitorQueue.qml | 2 - .../src/Cloud/CloudApiClient.py | 15 +++++ .../src/Cloud/CloudOutputController.py | 8 ++- .../src/Cloud/CloudOutputDevice.py | 53 ++++++++++-------- resources/qml/BorderGroup.qmlc.pqgKbT | Bin 0 -> 736 bytes 7 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 resources/qml/BorderGroup.qmlc.pqgKbT diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index 470eb84ac3..fd0870d351 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -22,10 +22,6 @@ Item // The print job which all other data is derived from property var printJob: null - // If the printer is a cloud printer or not. Other items base their enabled state off of this boolean. In the future - // they might not need to though. - property bool cloudConnection: Cura.MachineManager.activeMachineIsUsingCloudConnection - width: parent.width height: childrenRect.height @@ -217,7 +213,6 @@ Item } width: 32 * screenScaleFactor // TODO: Theme! height: 32 * screenScaleFactor // TODO: Theme! - enabled: !cloudConnection onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index f4295ee18d..89687ceeb8 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -172,7 +172,6 @@ Item } width: 36 * screenScaleFactor // TODO: Theme! height: 36 * screenScaleFactor // TODO: Theme! - enabled: !cloudConnection onClicked: enabled ? contextMenu.switchPopupState() : {} visible: diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index 8460425190..cd5a5d1a37 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -73,8 +73,6 @@ Item MouseArea { anchors.fill: manageQueueLabel - enabled: !cloudConnection - hoverEnabled: !cloudConnection onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() onEntered: { diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index adff94bbbc..4edb30db23 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -96,6 +96,21 @@ class CloudApiClient: reply = self._manager.post(self._createEmptyRequest(url), b"") self._addCallback(reply, on_finished, CloudPrintResponse) + ## Send a print job action to the cluster for the given print job. + # \param cluster_id: The ID of the cluster. + # \param cluster_job_id: The ID of the print job within the cluster. + # \param action: The name of the action to execute. + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, any] = None) -> None: + body = b"" + if data: + try: + body = json.dumps({"data": data}).encode() + except JSONDecodeError as err: + Logger.log("w", "Could not encode body: %s", err) + return + url = "{}/clusters/{}/print_jobs/{}/action/{}".format(self.CLUSTER_API_ROOT, cluster_id, cluster_job_id, action) + self._manager.post(self._createEmptyRequest(url), body) + ## We override _createEmptyRequest in order to add the user credentials. # \param url: The URL to request # \param content_type: The type of the body contents. diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py index bd56ef3185..8c09483990 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py @@ -1,5 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from typing import TYPE_CHECKING @@ -13,10 +14,13 @@ class CloudOutputController(PrinterOutputController): # The cloud connection only supports fetching the printer and queue status and adding a job to the queue. # To let the UI know this we mark all features below as False. - self.can_pause = False - self.can_abort = False + self.can_pause = True + self.can_abort = True self.can_pre_heat_bed = False self.can_pre_heat_hotends = False self.can_send_raw_gcode = False self.can_control_manually = False self.can_update_firmware = False + + def setJobState(self, job: "PrintJobOutputModel", state: str): + self._output_device.setJobState(job.key, state) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index df513f4174..dcbeeb4626 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -6,6 +6,7 @@ from time import time from typing import Dict, List, Optional, Set, cast from PyQt5.QtCore import QObject, QUrl, pyqtProperty, pyqtSignal, pyqtSlot +from PyQt5.QtGui import QDesktopServices from UM import i18nCatalog from UM.Backend.Backend import BackendState @@ -399,6 +400,22 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None and print_job.state != "queued"] + def setJobState(self, print_job_uuid: str, state: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, state) + + @pyqtSlot(str) + def sendJobToTop(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "move", + {"list": "queued", "to_position": 0}) + + @pyqtSlot(str) + def deleteJobFromQueue(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "remove") + + @pyqtSlot(str) + def forceSendJob(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "force") + @pyqtSlot(int, result = str) def formatDuration(self, seconds: int) -> str: return Duration(seconds).getDisplayString(DurationFormat.Format.Short) @@ -411,6 +428,18 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): def getDateCompleted(self, time_remaining: int) -> str: return formatDateCompleted(time_remaining) + @pyqtProperty(bool, notify=printJobsChanged) + def receivedPrintJobs(self) -> bool: + return bool(self._print_jobs) + + @pyqtSlot() + def openPrintJobControlPanel(self) -> None: + QDesktopServices.openUrl(QUrl("https://mycloud.ultimaker.com")) + + @pyqtSlot() + def openPrinterControlPanel(self) -> None: + QDesktopServices.openUrl(QUrl("https://mycloud.ultimaker.com")) + ## TODO: The following methods are required by the monitor page QML, but are not actually available using cloud. # TODO: We fake the methods here to not break the monitor page. @@ -422,30 +451,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): def setActiveCameraUrl(self, camera_url: "QUrl") -> None: pass - @pyqtProperty(bool, notify = printJobsChanged) - def receivedPrintJobs(self) -> bool: - return bool(self._print_jobs) - - @pyqtSlot() - def openPrintJobControlPanel(self) -> None: - pass - - @pyqtSlot() - def openPrinterControlPanel(self) -> None: - pass - - @pyqtSlot(str) - def sendJobToTop(self, print_job_uuid: str) -> None: - pass - - @pyqtSlot(str) - def deleteJobFromQueue(self, print_job_uuid: str) -> None: - pass - - @pyqtSlot(str) - def forceSendJob(self, print_job_uuid: str) -> None: - pass - @pyqtProperty("QVariantList", notify = _clusterPrintersChanged) def connectedPrintersTypeCount(self) -> List[Dict[str, str]]: return [] diff --git a/resources/qml/BorderGroup.qmlc.pqgKbT b/resources/qml/BorderGroup.qmlc.pqgKbT new file mode 100644 index 0000000000000000000000000000000000000000..0bb07b4a6761aa19a3bc17211da06fd1dc491556 GIT binary patch literal 736 zcmaJ;t4~647(FN;nA}Vjt4S~*VBcVi;&?wU7d0A9j$kktEN%n?b91v9 zbUunR61DkXT+jF2i;v>Rj^FEihx5bEe!{d2$Cw3UI)wY1r+hU4yiWj^r|wYm< z1tQ9jpAs%xN^NI8B^2T*8nT-v07C4I%yS$U=d+FcoGQ#A^iSQ*4{Orqs7BqsG z!4<1<56HFa$};26B}=ru^e4;Rcs^turk=zk5!6cFmC;(>C=vC0kLArmI$sS$F;t6k z|J#*x5iA8FxX}F({~i<4-4f5li1;MVXzK0fL6Gmw!XbL7z(h^N81j3|d<#WXQR2qY zxp+As(_&v{Exm~r>V)n0MRta-wawWc`E_cnAg-S>xefMlRW0$Z$gZZ7G$D zY*0&fw(@(-2CFpvdX@QI#Sr7hCbvr!*_&F&(V3h)IeS!b94 literal 0 HcmV?d00001 From 6cbe89f83283f047ff4fc81953abbd66dff76be1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 19 Jun 2019 13:58:26 +0200 Subject: [PATCH 2/7] Remove weird file --- resources/qml/BorderGroup.qmlc.pqgKbT | Bin 736 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/qml/BorderGroup.qmlc.pqgKbT diff --git a/resources/qml/BorderGroup.qmlc.pqgKbT b/resources/qml/BorderGroup.qmlc.pqgKbT deleted file mode 100644 index 0bb07b4a6761aa19a3bc17211da06fd1dc491556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmaJ;t4~647(FN;nA}Vjt4S~*VBcVi;&?wU7d0A9j$kktEN%n?b91v9 zbUunR61DkXT+jF2i;v>Rj^FEihx5bEe!{d2$Cw3UI)wY1r+hU4yiWj^r|wYm< z1tQ9jpAs%xN^NI8B^2T*8nT-v07C4I%yS$U=d+FcoGQ#A^iSQ*4{Orqs7BqsG z!4<1<56HFa$};26B}=ru^e4;Rcs^turk=zk5!6cFmC;(>C=vC0kLArmI$sS$F;t6k z|J#*x5iA8FxX}F({~i<4-4f5li1;MVXzK0fL6Gmw!XbL7z(h^N81j3|d<#WXQR2qY zxp+As(_&v{Exm~r>V)n0MRta-wawWc`E_cnAg-S>xefMlRW0$Z$gZZ7G$D zY*0&fw(@(-2CFpvdX@QI#Sr7hCbvr!*_&F&(V3h)IeS!b94 From 93351ec9b9f354ea3e5bd74f50bb0783ce07e2d9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:36:15 +0200 Subject: [PATCH 3/7] Show context menu on printers with firmware 5.3 or later --- .../resources/qml/MonitorPrintJobCard.qml | 5 +++-- .../resources/qml/MonitorPrinterCard.qml | 5 ++--- .../resources/qml/MonitorQueue.qml | 12 +++++------- .../src/Cloud/CloudOutputDevice.py | 11 +++++++++++ .../src/Cloud/Models/CloudClusterPrintJobStatus.py | 1 - .../UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 5 +++++ .../UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 2 +- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index fd0870d351..b863712481 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -213,6 +213,7 @@ Item } width: 32 * screenScaleFactor // TODO: Theme! height: 32 * screenScaleFactor // TODO: Theme! + enabled: OutputDevice.supportsPrintJobActions onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { @@ -245,7 +246,7 @@ Item MonitorInfoBlurb { id: contextMenuDisabledInfo - text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.") + text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.") target: contextMenuButton } -} \ No newline at end of file +} diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index 89687ceeb8..1f5a4cfcb2 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -172,7 +172,7 @@ Item } width: 36 * screenScaleFactor // TODO: Theme! height: 36 * screenScaleFactor // TODO: Theme! - + enabled: OutputDevice.supportsPrintJobActions onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { @@ -205,7 +205,7 @@ Item MonitorInfoBlurb { id: contextMenuDisabledInfo - text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.") + text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.") target: contextMenuButton } @@ -243,7 +243,6 @@ Item } } - // Divider Rectangle { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index cd5a5d1a37..369951fa9c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -42,7 +42,6 @@ Item } height: 18 * screenScaleFactor // TODO: Theme! width: childrenRect.width - visible: !cloudConnection UM.RecolorImage { @@ -65,7 +64,7 @@ Item color: UM.Theme.getColor("monitor_text_link") font: UM.Theme.getFont("medium") // 14pt, regular linkColor: UM.Theme.getColor("monitor_text_link") - text: catalog.i18nc("@label link to connect manager", "Go to Cura Connect") + text: catalog.i18nc("@label link to connect manager", "Manage in browser") renderType: Text.NativeRendering } } @@ -73,7 +72,7 @@ Item MouseArea { anchors.fill: manageQueueLabel - onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() + onClicked: OutputDevice.openPrintJobControlPanel() onEntered: { manageQueueText.font.underline = true @@ -196,8 +195,7 @@ Item color: UM.Theme.getColor("monitor_card_background") border.color: UM.Theme.getColor("monitor_card_border") radius: 2 * screenScaleFactor // TODO: Theme! - - visible: printJobList.model.length == 0 + visible: OutputDevice.printJobs.length == 0 Row { @@ -247,14 +245,14 @@ Item color: UM.Theme.getColor("monitor_text_link") font: UM.Theme.getFont("medium") // 14pt, regular linkColor: UM.Theme.getColor("monitor_text_link") - text: catalog.i18nc("@label link to connect manager", "View print history") + text: catalog.i18nc("@label link to connect manager", "Manage in browser") renderType: Text.NativeRendering } MouseArea { anchors.fill: parent hoverEnabled: true - onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() + onClicked: OutputDevice.openPrintJobControlPanel() onEntered: { viewPrintHistoryText.font.underline = true diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index dcbeeb4626..34f062671f 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -16,6 +16,7 @@ from UM.Message import Message from UM.PluginRegistry import PluginRegistry from UM.Qt.Duration import Duration, DurationFormat from UM.Scene.SceneNode import SceneNode +from UM.Version import Version from cura.CuraApplication import CuraApplication from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice @@ -49,6 +50,9 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # The interval with which the remote clusters are checked CHECK_CLUSTER_INTERVAL = 10.0 # seconds + # The minimum version of firmware that support print job actions over cloud. + PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.3.0") + # Signal triggered when the print jobs in the queue were changed. printJobsChanged = pyqtSignal() @@ -360,6 +364,13 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): ).show() self.writeFinished.emit() + ## Whether the printer that this output device represents supports print job actions via the cloud. + @pyqtProperty(bool, notify = _clusterPrintersChanged) + def supportsPrintJobActions(self) -> bool: + version_number = self.printers[0].firmwareVersion.split(".") + firmware_version = Version([version_number[0], version_number[1], version_number[2]]) + return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION + ## Gets the number of printers in the cluster. # We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it. @pyqtProperty(int, notify = _clusterPrintersChanged) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py index 79050521af..4a3823ccca 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py @@ -91,7 +91,6 @@ class CloudClusterPrintJobStatus(BaseCloudModel): def createOutputModel(self, controller: CloudOutputController) -> UM3PrintJobOutputModel: model = UM3PrintJobOutputModel(controller, self.uuid, self.name) self.updateOutputModel(model) - return model ## Creates a new configuration model diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 3f3cd4cdd6..6fbb115601 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -140,6 +140,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() + ## Whether the printer that this output device represents supports print job actions via the local network. + @pyqtProperty(bool, constant=True) + def supportsPrintJobActions(self) -> bool: + return True + @pyqtProperty(int, constant=True) def clusterSize(self) -> int: return self._cluster_size diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index be7bb1006a..e49077d66d 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -27,7 +27,7 @@ from UM.Version import Version from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice from .Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager -from .Cloud.CloudOutputDevice import CloudOutputDevice # typing +from .Cloud.CloudOutputDevice import CloudOutputDevice # typing if TYPE_CHECKING: from PyQt5.QtNetwork import QNetworkReply From 0513322f86f91e60d6ff7c0cce54b9b832bec610 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:36:56 +0200 Subject: [PATCH 4/7] Fix expected controller options in test --- .../UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py index d11cfa8a0e..352efb292e 100644 --- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py @@ -72,9 +72,9 @@ class TestCloudOutputDevice(TestCase): controller_fields = { "_output_device": self.device, - "can_abort": False, + "can_abort": True, "can_control_manually": False, - "can_pause": False, + "can_pause": True, "can_pre_heat_bed": False, "can_pre_heat_hotends": False, "can_send_raw_gcode": False, From baf9dc041cf56567c97f9ac17a469b1faf012556 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:56:45 +0200 Subject: [PATCH 5/7] Fix typing of Any --- plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index 4edb30db23..f1fd6f8b7c 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -100,7 +100,7 @@ class CloudApiClient: # \param cluster_id: The ID of the cluster. # \param cluster_job_id: The ID of the print job within the cluster. # \param action: The name of the action to execute. - def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, any] = None) -> None: + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, Any] = None) -> None: body = b"" if data: try: From 1ab109ade00721604270ffb84f758b58ed172d33 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 13:46:20 +0200 Subject: [PATCH 6/7] Fix 'resume' action --- plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml index 771bd4b8cf..fbae66117e 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml @@ -81,7 +81,7 @@ Item enabled: visible && !(printJob.state == "pausing" || printJob.state == "resuming"); onClicked: { if (printJob.state == "paused") { - printJob.setState("print"); + printJob.setState("resume"); popUp.close(); return; } From 1d09cb5b9cf7a76d6b30d8e701dff0f2fffc663f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 24 Jun 2019 13:18:27 +0200 Subject: [PATCH 7/7] Fix typing for optional data argument Co-Authored-By: Jaime van Kessel --- plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index f1fd6f8b7c..d55fd8ab28 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -100,7 +100,7 @@ class CloudApiClient: # \param cluster_id: The ID of the cluster. # \param cluster_job_id: The ID of the print job within the cluster. # \param action: The name of the action to execute. - def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, Any] = None) -> None: + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Optional[Dict[str, Any]] = None) -> None: body = b"" if data: try: