From 6e4d28d3a8b59b7937714bcb10435a91e5493f8d Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Sun, 7 Dec 2025 20:34:29 +0100 Subject: [PATCH] =?UTF-8?q?Defensive=20Null-Checks=20in=20MainWindow=20hin?= =?UTF-8?q?zugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ergänzt umfassende Existenzprüfungen für pdf_project, project und nodes-Attribute vor dem Zugriff, um NoneType-Fehler zu vermeiden. Verbessert die Robustheit der Anwendung bei nicht initialisierten Projekten. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- src/ui/MainWindow.py | 56 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index bcb9b87..6dbd806 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -1199,6 +1199,11 @@ class MainWindow(QMainWindow): QMessageBox.warning(self, "Warnung", "Kein gültiger TreeNode gefunden.") return + # Prüfe ob Projekt verfügbar ist + if not self.pdf_project: + QMessageBox.warning(self, "Warnung", "Keine Projekt-Einstellungen verfügbar.") + return + # Sammle Eltern-Parameter parent_params = self._collect_parent_params(item) @@ -1520,6 +1525,10 @@ class MainWindow(QMainWindow): bool: True wenn die XML-Datei noch anderswo verwendet wird """ try: + # Prüfe ob pdf_project und nodes existieren + if not self.pdf_project or not self.pdf_project.nodes: + return False # Keine Nodes vorhanden, also nicht verwendet + return self._check_xml_usage_recursive(self.pdf_project.nodes, xml_path, exclude_xsl_file) except Exception as e: print(f"Fehler beim Prüfen der XML-Datei-Verwendung: {e}") @@ -1734,15 +1743,20 @@ class MainWindow(QMainWindow): print(f"Neue Nodes Dictionary erstellt: {len(new_nodes_dict)} Einträge") # Merge mit vorhandenen Nodes - if self.pdf_project.nodes: + if self.pdf_project and self.pdf_project.nodes: self._merge_nodes_recursive(self.pdf_project.nodes, new_nodes_dict) # Füge komplett neue Root-Nodes hinzu - existing_root_ids = {node.id for node in self.pdf_project.nodes} - for new_node in new_nodes: - if new_node.id not in existing_root_ids: - self.pdf_project.nodes.append(new_node) - print(f"Neue Root-Node hinzugefügt: {new_node.bez}") + if self.pdf_project and self.pdf_project.nodes: + existing_root_ids = {node.id for node in self.pdf_project.nodes} + for new_node in new_nodes: + if new_node.id not in existing_root_ids: + self.pdf_project.nodes.append(new_node) + print(f"Neue Root-Node hinzugefügt: {new_node.bez}") + elif self.pdf_project: + # Wenn keine Nodes vorhanden sind, füge alle neuen Nodes hinzu + self.pdf_project.nodes = new_nodes + print(f"Alle {len(new_nodes)} Root-Nodes hinzugefügt (keine vorhandenen Nodes)") print("Merge abgeschlossen") @@ -1846,6 +1860,15 @@ class MainWindow(QMainWindow): current_project: Das aktuelle Projekt """ try: + # Prüfe ob pdf_project und project existieren + if not self.pdf_project: + print("Keine Projekt-Einstellungen zum Speichern verfügbar") + return + + if not self.project or not self.project.project_dir: + print("Kein Projekt-Verzeichnis zum Speichern verfügbar") + return + start_time = time.time() # Speichere in project.yaml im Projekt-Verzeichnis @@ -1999,6 +2022,11 @@ class MainWindow(QMainWindow): QMessageBox.critical(self, "Fehler", f"Die XML-Datei existiert nicht:\n{xml_file_path}") return + # Prüfe ob Projekt-Nodes verfügbar sind + if not self.pdf_project or not self.pdf_project.nodes: + QMessageBox.warning(self, "Warnung", "Keine Projekt-Nodes verfügbar für die Zuordnung.") + return + # Öffne den Dialog zur Zuordnung zu XSL-Knoten dialog = XmlToXslAssignDialog( parent=self, @@ -2075,6 +2103,11 @@ class MainWindow(QMainWindow): logger.info(f"Starte Hash-Berechnung für {len(xml_files)} XML-Dateien") + # Prüfe ob Projekt verfügbar ist + if not self.project or not self.project.project_dir: + logger.warning("Kein Projekt-Verzeichnis für Hash-Berechnung verfügbar") + return + # Stoppe vorherigen Thread falls noch aktiv if self.hash_calculator_thread and self.hash_calculator_thread.isRunning(): self.hash_calculator_thread.quit() @@ -2193,6 +2226,11 @@ class MainWindow(QMainWindow): logger.debug(f"Hash bereits vorhanden für {xml_file.xml}: {xml_file.hashsum}") return + # Prüfe ob Projekt verfügbar ist + if not self.project or not self.project.project_dir: + logger.warning("Kein Projekt-Verzeichnis für Hash-Berechnung verfügbar") + return + xml_file_path = Path(self.project.project_dir) / xml_file.xml if not xml_file_path.exists(): @@ -2434,6 +2472,12 @@ class MainWindow(QMainWindow): file_hash: Berechneter Hash der Datei """ try: + # Prüfe ob Projekt verfügbar ist + if not self.project or not self.project.project_dir: + logger.error("Kein Projekt-Verzeichnis für neue XML-Datei verfügbar") + QMessageBox.critical(self, "Fehler", "Kein Projekt-Verzeichnis verfügbar.") + return + # Erstelle xml-Ordner im Projekt-Verzeichnis falls er nicht existiert xml_dir = Path(self.project.project_dir) / "xml" xml_dir.mkdir(parents=True, exist_ok=True)