From afff427f678bbd5285182f4c5978a0fa4b2b81bb Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Thu, 22 Jan 2026 19:37:53 +0100 Subject: [PATCH] =?UTF-8?q?Feature:=20Pr=C3=BCfung=20auf=20Existenz=20von?= =?UTF-8?q?=20XML-=20und=20XSL-Dateien=20vor=20Transformation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Prüfe ob XML- und XSL-Dateien existieren bevor TransformationJobs erstellt werden - Zeige detaillierte Fehlermeldungen wenn Dateien fehlen - Zähle und melde übersprungene Jobs bei Batch-Verarbeitung - Verhindere mehrfache Fehlerdialoge durch zentrale Fehlerbehandlung - Logge fehlende Dateien mit vollständigen Pfaden für einfaches Debugging --- src/ui/mixins/transformation.py | 66 ++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/ui/mixins/transformation.py b/src/ui/mixins/transformation.py index 7197f0f..efe348c 100644 --- a/src/ui/mixins/transformation.py +++ b/src/ui/mixins/transformation.py @@ -108,6 +108,13 @@ class TransformationMixin: # Erstelle TransformationJob mit TreeWidgetItem-Kontext für Parameter-Sammlung job = self._create_transformation_job(xsl_file_obj, xml_file_obj, parent_item) if not job: + QMessageBox.warning( + self, + "Fehler", + "Transformation kann nicht gestartet werden.\n\n" + "Bitte überprüfen Sie, ob XML- und XSL-Dateien existieren.\n" + "Details finden Sie im Log.", + ) return # Starte Transformation in separatem Thread @@ -140,16 +147,35 @@ class TransformationMixin: # Erstelle TransformationJobs für alle XML-Dateien jobs = [] + skipped_count = 0 for xml_file_obj in xsl_file_obj.xmls: # Übergebe das XslFile-TreeWidgetItem für Parameter-Sammlung job = self._create_transformation_job(xsl_file_obj, xml_file_obj, item) if job: jobs.append(job) + else: + skipped_count += 1 if not jobs: - QMessageBox.warning(self, "Fehler", "Konnte keine Transformations-Jobs erstellen") + QMessageBox.warning( + self, + "Fehler", + f"Konnte keine gültigen Transformations-Jobs erstellen.\n\n" + f"{skipped_count} XML-Datei(en) wurden übersprungen (fehlende Dateien).", + ) return + # Informiere Benutzer wenn einige Jobs übersprungen wurden + if skipped_count > 0: + logger.warning(f"{skipped_count} von {len(xsl_file_obj.xmls)} Jobs übersprungen (fehlende Dateien)") + QMessageBox.warning( + self, + "Warnung", + f"{skipped_count} von {len(xsl_file_obj.xmls)} XML-Datei(en) werden übersprungen " + f"(fehlende XML- oder XSL-Dateien).\n\n" + f"{len(jobs)} Job(s) werden ausgeführt.", + ) + # Starte Transformation in separatem Thread self._start_transformation(jobs, force=force) @@ -311,16 +337,35 @@ class TransformationMixin: # Erstelle TransformationJobs für alle XML-Dateien jobs = [] + skipped_count = 0 for xsl_file_obj, xml_file_obj, xsl_file_item in xsl_xml_pairs: # Übergebe das XslFile-TreeWidgetItem für Parameter-Sammlung job = self._create_transformation_job(xsl_file_obj, xml_file_obj, xsl_file_item) if job: jobs.append(job) + else: + skipped_count += 1 if not jobs: - QMessageBox.warning(self, "Fehler", "Konnte keine Transformations-Jobs erstellen") + QMessageBox.warning( + self, + "Fehler", + f"Konnte keine gültigen Transformations-Jobs erstellen.\n\n" + f"{skipped_count} XML-Datei(en) wurden übersprungen (fehlende Dateien).", + ) return + # Informiere Benutzer wenn einige Jobs übersprungen wurden + if skipped_count > 0: + logger.warning(f"{skipped_count} von {len(xsl_xml_pairs)} Jobs übersprungen (fehlende Dateien)") + QMessageBox.warning( + self, + "Warnung", + f"{skipped_count} von {len(xsl_xml_pairs)} XML-Datei(en) werden übersprungen " + f"(fehlende XML- oder XSL-Dateien).\n\n" + f"{len(jobs)} Job(s) werden ausgeführt.", + ) + logger.info(f"Starte Transformation für {len(jobs)} XML-Dateien unter TreeNode '{tree_node_obj.bez}'") # Starte Transformation in separatem Thread @@ -399,6 +444,23 @@ class TransformationMixin: # Erstelle absoluten Pfad zur XSL-Datei xsl_file_abs = xsl_dir.path_to_root_dir / xsl_file_obj.xsl_file + # Prüfe ob XSL-Datei existiert + if not xsl_file_abs.exists(): + error_msg = f"XSL-Datei nicht gefunden: {xsl_file_abs}" + logger.error(error_msg) + # Kein MessageBox hier - wird in der aufrufenden Funktion behandelt + return None + + # Erstelle absoluten Pfad zur XML-Datei + xml_file_abs = self.project.project_dir / xml_file_obj.xml + + # Prüfe ob XML-Datei existiert + if not xml_file_abs.exists(): + error_msg = f"XML-Datei nicht gefunden: {xml_file_abs}" + logger.error(error_msg) + # Kein MessageBox hier - wird in der aufrufenden Funktion behandelt + return None + # Sammle XSLT-Parameter hierarchisch (TreeNode-Eltern → XslFile) xslt_params = {}