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