Logging: print()-Aufrufe durch strukturierte Logger-Ausgaben ersetzen

Alle print()-Statements in MainWindow.py (~88) und XmlToXslAssignDialog.py (5) wurden durch passende Logger-Aufrufe ersetzt. Die Log-Level (debug, info, warning, error) wurden entsprechend der Nachrichtenart gewählt. XmlToXslAssignDialog.py erhielt zudem einen Logger-Import.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-20 19:39:23 +01:00
parent 984f08cfc5
commit 3fa9a1dac0
2 changed files with 134 additions and 130 deletions
+125 -125
View File
@@ -295,8 +295,8 @@ class MainWindow(QMainWindow):
available_themes = QStyleFactory.keys()
current_theme = QApplication.style().objectName()
print(f"Verfügbare Themes: {available_themes}")
print(f"Aktuelles Theme: {current_theme}")
logger.debug(f"Verfügbare Themes: {available_themes}")
logger.debug(f"Aktuelles Theme: {current_theme}")
# Füge Theme-Aktionen zum Menü hinzu
for theme_name in available_themes:
@@ -342,7 +342,7 @@ class MainWindow(QMainWindow):
# Setze das Untermenü für die Aktion
self.ui.actionVorhandene_Projekte.setMenu(projects_menu)
print(f"Projekte-Menü initialisiert mit {len(app_settings.pdf_projects)} Projekten")
logger.info(f"Projekte-Menü initialisiert mit {len(app_settings.pdf_projects)} Projekten")
def open_existing_project(self, project: Project):
"""
@@ -351,8 +351,8 @@ class MainWindow(QMainWindow):
Args:
project: Das zu öffnende PdfProject-Objekt
"""
print(f"Öffne Projekt: {project.name}")
print(f"Projekt-Ordner: {project.project_dir}")
logger.info(f"Öffne Projekt: {project.name}")
logger.debug(f"Projekt-Ordner: {project.project_dir}")
self.project = project
@@ -363,15 +363,15 @@ class MainWindow(QMainWindow):
if project_yaml_path.exists() and project_yaml_path.stat().st_size > 0:
# Versuche die Projekt-Einstellungen zu laden
self.pdf_project = ProjectData.readSettings(project_dir=project.project_dir)
print(f"Projekt-Einstellungen aus {project_yaml_path} geladen!")
logger.info(f"Projekt-Einstellungen aus {project_yaml_path} geladen!")
else:
# Erstelle Standard-Projekt-Einstellungen wenn Datei leer oder nicht vorhanden
print("project.yaml ist leer oder nicht vorhanden, erstelle Standard-Einstellungen")
logger.warning("project.yaml ist leer oder nicht vorhanden, erstelle Standard-Einstellungen")
self.pdf_project = ProjectData()
# Speichere die Standard-Einstellungen in die project.yaml
self.pdf_project.writeSettings(project_dir=project.project_dir)
print(f"Standard-Projekt-Einstellungen in {project_yaml_path} gespeichert")
logger.info(f"Standard-Projekt-Einstellungen in {project_yaml_path} gespeichert")
# Lade die Nodes in das TreeWidget (inkl. Diff-PDF-Counts und Icons)
self._load_nodes_to_tree()
@@ -380,15 +380,15 @@ class MainWindow(QMainWindow):
self._start_xml_hash_calculation()
except Exception as e:
print(f"Fehler beim Laden des Projekts '{project.name}': {e}")
logger.error(f"Fehler beim Laden des Projekts '{project.name}': {e}")
# Fallback: Erstelle Standard-Einstellungen
try:
self.pdf_project = ProjectData()
print("Fallback: Standard-Projekt-Einstellungen erstellt")
logger.info("Fallback: Standard-Projekt-Einstellungen erstellt")
# Auch bei Fallback die Nodes laden
self._load_nodes_to_tree()
except Exception as fallback_error:
print(f"Fehler beim Erstellen der Fallback-Einstellungen: {fallback_error}")
logger.error(f"Fehler beim Erstellen der Fallback-Einstellungen: {fallback_error}")
def change_theme(self, theme_name):
"""
@@ -397,7 +397,7 @@ class MainWindow(QMainWindow):
Args:
theme_name: Name des zu verwendenden Themes
"""
print(f"Wechsle zu Theme: {theme_name}")
logger.info(f"Wechsle zu Theme: {theme_name}")
try:
# Erstelle den neuen Style
@@ -410,14 +410,14 @@ class MainWindow(QMainWindow):
for action in self.ui.menuThema.actions():
action.setChecked(action.text() == theme_name)
print(f"Theme erfolgreich gewechselt zu: {theme_name}")
logger.info(f"Theme erfolgreich gewechselt zu: {theme_name}")
app_settings.theme = theme_name
app_settings.save()
else:
print(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden")
logger.error(f"Fehler: Theme '{theme_name}' konnte nicht erstellt werden")
except Exception as e:
print(f"Fehler beim Wechseln des Themes: {e}")
logger.error(f"Fehler beim Wechseln des Themes: {e}")
def _load_images(self):
"""Lädt PDF-Thumbnails und bereitet On-Demand-Rendering vor."""
@@ -440,16 +440,16 @@ class MainWindow(QMainWindow):
# Prüfe ob diff-Ordner existiert und PDF-Dateien enthält
if not os.path.exists(diff_dir):
print(f"Diff-Ordner nicht gefunden: {diff_dir}")
logger.warning(f"Diff-Ordner nicht gefunden: {diff_dir}")
return
# Finde alle PDF-Dateien im diff-Ordner
diff_pdfs = glob.glob(os.path.join(diff_dir, "*.pdf"))
if not diff_pdfs:
print("Keine PDF-Dateien im diff-Ordner gefunden")
logger.warning("Keine PDF-Dateien im diff-Ordner gefunden")
return
print(f"Gefundene PDF-Dateien im diff-Ordner: {diff_pdfs}")
logger.debug(f"Gefundene PDF-Dateien im diff-Ordner: {diff_pdfs}")
# Für jede PDF-Datei im diff-Ordner
for diff_pdf_path in diff_pdfs:
@@ -459,10 +459,10 @@ class MainWindow(QMainWindow):
# Prüfe ob gleichnamige PDFs in ref und new existieren
if not os.path.exists(ref_pdf_path):
print(f"Referenz-PDF nicht gefunden: {ref_pdf_path}")
logger.warning(f"Referenz-PDF nicht gefunden: {ref_pdf_path}")
continue
if not os.path.exists(new_pdf_path):
print(f"New-PDF nicht gefunden: {new_pdf_path}")
logger.warning(f"New-PDF nicht gefunden: {new_pdf_path}")
continue
try:
@@ -482,16 +482,16 @@ class MainWindow(QMainWindow):
or ref_doc.status() != QPdfDocument.Status.Ready
or new_doc.status() != QPdfDocument.Status.Ready
):
print(f"Fehler beim Laden der PDFs für {pdf_filename}")
logger.error(f"Fehler beim Laden der PDFs für {pdf_filename}")
continue
# PDF-Dokumente für später speichern
self.pdf_documents[pdf_filename] = {"diff": diff_doc, "ref": ref_doc, "new": new_doc}
print(f"PDFs geladen: {pdf_filename}")
print(f" diff: {diff_doc.pageCount()} Seiten")
print(f" ref: {ref_doc.pageCount()} Seiten")
print(f" new: {new_doc.pageCount()} Seiten")
logger.info(f"PDFs geladen: {pdf_filename}")
logger.debug(f" diff: {diff_doc.pageCount()} Seiten")
logger.debug(f" ref: {ref_doc.pageCount()} Seiten")
logger.debug(f" new: {new_doc.pageCount()} Seiten")
# Nehme die Seitenzahl der diff-PDF als Basis
max_pages = diff_doc.pageCount()
@@ -533,17 +533,17 @@ class MainWindow(QMainWindow):
# Click-Event für das Thumbnail einrichten
thumbnail.mousePressEvent = lambda event, t=thumbnail: self.on_thumbnail_clicked(event, t)
print(f"Thumbnail für Seite {page_num + 1} erstellt")
logger.debug(f"Thumbnail für Seite {page_num + 1} erstellt")
thumbnail_time = time.time() - start_time
print(f"Performance: {max_pages} Thumbnails in {thumbnail_time:.3f}s")
logger.debug(f"Performance: {max_pages} Thumbnails in {thumbnail_time:.3f}s")
# Setze die erste PDF als aktuelle PDF
if self.current_pdf is None:
self.current_pdf = pdf_filename
except Exception as e:
print(f"Fehler beim Laden der PDFs: {e}")
logger.error(f"Fehler beim Laden der PDFs: {e}")
# Erstelle das eine Vollbild-Label für die rechte Spalte (immer erstellen)
if self.fullsize_label is None:
@@ -573,10 +573,10 @@ class MainWindow(QMainWindow):
pdf_filename: Name der PDF-Datei
page_num: Seitennummer (0-basiert)
"""
print(f"Rendere Seite {page_num + 1} von {pdf_filename}")
logger.debug(f"Rendere Seite {page_num + 1} von {pdf_filename}")
if pdf_filename not in self.pdf_documents:
print(f"PDF-Dokument {pdf_filename} nicht gefunden")
logger.warning(f"PDF-Dokument {pdf_filename} nicht gefunden")
return
start_time = time.time()
@@ -605,24 +605,24 @@ class MainWindow(QMainWindow):
if page_num < ref_doc.pageCount():
ref_image = ref_doc.render(page_num, render_size)
ref_pixmap = QPixmap.fromImage(ref_image)
print(f"Ref-Seite {page_num + 1} gerendert")
logger.debug(f"Ref-Seite {page_num + 1} gerendert")
else:
# Erstelle weiße Seite mit gleichen Abmessungen wie Diff-Seite
ref_pixmap = QPixmap(diff_width, diff_height)
ref_pixmap.fill(Qt.GlobalColor.white)
print(f"Weiße Ref-Seite {page_num + 1} erstellt")
logger.debug(f"Weiße Ref-Seite {page_num + 1} erstellt")
# New-Seite prüfen und rendern oder weiße Seite erstellen
new_doc = docs["new"]
if page_num < new_doc.pageCount():
new_image = new_doc.render(page_num, render_size)
new_pixmap = QPixmap.fromImage(new_image)
print(f"New-Seite {page_num + 1} gerendert")
logger.debug(f"New-Seite {page_num + 1} gerendert")
else:
# Erstelle weiße Seite mit gleichen Abmessungen wie Diff-Seite
new_pixmap = QPixmap(diff_width, diff_height)
new_pixmap.fill(Qt.GlobalColor.white)
print(f"Weiße New-Seite {page_num + 1} erstellt")
logger.debug(f"Weiße New-Seite {page_num + 1} erstellt")
# Cache die gerenderten Pixmaps für schnelle Alpha/Zoom-Operationen
self.current_rendered_pixmaps = {"ref": ref_pixmap, "diff": diff_pixmap, "new": new_pixmap}
@@ -635,7 +635,7 @@ class MainWindow(QMainWindow):
self.update_current_display()
render_time = time.time() - start_time
print(f"Performance: Seite {page_num + 1} gerendert in {render_time:.3f}s")
logger.debug(f"Performance: Seite {page_num + 1} gerendert in {render_time:.3f}s")
except Exception as e:
logger.error(f"Fehler beim Rendern der Seite {page_num + 1}: {e}", exc_info=True)
@@ -646,11 +646,11 @@ class MainWindow(QMainWindow):
Verwendet für Alpha- und Zoom-Änderungen ohne erneutes PDF-Rendering.
"""
if not self.current_rendered_pixmaps:
print("Keine gerenderten Pixmaps verfügbar")
logger.warning("Keine gerenderten Pixmaps verfügbar")
return
if self.fullsize_label is None:
print("Fullsize-Label ist nicht verfügbar")
logger.warning("Fullsize-Label ist nicht verfügbar")
return
try:
@@ -764,7 +764,7 @@ class MainWindow(QMainWindow):
# Aktiviere Kontextmenü für das TreeWidget
self.ui.treeWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.ui.treeWidget.customContextMenuRequested.connect(self._show_tree_context_menu)
print("Kontextmenü für TreeWidget eingerichtet")
logger.debug("Kontextmenü für TreeWidget eingerichtet")
def _setup_tree_widget_styling(self):
"""Richtet das Styling für das TreeWidget ein, um den vertikalen Abstand zu vergrößern."""
@@ -791,10 +791,10 @@ class MainWindow(QMainWindow):
# Wende das Stylesheet auf das TreeWidget an
self.ui.treeWidget.setStyleSheet(tree_stylesheet)
print("TreeWidget Styling für größeren vertikalen Abstand angewendet")
logger.debug("TreeWidget Styling für größeren vertikalen Abstand angewendet")
except Exception as e:
print(f"Fehler beim Anwenden des TreeWidget-Stylings: {e}")
logger.error(f"Fehler beim Anwenden des TreeWidget-Stylings: {e}")
def _show_tree_context_menu(self, position):
"""
@@ -854,7 +854,7 @@ class MainWindow(QMainWindow):
return self._determine_node_type_from_data(item)
except Exception as e:
print(f"Fehler beim Bestimmen des Node-Typs: {e}")
logger.error(f"Fehler beim Bestimmen des Node-Typs: {e}")
return "Unknown"
def _determine_node_type_from_data(self, item):
@@ -884,7 +884,7 @@ class MainWindow(QMainWindow):
return "Unknown"
except Exception as e:
print(f"Fehler beim Bestimmen des Node-Typs aus Daten: {e}")
logger.error(f"Fehler beim Bestimmen des Node-Typs aus Daten: {e}")
return "Unknown"
def _find_item_by_node(self, node_obj):
@@ -1095,7 +1095,7 @@ class MainWindow(QMainWindow):
return menu
except Exception as e:
print(f"Fehler beim Erstellen des Kontextmenüs: {e}")
logger.error(f"Fehler beim Erstellen des Kontextmenüs: {e}")
return None
def on_alpha_changed(self, alpha_value):
@@ -1106,13 +1106,13 @@ class MainWindow(QMainWindow):
Args:
alpha_value: Der neue Alpha-Wert (-100 bis 100)
"""
print(f"Alpha geändert auf {alpha_value}")
logger.debug(f"Alpha geändert auf {alpha_value}")
start_time = time.time()
# Verwende gecachte Pixmaps für schnelle Alpha-Änderungen
self.update_current_display()
alpha_time = time.time() - start_time
print(f"Alpha-Update in {alpha_time:.6f}s")
logger.debug(f"Alpha-Update in {alpha_time:.6f}s")
def open_settings_dialog(self):
"""Öffnet den Einstellungen-Dialog."""
@@ -1121,9 +1121,9 @@ class MainWindow(QMainWindow):
dialog = AppSettingsDlg(self, app_settings)
if dialog.exec() == AppSettingsDlg.DialogCode.Accepted:
# Einstellungen wurden gespeichert, hier könnten weitere Aktionen folgen
print("Einstellungen wurden gespeichert")
logger.info("Einstellungen wurden gespeichert")
except Exception as e:
print(f"Fehler beim Öffnen des Einstellungen-Dialogs: {e}")
logger.error(f"Fehler beim Öffnen des Einstellungen-Dialogs: {e}")
def open_new_project_dialog(self):
"""Öffnet Pdf-Projekt-Dialog."""
@@ -1161,15 +1161,15 @@ class MainWindow(QMainWindow):
# Speichere app_settings
app_settings.save()
print(f"Neues PDF-Projekt '{project_data['name']}' wurde erstellt und gespeichert")
print(f"Projekt-ID: {new_id}")
print(f"Projekt-Ordner: {project_data['project_dir']}")
logger.info(f"Neues PDF-Projekt '{project_data['name']}' wurde erstellt und gespeichert")
logger.debug(f"Projekt-ID: {new_id}")
logger.debug(f"Projekt-Ordner: {project_data['project_dir']}")
# Aktualisiere das Projekte-Menü
self._setup_projects_menu()
except Exception as e:
print(f"Fehler beim Erstellen des neuen Projekts: {e}")
logger.error(f"Fehler beim Erstellen des neuen Projekts: {e}")
def _create_project_structure(self, project: Project):
"""
@@ -1186,7 +1186,7 @@ class MainWindow(QMainWindow):
for subdir in subdirs:
subdir_path = project_dir / subdir
subdir_path.mkdir(parents=True, exist_ok=True)
print(f"Ordner erstellt: {subdir_path}")
logger.debug(f"Ordner erstellt: {subdir_path}")
project_yaml_path = project_dir / "project.yaml"
@@ -1197,17 +1197,17 @@ class MainWindow(QMainWindow):
# Speichere die Standard-Einstellungen in die project.yaml
default_settings.writeSettings(project_dir=project_dir)
print(f"project.yaml mit Standard-Einstellungen erstellt: {project_yaml_path}")
logger.info(f"project.yaml mit Standard-Einstellungen erstellt: {project_yaml_path}")
else:
print(f"project.yaml existiert bereits: {project_yaml_path}")
logger.debug(f"project.yaml existiert bereits: {project_yaml_path}")
except Exception as e:
print(f"Fehler beim Erstellen der Projekt-Struktur: {e}")
logger.error(f"Fehler beim Erstellen der Projekt-Struktur: {e}")
raise
def on_button_clicked(self):
"""Wird ausgeführt, wenn der Button geklickt wird."""
print("Button wurde geklickt!")
logger.debug("Button wurde geklickt!")
def on_thumbnail_clicked(self, event, thumbnail):
"""
@@ -1222,7 +1222,7 @@ class MainWindow(QMainWindow):
pdf_filename = page_info["pdf_filename"]
page_num = page_info["page_num"]
print(f"Thumbnail für Seite {page_num + 1} von {pdf_filename} wurde angeklickt")
logger.debug(f"Thumbnail für Seite {page_num + 1} von {pdf_filename} wurde angeklickt")
# Rendere und zeige die gewählte Seite an
self.render_and_display_page(pdf_filename, page_num)
@@ -1236,7 +1236,7 @@ class MainWindow(QMainWindow):
zoom_value: Der neue Zoom-Wert (in Prozent)
"""
self.current_zoom = zoom_value
print(f"Zoom geändert auf {zoom_value}%")
logger.debug(f"Zoom geändert auf {zoom_value}%")
# Verwende gecachte Pixmaps für schnelle Zoom-Änderungen
self.update_current_display()
@@ -1281,7 +1281,7 @@ class MainWindow(QMainWindow):
Lädt die Nodes aus den Projekt-Einstellungen in das TreeWidget.
Sortiert die Items alphabetisch nach ihrer ID.
"""
print("Lade Nodes in TreeWidget...")
logger.info("Lade Nodes in TreeWidget...")
try:
# TreeWidget leeren
@@ -1292,11 +1292,11 @@ class MainWindow(QMainWindow):
# Prüfe ob pdf_project existiert und Nodes hat
if not hasattr(self, "pdf_project") or not self.pdf_project:
print("Keine Projekt-Einstellungen verfügbar")
logger.warning("Keine Projekt-Einstellungen verfügbar")
return
if not self.pdf_project.nodes:
print("Keine Nodes in den Projekt-Einstellungen gefunden")
logger.warning("Keine Nodes in den Projekt-Einstellungen gefunden")
return
# Sortiere Root-Nodes alphabetisch nach ID
@@ -1307,14 +1307,14 @@ class MainWindow(QMainWindow):
tree_item = self._create_tree_item_from_node(node)
self.ui.treeWidget.addTopLevelItem(tree_item)
print(f"{len(self.pdf_project.nodes)} Root-Nodes in TreeWidget geladen (alphabetisch sortiert)")
logger.info(f"{len(self.pdf_project.nodes)} Root-Nodes in TreeWidget geladen (alphabetisch sortiert)")
# Aktualisiere Diff-PDF-Anzahl und Icons nach dem Laden
self._update_all_diff_pdf_counts()
self._update_diff_icons_for_existing_pdfs()
except Exception as e:
print(f"Fehler beim Laden der Nodes in TreeWidget: {e}")
logger.error(f"Fehler beim Laden der Nodes in TreeWidget: {e}")
def _create_tree_item_from_node(self, node):
"""
@@ -1396,7 +1396,7 @@ class MainWindow(QMainWindow):
return item
except Exception as e:
print(f"Fehler beim Erstellen des Tree-Items: {e}")
logger.error(f"Fehler beim Erstellen des Tree-Items: {e}")
# Fallback: Erstelle einfaches Item
fallback_item = QTreeWidgetItem()
fallback_item.setText(0, "Fehler beim Laden")
@@ -1662,12 +1662,12 @@ class MainWindow(QMainWindow):
# Kontextmenü-Aktionen für TreeNode
def _add_tree_node_child(self, parent_item):
"""Fügt einen Unterknoten zu einem TreeNode hinzu."""
print(f"Unterknoten zu TreeNode hinzufügen: {parent_item.text(0)}")
logger.debug(f"Unterknoten zu TreeNode hinzufügen: {parent_item.text(0)}")
# TODO: Dialog zum Eingeben der Node-Daten öffnen
def _add_xsl_file_to_node(self, parent_item):
"""Fügt eine XSL-Datei zu einem TreeNode hinzu."""
print(f"XSL-Datei zu TreeNode hinzufügen: {parent_item.text(0)}")
logger.debug(f"XSL-Datei zu TreeNode hinzufügen: {parent_item.text(0)}")
# TODO: Dialog zum Auswählen der XSL-Datei öffnen
def _edit_tree_node(self, item):
@@ -1677,7 +1677,7 @@ class MainWindow(QMainWindow):
Args:
item: Das TreeWidgetItem des TreeNode
"""
print(f"TreeNode bearbeiten: {item.text(0)}")
logger.debug(f"TreeNode bearbeiten: {item.text(0)}")
try:
# Hole das Node-Objekt aus dem TreeWidgetItem
@@ -1704,8 +1704,8 @@ class MainWindow(QMainWindow):
node.bez = data["bez"]
node.xslt_params = data["xslt_params"]
print(f"TreeNode '{node.bez}' wurde aktualisiert")
print(f"XSLT-Parameter: {node.xslt_params}")
logger.info(f"TreeNode '{node.bez}' wurde aktualisiert")
logger.debug(f"XSLT-Parameter: {node.xslt_params}")
# Speichere die Änderungen
self._save_project_settings()
@@ -1727,12 +1727,12 @@ class MainWindow(QMainWindow):
except Exception as e:
error_msg = f"Fehler beim Bearbeiten des TreeNode: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
def _delete_tree_node(self, item):
"""Löscht einen TreeNode."""
print(f"TreeNode löschen: {item.text(0)}")
logger.debug(f"TreeNode löschen: {item.text(0)}")
# TODO: Bestätigungsdialog und Löschung implementieren
# Kontextmenü-Aktionen für XslFile
@@ -1743,7 +1743,7 @@ class MainWindow(QMainWindow):
Args:
parent_item: Das TreeWidgetItem des XslFile-Nodes
"""
print(f"XML-Datei zu XslFile hinzufügen: {parent_item.text(0)}")
logger.debug(f"XML-Datei zu XslFile hinzufügen: {parent_item.text(0)}")
try:
# Prüfe ob ein Projekt geladen ist
@@ -1800,7 +1800,7 @@ class MainWindow(QMainWindow):
# Kopiere die XML-Datei in den xml-Ordner
shutil.copy2(xml_file_path, target_xml_path)
print(f"XML-Datei kopiert: {xml_file_path} -> {target_xml_path}")
logger.info(f"XML-Datei kopiert: {xml_file_path} -> {target_xml_path}")
# Erstelle relatives Path zur XML-Datei (relativ zum xml-Ordner)
relative_xml_path = Path("xml") / xml_file_path.name
@@ -1824,7 +1824,7 @@ class MainWindow(QMainWindow):
new_xml_file = XmlFile(xml=relative_xml_path)
xsl_node.xmls.append(new_xml_file)
print(f"XML-Datei '{xml_file_path.name}' zu XslFile-Node '{xsl_node.bez}' hinzugefügt")
logger.info(f"XML-Datei '{xml_file_path.name}' zu XslFile-Node '{xsl_node.bez}' hinzugefügt")
# Berechne Hash für die neue XML-Datei
self._calculate_hash_for_xml_file(new_xml_file)
@@ -1843,7 +1843,7 @@ class MainWindow(QMainWindow):
except Exception as e:
error_msg = f"Fehler beim Hinzufügen der XML-Datei: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
def _edit_xsl_file(self, item):
@@ -1853,7 +1853,7 @@ class MainWindow(QMainWindow):
Args:
item: Das TreeWidgetItem des XslFile
"""
print(f"XslFile bearbeiten: {item.text(0)}")
logger.debug(f"XslFile bearbeiten: {item.text(0)}")
try:
# Hole das Node-Objekt aus dem TreeWidgetItem
@@ -1875,8 +1875,8 @@ class MainWindow(QMainWindow):
node.bez = data["bez"]
node.xslt_params = data["xslt_params"]
print(f"XslFile '{node.bez}' wurde aktualisiert")
print(f"XSLT-Parameter: {node.xslt_params}")
logger.info(f"XslFile '{node.bez}' wurde aktualisiert")
logger.debug(f"XSLT-Parameter: {node.xslt_params}")
# Speichere die Änderungen
self._save_project_settings()
@@ -1898,18 +1898,18 @@ class MainWindow(QMainWindow):
except Exception as e:
error_msg = f"Fehler beim Bearbeiten der XSL-Datei: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
def _delete_xsl_file(self, item):
"""Löscht eine XSL-Datei."""
print(f"XslFile löschen: {item.text(0)}")
logger.debug(f"XslFile löschen: {item.text(0)}")
# TODO: Bestätigungsdialog und Löschung implementieren
# Kontextmenü-Aktionen für XmlFile
def _edit_xml_file(self, item):
"""Bearbeitet eine XML-Datei."""
print(f"XmlFile bearbeiten: {item.text(0)}")
logger.debug(f"XmlFile bearbeiten: {item.text(0)}")
# TODO: Dialog zum Bearbeiten der XML-Datei öffnen
def _delete_xml_file(self, item):
@@ -1919,7 +1919,7 @@ class MainWindow(QMainWindow):
Args:
item: Das TreeWidgetItem der XML-Datei
"""
print(f"XmlFile löschen: {item.text(0)}")
logger.debug(f"XmlFile löschen: {item.text(0)}")
try:
# Prüfe ob ein Projekt geladen ist
@@ -1961,7 +1961,7 @@ class MainWindow(QMainWindow):
)
if reply != QMessageBox.StandardButton.Yes:
print("Löschung abgebrochen")
logger.debug("Löschung abgebrochen")
return
# Entferne die XML-Datei aus der XslFile-Node
@@ -1973,7 +1973,7 @@ class MainWindow(QMainWindow):
QMessageBox.warning(self, "Warnung", "XML-Datei konnte nicht aus der XSL-Datei entfernt werden.")
return
print(f"XML-Datei '{xml_filename}' aus XSL-Datei '{xsl_file_obj.bez}' entfernt")
logger.info(f"XML-Datei '{xml_filename}' aus XSL-Datei '{xsl_file_obj.bez}' entfernt")
# Frage ob die physische Datei auch gelöscht werden soll
xml_file_path = Path(self.project.project_dir) / xml_file_obj.xml
@@ -1994,11 +1994,11 @@ class MainWindow(QMainWindow):
if delete_reply == QMessageBox.StandardButton.Yes:
try:
xml_file_path.unlink()
print(f"Physische XML-Datei gelöscht: {xml_file_path}")
logger.info(f"Physische XML-Datei gelöscht: {xml_file_path}")
except Exception as e:
QMessageBox.warning(self, "Warnung", f"Fehler beim Löschen der physischen Datei:\n{str(e)}")
else:
print(
logger.info(
f"XML-Datei '{xml_filename}' wird noch in anderen XSL-Dateien verwendet - physische Datei nicht gelöscht"
)
@@ -2008,11 +2008,11 @@ class MainWindow(QMainWindow):
# Aktualisiere das TreeWidget
self._load_nodes_to_tree()
print(f"XML-Datei '{xml_filename}' erfolgreich entfernt")
logger.info(f"XML-Datei '{xml_filename}' erfolgreich entfernt")
except Exception as e:
error_msg = f"Fehler beim Löschen der XML-Datei: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
def _is_xml_file_used_elsewhere(self, xml_path, exclude_xsl_file):
@@ -2033,7 +2033,7 @@ class MainWindow(QMainWindow):
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}")
logger.error(f"Fehler beim Prüfen der XML-Datei-Verwendung: {e}")
return True # Im Zweifelsfall annehmen, dass sie verwendet wird
def _check_xml_usage_recursive(self, nodes, xml_path, exclude_xsl_file):
@@ -2064,7 +2064,7 @@ class MainWindow(QMainWindow):
# Kontextmenü-Aktionen für Root-Elemente (Unbekannter Typ)
def _add_root_tree_node(self):
"""Fügt einen neuen TreeNode als Root-Element hinzu."""
print("Neuen TreeNode als Root-Element hinzufügen")
logger.debug("Neuen TreeNode als Root-Element hinzufügen")
# TODO: Dialog zum Eingeben der TreeNode-Daten öffnen
def on_load_from_fn2_clicked(self):
@@ -2072,7 +2072,7 @@ class MainWindow(QMainWindow):
Wird ausgeführt, wenn der Button "lade aus FN2" geklickt wird.
Führt SQL-Abfrage aus und aktualisiert die Projekt-Nodes.
"""
print("Button 'lade aus FN2' wurde geklickt!")
logger.debug("Button 'lade aus FN2' wurde geklickt!")
try:
# Prüfe ob ein Projekt geladen ist
@@ -2111,7 +2111,7 @@ class MainWindow(QMainWindow):
# QMessageBox.information(self, "Erfolg", "Daten erfolgreich aus FN2 geladen und Projekt aktualisiert!")
except Exception as e:
print(f"Fehler beim Laden aus FN2: {e}")
logger.error(f"Fehler beim Laden aus FN2: {e}")
QMessageBox.critical(self, "Fehler", f"Fehler beim Laden aus FN2:\n{str(e)}")
def _get_database_config(self, db_id):
@@ -2149,7 +2149,7 @@ class MainWindow(QMainWindow):
with open(sql_file_path, "r", encoding="utf-8") as f:
sql_query = f.read()
print(f"SQL-Abfrage geladen: {len(sql_query)} Zeichen")
logger.debug(f"SQL-Abfrage geladen: {len(sql_query)} Zeichen")
# Verbindung zur PostgreSQL-Datenbank herstellen
connection_string = (
@@ -2162,7 +2162,7 @@ class MainWindow(QMainWindow):
f"sslmode={db_config.ssl_mode.value}"
)
print(f"Verbinde zu PostgreSQL: {db_config.host}:{db_config.port}/{db_config.database}")
logger.info(f"Verbinde zu PostgreSQL: {db_config.host}:{db_config.port}/{db_config.database}")
df = pl.read_database_uri(sql_query, connection_string, engine="connectorx").sort(
["reporttyp_bez", "report_bez", "repfile_bez"]
@@ -2170,7 +2170,7 @@ class MainWindow(QMainWindow):
return df
except Exception as e:
error_msg = f"Fehler beim Ausführen der SQL-Abfrage: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
return None
@@ -2193,7 +2193,7 @@ class MainWindow(QMainWindow):
ebene_3 = df.group_by(["reporttyp", "report", "repfile", "repfile_bez", "xsl_datei"]).len()
group_time = time.time() - start_time
print(f"Performance: Gruppierung in {group_time:.3f}s")
logger.debug(f"Performance: Gruppierung in {group_time:.3f}s")
new_nodes = []
@@ -2223,13 +2223,13 @@ class MainWindow(QMainWindow):
new_nodes.append(tn_1)
nodes_time = time.time() - start_time
print(f"Performance: Node-Erstellung in {nodes_time:.3f}s")
print(f"Erstellt: {len(new_nodes)} Root-Nodes")
logger.debug(f"Performance: Node-Erstellung in {nodes_time:.3f}s")
logger.info(f"Erstellt: {len(new_nodes)} Root-Nodes")
return new_nodes
except Exception as e:
print(f"Fehler beim Verarbeiten der SQL-Daten: {e}")
logger.error(f"Fehler beim Verarbeiten der SQL-Daten: {e}")
raise
def _merge_nodes_with_existing(self, new_nodes):
@@ -2241,13 +2241,13 @@ class MainWindow(QMainWindow):
new_nodes: Liste der neuen Nodes
"""
try:
print("Merge neue Nodes mit vorhandenen...")
logger.info("Merge neue Nodes mit vorhandenen...")
# Erstelle ein Dictionary der neuen Nodes für schnellen Zugriff
new_nodes_dict = {}
self._build_nodes_dict(new_nodes, new_nodes_dict)
print(f"Neue Nodes Dictionary erstellt: {len(new_nodes_dict)} Einträge")
logger.debug(f"Neue Nodes Dictionary erstellt: {len(new_nodes_dict)} Einträge")
# Merge mit vorhandenen Nodes
if self.pdf_project and self.pdf_project.nodes:
@@ -2259,16 +2259,16 @@ class MainWindow(QMainWindow):
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}")
logger.info(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)")
logger.info(f"Alle {len(new_nodes)} Root-Nodes hinzugefügt (keine vorhandenen Nodes)")
print("Merge abgeschlossen")
logger.info("Merge abgeschlossen")
except Exception as e:
print(f"Fehler beim Mergen der Nodes: {e}")
logger.error(f"Fehler beim Mergen der Nodes: {e}")
raise
def _build_nodes_dict(self, nodes, nodes_dict):
@@ -2299,7 +2299,7 @@ class MainWindow(QMainWindow):
# Aktualisiere nur die Bezeichnung, falls sie sich geändert hat
if existing_node.bez != new_node.bez:
print(
logger.info(
f"Aktualisiere Bezeichnung für Node {existing_node.id}: '{existing_node.bez}' -> '{new_node.bez}'"
)
existing_node.bez = new_node.bez
@@ -2307,7 +2307,7 @@ class MainWindow(QMainWindow):
# Für XslFile: Aktualisiere xsl_file Pfad
if isinstance(existing_node, XslFile) and isinstance(new_node, XslFile):
if existing_node.xsl_file != new_node.xsl_file:
print(
logger.info(
f"Aktualisiere XSL-Datei für Node {existing_node.id}: '{existing_node.xsl_file}' -> '{new_node.xsl_file}'"
)
existing_node.xsl_file = new_node.xsl_file
@@ -2324,7 +2324,7 @@ class MainWindow(QMainWindow):
for new_child in new_node.children:
if new_child.id not in existing_child_ids:
existing_node.children.append(new_child)
print(f"Neues Kind hinzugefügt zu Node {existing_node.id}: {new_child.bez}")
logger.info(f"Neues Kind hinzugefügt zu Node {existing_node.id}: {new_child.bez}")
def _collect_parent_params(self, item):
"""
@@ -2377,11 +2377,11 @@ class MainWindow(QMainWindow):
try:
# Prüfe ob pdf_project und project existieren
if not self.pdf_project:
print("Keine Projekt-Einstellungen zum Speichern verfügbar")
logger.warning("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")
logger.warning("Kein Projekt-Verzeichnis zum Speichern verfügbar")
return
start_time = time.time()
@@ -2390,10 +2390,10 @@ class MainWindow(QMainWindow):
self.pdf_project.writeSettings(project_dir=self.project.project_dir)
dump_time = time.time() - start_time
print(f"Performance: Projekt-Einstellungen gespeichert in {dump_time:.3f}s")
logger.debug(f"Performance: Projekt-Einstellungen gespeichert in {dump_time:.3f}s")
except Exception as e:
print(f"Fehler beim Speichern der Projekt-Einstellungen: {e}")
logger.error(f"Fehler beim Speichern der Projekt-Einstellungen: {e}")
raise
def _setup_drag_drop(self):
@@ -2408,10 +2408,10 @@ class MainWindow(QMainWindow):
self.ui.treeWidget.dragMoveEvent = self.tree_drag_move_event
self.ui.treeWidget.dropEvent = self.tree_drop_event
print("Drag&Drop für TreeWidget aktiviert")
logger.debug("Drag&Drop für TreeWidget aktiviert")
except Exception as e:
print(f"Fehler beim Aktivieren von Drag&Drop: {e}")
logger.error(f"Fehler beim Aktivieren von Drag&Drop: {e}")
def tree_drag_enter_event(self, event: QDragEnterEvent):
"""
@@ -2430,16 +2430,16 @@ class MainWindow(QMainWindow):
if xml_files:
event.acceptProposedAction()
print(f"Drag-Enter akzeptiert: {len(xml_files)} XML-Dateien")
logger.debug(f"Drag-Enter akzeptiert: {len(xml_files)} XML-Dateien")
else:
event.ignore()
print("Drag-Enter ignoriert: Keine XML-Dateien")
logger.debug("Drag-Enter ignoriert: Keine XML-Dateien")
else:
event.ignore()
print("Drag-Enter ignoriert: Keine URLs")
logger.debug("Drag-Enter ignoriert: Keine URLs")
except Exception as e:
print(f"Fehler in tree_drag_enter_event: {e}")
logger.error(f"Fehler in tree_drag_enter_event: {e}")
event.ignore()
def tree_drag_move_event(self, event):
@@ -2465,7 +2465,7 @@ class MainWindow(QMainWindow):
event.ignore()
except Exception as e:
print(f"Fehler in tree_drag_move_event: {e}")
logger.error(f"Fehler in tree_drag_move_event: {e}")
event.ignore()
def tree_drop_event(self, event: QDropEvent):
@@ -2506,7 +2506,7 @@ class MainWindow(QMainWindow):
event.ignore()
return
print(f"Drop-Event: {len(xml_files)} XML-Dateien erkannt")
logger.info(f"Drop-Event: {len(xml_files)} XML-Dateien erkannt")
# Verarbeite jede XML-Datei einzeln
for xml_file_path in xml_files:
@@ -2516,7 +2516,7 @@ class MainWindow(QMainWindow):
except Exception as e:
error_msg = f"Fehler beim Verarbeiten des Drop-Events: {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
event.ignore()
@@ -2528,7 +2528,7 @@ class MainWindow(QMainWindow):
xml_file_path: Pfad zur XML-Datei
"""
try:
print(f"Verarbeite XML-Datei: {xml_file_path}")
logger.debug(f"Verarbeite XML-Datei: {xml_file_path}")
# Prüfe ob die Datei existiert
if not xml_file_path.exists():
@@ -2553,13 +2553,13 @@ class MainWindow(QMainWindow):
# Verarbeite die Zuordnung
self._assign_xml_to_xsl_nodes(xml_file_path, selected_xsl_nodes)
else:
print("Keine XSL-Knoten ausgewählt")
logger.warning("Keine XSL-Knoten ausgewählt")
else:
print("Dialog abgebrochen")
logger.debug("Dialog abgebrochen")
except Exception as e:
error_msg = f"Fehler beim Verarbeiten der XML-Datei '{xml_file_path}': {str(e)}"
print(error_msg)
logger.error(error_msg)
QMessageBox.critical(self, "Fehler", error_msg)
def _assign_xml_to_xsl_nodes(self, xml_file_path: Path, selected_xsl_nodes: list):
+9 -5
View File
@@ -1,3 +1,4 @@
import logging
from PySide6.QtWidgets import QDialog, QTreeWidgetItem, QCheckBox, QMessageBox, QWidget, QHBoxLayout
from PySide6.QtCore import Qt
from pathlib import Path
@@ -6,6 +7,9 @@ from ui.XmlToXslAssignDialog_ui import Ui_XmlToXslAssignDialog
from conf import TreeNode, XslFile
logger = logging.getLogger(__name__)
class XmlToXslAssignDialog(QDialog):
"""Dialog zur Zuordnung einer XML-Datei zu XSL-Knoten."""
@@ -85,10 +89,10 @@ class XmlToXslAssignDialog(QDialog):
root = self.ui.xslNodesTree.invisibleRootItem()
self._add_checkboxes_recursive(root)
print(f"Checkboxen zu {len(self.xsl_checkboxes)} XSL-Knoten hinzugefügt")
logger.debug(f"Checkboxen zu {len(self.xsl_checkboxes)} XSL-Knoten hinzugefügt")
except Exception as e:
print(f"Fehler beim Hinzufügen der Checkboxen: {e}")
logger.error(f"Fehler beim Hinzufügen der Checkboxen: {e}")
def _add_checkboxes_recursive(self, parent_item):
"""
@@ -113,7 +117,7 @@ class XmlToXslAssignDialog(QDialog):
# Speichere Checkbox-Referenz
self.xsl_checkboxes[id(node)] = checkbox
print(f"Checkbox für XSL-Knoten '{node.bez}' hinzugefügt")
logger.debug(f"Checkbox für XSL-Knoten '{node.bez}' hinzugefügt")
# Rekursiv für Kinder
if item.childCount() > 0:
@@ -201,7 +205,7 @@ class XmlToXslAssignDialog(QDialog):
return item
except Exception as e:
print(f"Fehler beim Erstellen des Tree-Items: {e}")
logger.error(f"Fehler beim Erstellen des Tree-Items: {e}")
return None
def select_all(self):
@@ -235,7 +239,7 @@ class XmlToXslAssignDialog(QDialog):
return selected_nodes
except Exception as e:
print(f"Fehler beim Sammeln der ausgewählten XSL-Knoten: {e}")
logger.error(f"Fehler beim Sammeln der ausgewählten XSL-Knoten: {e}")
return []
def _find_xsl_node_by_id(self, node_id):