diff --git a/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py b/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py index 87d0e8bce2..69163f9cdf 100644 --- a/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py +++ b/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py @@ -44,7 +44,7 @@ class DFFileExportAndUploadManager: self._library_project_id = library_project_id # type: str self._library_project_name = library_project_name # type: str self._file_name = file_name # type: str - + self._upload_jobs = [] # type: List[ExportFileJob] self._formats = formats # type: List[str] self._api = DigitalFactoryApiClient(application = CuraApplication.getInstance(), on_error = lambda error: Logger.log("e", str(error))) @@ -81,6 +81,8 @@ class DFFileExportAndUploadManager: ) self._generic_success_message.actionTriggered.connect(self._onMessageActionTriggered) + + def _onCuraProjectFileExported(self, job: ExportFileJob) -> None: """Handler for when the DF Library workspace file (3MF) has been created locally. @@ -318,8 +320,13 @@ class DFFileExportAndUploadManager: QDesktopServices.openUrl(QUrl(project_url)) message.hide() + def start(self) -> None: + for job in self._upload_jobs: + job.start() + def initializeFileUploadJobMetadata(self) -> Dict[str, Any]: metadata = {} + self._upload_jobs = [] if "3mf" in self._formats and "3mf" in self._file_handlers and self._file_handlers["3mf"]: filename_3mf = self._file_name + ".3mf" metadata[filename_3mf] = { @@ -340,7 +347,7 @@ class DFFileExportAndUploadManager: } job_3mf = ExportFileJob(self._file_handlers["3mf"], self._nodes, self._file_name, "3mf") job_3mf.finished.connect(self._onCuraProjectFileExported) - job_3mf.start() + self._upload_jobs.append(job_3mf) if "ufp" in self._formats and "ufp" in self._file_handlers and self._file_handlers["ufp"]: filename_ufp = self._file_name + ".ufp" @@ -362,5 +369,5 @@ class DFFileExportAndUploadManager: } job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp") job_ufp.finished.connect(self._onPrintFileExported) - job_ufp.start() + self._upload_jobs.append(job_ufp) return metadata diff --git a/plugins/DigitalLibrary/src/DigitalFactoryController.py b/plugins/DigitalLibrary/src/DigitalFactoryController.py index 33fcc506e7..8f65faa2a3 100644 --- a/plugins/DigitalLibrary/src/DigitalFactoryController.py +++ b/plugins/DigitalLibrary/src/DigitalFactoryController.py @@ -541,6 +541,7 @@ class DigitalFactoryController(QObject): on_upload_success = self.uploadFileSuccess.emit, on_upload_finished = self.uploadFileFinished.emit, on_upload_progress = self.uploadFileProgress.emit) + self.file_upload_manager.start() # Save the project id to make sure it will be preselected the next time the user opens the save dialog self._current_workspace_information.setEntryToStore("digital_factory", "library_project_id", library_project_id) diff --git a/plugins/DigitalLibrary/tests/TestDFFileExportAndUploadManager.py b/plugins/DigitalLibrary/tests/TestDFFileExportAndUploadManager.py index e2227100b4..4c4ef95134 100644 --- a/plugins/DigitalLibrary/tests/TestDFFileExportAndUploadManager.py +++ b/plugins/DigitalLibrary/tests/TestDFFileExportAndUploadManager.py @@ -7,10 +7,18 @@ from src.DFFileExportAndUploadManager import DFFileExportAndUploadManager @pytest.fixture def upload_manager(): file_handler = MagicMock(name = "file_handler") + file_handler.getSupportedFileTypesWrite = MagicMock(return_value = [{ + "id": "test", + "extension": ".3mf", + "description": "nope", + "mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + "mode": "binary", + "hide_in_file_dialog": True, + }]) node = MagicMock(name = "SceneNode") application = MagicMock(name = "CuraApplication") with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): - return DFFileExportAndUploadManager(file_handlers = {"test": file_handler}, + return DFFileExportAndUploadManager(file_handlers = {"3mf": file_handler}, nodes = [node], library_project_id = "test_library_project_id", library_project_name = "test_library_project_name", @@ -30,3 +38,11 @@ def upload_manager(): def test_extractErrorTitle(upload_manager, input, expected_result): assert upload_manager.extractErrorTitle(input) == expected_result + +def test_exportJobError(upload_manager): + mocked_application = MagicMock() + with patch("UM.Application.Application.getInstance", MagicMock(return_value=mocked_application)): + upload_manager._onJobExportError("file_name.3mf") + + # Ensure that message was displayed + mocked_application.showMessageSignal.emit.assert_called_once() \ No newline at end of file