From 170b25749cce04f3e2c96c6015dc8d0a4c89c51a Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 12 Sep 2024 11:36:46 +0200 Subject: [PATCH 01/11] add timestamp to curaAction --- cura/CuraActions.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 835c46bba8..5181f4267f 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -32,6 +32,8 @@ from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOper from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode +from datetime import datetime + class CuraActions(QObject): def __init__(self, parent: QObject = None) -> None: super().__init__(parent) @@ -280,3 +282,7 @@ class CuraActions(QObject): def _openUrl(self, url: QUrl) -> None: QDesktopServices.openUrl(url) + + def supportProjectTag(self): + timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") + return f"exported-project-for-support-{timestamp}" From 3c1e26d5352e24604e0d7c1606aff9bd33f91c75 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 12 Sep 2024 11:37:06 +0200 Subject: [PATCH 02/11] define action in qml and add alias --- resources/qml/Actions.qml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 7acf39ecb2..9c1c7cdd9d 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -78,6 +78,7 @@ Item property alias paste: pasteAction property alias copy: copyAction property alias cut: cutAction + property alias exportProjectForSupport: exportProjectForSupportAction readonly property bool copy_paste_enabled: { const all_enabled_packages = CuraApplication.getPackageManager().allEnabledPackages; @@ -558,4 +559,21 @@ Item text: "&Marketplace" icon.name: "plugins_browse" } + + Action + { + id: exportProjectForSupportAction + text: catalog.i18nc("@action:inmenu menubar:help","Export Project For Support") + onTriggered: + { + var supportName = CuraActions.supportProjectTag() + var args = { + "filter_by_machine": false, + "file_type": "workspace", + "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], + }; + UM.OutputDeviceManager.requestWriteToDevice("local_file", supportName, args) + } + } } From 552686cdb7266c05136449389bc861eb6525b651 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 12 Sep 2024 11:37:23 +0200 Subject: [PATCH 03/11] add the menu item under help --- resources/qml/Menus/HelpMenu.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Menus/HelpMenu.qml b/resources/qml/Menus/HelpMenu.qml index 6a57a99515..39b7c24b25 100644 --- a/resources/qml/Menus/HelpMenu.qml +++ b/resources/qml/Menus/HelpMenu.qml @@ -19,6 +19,8 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.reportBug } Cura.MenuItem { action: Cura.Actions.openSponsershipPage } Cura.MenuSeparator { } + Cura.MenuItem { action: Cura.Actions.exportProjectForSupport } + Cura.MenuSeparator { } Cura.MenuItem { action: Cura.Actions.whatsNew } Cura.MenuItem { action: Cura.Actions.about } } \ No newline at end of file From 1e3fbc4ef21a4f4f5713c92cb0ead0b187229330 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 12 Sep 2024 12:25:30 +0200 Subject: [PATCH 04/11] add @pyqtslot --- cura/CuraActions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 5181f4267f..fce4eda0f0 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -283,6 +283,7 @@ class CuraActions(QObject): def _openUrl(self, url: QUrl) -> None: QDesktopServices.openUrl(url) + @pyqtSlot() def supportProjectTag(self): timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") return f"exported-project-for-support-{timestamp}" From b91051e5946734675e6b87c642cb05b34effe2bb Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 12 Sep 2024 14:58:06 +0200 Subject: [PATCH 05/11] fix indent --- resources/qml/Actions.qml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 9c1c7cdd9d..72abc2a73a 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -564,16 +564,16 @@ Item { id: exportProjectForSupportAction text: catalog.i18nc("@action:inmenu menubar:help","Export Project For Support") - onTriggered: - { - var supportName = CuraActions.supportProjectTag() - var args = { - "filter_by_machine": false, - "file_type": "workspace", - "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", - "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], - }; - UM.OutputDeviceManager.requestWriteToDevice("local_file", supportName, args) - } + onTriggered: + { + var supportName = CuraActions.supportProjectTag() + var args = { + "filter_by_machine": false, + "file_type": "workspace", + "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], + }; + UM.OutputDeviceManager.requestWriteToDevice("local_file", supportName, args) + } } } From ae821e6e990e7a0e5f02311b7ec59e97be301dcd Mon Sep 17 00:00:00 2001 From: HellAholic Date: Mon, 16 Sep 2024 14:28:33 +0200 Subject: [PATCH 06/11] add result to pyqtslot and indicate the return value type --- cura/CuraActions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index fce4eda0f0..b1db10ffcc 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -283,7 +283,7 @@ class CuraActions(QObject): def _openUrl(self, url: QUrl) -> None: QDesktopServices.openUrl(url) - @pyqtSlot() - def supportProjectTag(self): + @pyqtSlot(result=str) + def supportProjectTag(self) -> str: timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") return f"exported-project-for-support-{timestamp}" From 6313e9cc482e0306fa8bd89ab45b0cb100940724 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Mon, 16 Sep 2024 14:28:54 +0200 Subject: [PATCH 07/11] Rename variable to exportName for clarity --- resources/qml/Actions.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 09e3837c28..7ec5bf9232 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -557,14 +557,14 @@ Item text: catalog.i18nc("@action:inmenu menubar:help","Export Project For Support") onTriggered: { - var supportName = CuraActions.supportProjectTag() + var exportName = CuraActions.supportProjectTag() var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], }; - UM.OutputDeviceManager.requestWriteToDevice("local_file", supportName, args) + UM.OutputDeviceManager.requestWriteToDevice("local_file", exportName, args) } } } From 8d2bef86d65225b280afdd6a81d2ca54ea26cfda Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 27 Sep 2024 12:17:34 +0200 Subject: [PATCH 08/11] Calculate file name directly in QML CURA-12138 --- cura/CuraActions.py | 7 ------- resources/qml/Actions.qml | 5 +++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index b1db10ffcc..835c46bba8 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -32,8 +32,6 @@ from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOper from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode -from datetime import datetime - class CuraActions(QObject): def __init__(self, parent: QObject = None) -> None: super().__init__(parent) @@ -282,8 +280,3 @@ class CuraActions(QObject): def _openUrl(self, url: QUrl) -> None: QDesktopServices.openUrl(url) - - @pyqtSlot(result=str) - def supportProjectTag(self) -> str: - timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") - return f"exported-project-for-support-{timestamp}" diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 7ec5bf9232..4cf38296f5 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -554,15 +554,16 @@ Item Action { id: exportProjectForSupportAction - text: catalog.i18nc("@action:inmenu menubar:help","Export Project For Support") + text: catalog.i18nc("@action:inmenu menubar:help", "Export Project For Support") onTriggered: { - var exportName = CuraActions.supportProjectTag() + var exportName = Qt.formatDateTime(new Date(), "'export-'yyyyMMdd-HHmmss") var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], + "silent_save": true, }; UM.OutputDeviceManager.requestWriteToDevice("local_file", exportName, args) } From f28482ebacd3a15beadaccaad7e4a9d375015ef8 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 27 Sep 2024 15:38:27 +0200 Subject: [PATCH 09/11] Include log file when exporting project file for support CURA-12138 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 24 ++++++++++++++++++--- resources/qml/Actions.qml | 3 +++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 2536f5dacb..f7bdf584b2 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -8,9 +8,11 @@ from io import StringIO from threading import Lock import zipfile from typing import Dict, Any +from pathlib import Path from UM.Application import Application from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry from UM.Preferences import Preferences from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Workspace.WorkspaceWriter import WorkspaceWriter @@ -33,7 +35,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): if self._ucp_model != model: self._ucp_model = model - def _write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode): + def _write(self, stream, nodes, mode, include_log): application = Application.getInstance() machine_manager = application.getMachineManager() @@ -79,6 +81,11 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): if self._ucp_model is not None: user_settings_data = self._getUserSettings(self._ucp_model) ThreeMFWriter._storeMetadataJson(user_settings_data, archive, USER_SETTINGS_PATH) + + # Write log file + if include_log: + ThreeMFWorkspaceWriter._writeLogFile(archive) + except PermissionError: self.setInformation(catalog.i18nc("@error:zip", "No permission to write the workspace here.")) Logger.error("No permission to write workspace to this stream.") @@ -125,8 +132,8 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): return True - def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode): - success = self._write(stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode) + def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode, **kwargs): + success = self._write(stream, nodes, WorkspaceWriter.OutputMode.BinaryMode, kwargs.get("include_log", False)) self._ucp_model = None return success @@ -191,6 +198,17 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): Logger.error("File became inaccessible while writing to it: {archive_filename}".format(archive_filename = archive.fp.name)) return + @staticmethod + def _writeLogFile(archive): + """Helper function that writes the Cura log file to the archive. + + :param archive: The archive to write to. + """ + file_logger = PluginRegistry.getInstance().getPluginObject("FileLogger") + file_logger.flush() + for file_path in file_logger.getFilesPaths(): + archive.write(file_path, arcname=f"log/{Path(file_path).name}") + @staticmethod def _getUserSettings(model: SettingsExportModel) -> Dict[str, Dict[str, Any]]: user_settings = {} diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 4cf38296f5..527f1fbf4b 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -564,6 +564,9 @@ Item "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", "limit_mimetypes": ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], "silent_save": true, + "writer_args": { + "include_log": true + } }; UM.OutputDeviceManager.requestWriteToDevice("local_file", exportName, args) } From fe5b4bac24764836b0e525588395f78e82dbb9b9 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 30 Sep 2024 11:40:01 +0200 Subject: [PATCH 10/11] Add missing typing CURA-12138 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index f7bdf584b2..1b24e59309 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -9,6 +9,7 @@ from threading import Lock import zipfile from typing import Dict, Any from pathlib import Path +from zipfile import ZipFile from UM.Application import Application from UM.Logger import Logger @@ -199,7 +200,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): return @staticmethod - def _writeLogFile(archive): + def _writeLogFile(archive: ZipFile) -> None: """Helper function that writes the Cura log file to the archive. :param archive: The archive to write to. From 2865836b8aa1064de81cf006de85053907179cdb Mon Sep 17 00:00:00 2001 From: HellAholic Date: Mon, 7 Oct 2024 15:22:47 +0200 Subject: [PATCH 11/11] Change option name to Export Package For Technical Support --- resources/qml/Actions.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 527f1fbf4b..1ae0802be7 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -554,7 +554,7 @@ Item Action { id: exportProjectForSupportAction - text: catalog.i18nc("@action:inmenu menubar:help", "Export Project For Support") + text: catalog.i18nc("@action:inmenu menubar:help", "Export Package For Technical Support") onTriggered: { var exportName = Qt.formatDateTime(new Date(), "'export-'yyyyMMdd-HHmmss")