Feature: Löschen-Funktion für XSL-Knoten im Baum implementiert
Ersetzt den bisherigen Stub durch eine vollständige Implementierung mit Bestätigungsdialog, automatischer PDF-Bereinigung, optionaler physischer XML-Löschung und Datenmodell-Aktualisierung. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -958,9 +958,126 @@ class TreeManagerMixin:
|
|||||||
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 aus einem Baumknoten.
|
||||||
|
|
||||||
|
Die XSL-Datei wird nur aus dem Baum entfernt, nicht physisch gelöscht.
|
||||||
|
Zugehörige PDF-Dateien werden automatisch bereinigt.
|
||||||
|
XML-Dateien, die nirgends mehr verwendet werden, können optional physisch gelöscht werden.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
item: Das TreeWidgetItem der XSL-Datei
|
||||||
|
"""
|
||||||
logger.debug(f"XslFile löschen: {item.text(0)}")
|
logger.debug(f"XslFile löschen: {item.text(0)}")
|
||||||
# TODO: Bestätigungsdialog und Löschung implementieren
|
|
||||||
|
try:
|
||||||
|
# Prüfe ob ein Projekt geladen ist
|
||||||
|
if not hasattr(self, "project") or not self.project:
|
||||||
|
QMessageBox.warning(self, "Warnung", "Kein Projekt geladen. Bitte öffnen Sie zuerst ein Projekt.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not hasattr(self, "pdf_project") or not self.pdf_project:
|
||||||
|
QMessageBox.warning(self, "Warnung", "Keine Projekt-Einstellungen geladen.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Hole das XslFile-Objekt aus dem TreeWidgetItem
|
||||||
|
xsl_file_obj = item.data(0, Qt.ItemDataRole.UserRole)
|
||||||
|
if not xsl_file_obj or not isinstance(xsl_file_obj, XslFile):
|
||||||
|
QMessageBox.warning(self, "Warnung", "Keine gültige XSL-Datei gefunden.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Hole das Eltern-Item (sollte ein TreeNode sein)
|
||||||
|
parent_item = item.parent()
|
||||||
|
if not parent_item:
|
||||||
|
QMessageBox.warning(self, "Warnung", "Eltern-Knoten nicht gefunden.")
|
||||||
|
return
|
||||||
|
|
||||||
|
parent_node = parent_item.data(0, Qt.ItemDataRole.UserRole)
|
||||||
|
if not parent_node or not isinstance(parent_node, TreeNode):
|
||||||
|
QMessageBox.warning(self, "Warnung", "Kein gültiger Eltern-Knoten gefunden.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Bestätigungsdialog anzeigen
|
||||||
|
xml_count = len(xsl_file_obj.xmls)
|
||||||
|
xml_info = f"\n\nDer XSL-Datei sind {xml_count} XML-Datei(en) zugeordnet." if xml_count > 0 else ""
|
||||||
|
reply = QMessageBox.question(
|
||||||
|
self,
|
||||||
|
"XSL-Datei entfernen",
|
||||||
|
f"Möchten Sie die XSL-Datei '{xsl_file_obj.bez}' aus dem Baum entfernen?\n\n"
|
||||||
|
f"Die XSL-Datei selbst wird nicht physisch gelöscht.{xml_info}",
|
||||||
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||||
|
QMessageBox.StandardButton.No,
|
||||||
|
)
|
||||||
|
|
||||||
|
if reply != QMessageBox.StandardButton.Yes:
|
||||||
|
logger.debug("Löschung abgebrochen")
|
||||||
|
return
|
||||||
|
|
||||||
|
# PDF-Bereinigung für alle zugehörigen XML-Dateien
|
||||||
|
xsl_id = xsl_file_obj.id
|
||||||
|
total_deleted_pdfs = 0
|
||||||
|
for xml_file_obj in xsl_file_obj.xmls:
|
||||||
|
is_combination_used = self._is_xml_xsl_combination_used_elsewhere(
|
||||||
|
xml_file_obj.xml, xsl_id, xsl_file_obj
|
||||||
|
)
|
||||||
|
if not is_combination_used:
|
||||||
|
deleted_pdfs = self._delete_pdf_files_for_xml_xsl_combination(xml_file_obj.xml, xsl_id)
|
||||||
|
total_deleted_pdfs += deleted_pdfs
|
||||||
|
|
||||||
|
if total_deleted_pdfs > 0:
|
||||||
|
logger.info(f"{total_deleted_pdfs} PDF-Datei(en) für XSL '{xsl_file_obj.bez}' gelöscht")
|
||||||
|
|
||||||
|
# Sammle XML-Dateien, die nirgends mehr verwendet werden
|
||||||
|
unused_xml_files = []
|
||||||
|
for xml_file_obj in xsl_file_obj.xmls:
|
||||||
|
xml_file_path = Path(self.project.project_dir) / xml_file_obj.xml
|
||||||
|
if xml_file_path.exists():
|
||||||
|
is_used = self._is_xml_file_used_elsewhere(xml_file_obj.xml, xsl_file_obj)
|
||||||
|
if not is_used:
|
||||||
|
unused_xml_files.append((xml_file_obj, xml_file_path))
|
||||||
|
|
||||||
|
# Optionale physische Löschung nicht mehr verwendeter XML-Dateien
|
||||||
|
if unused_xml_files:
|
||||||
|
file_list = "\n".join(f" - {p.name}" for _, p in unused_xml_files)
|
||||||
|
delete_reply = QMessageBox.question(
|
||||||
|
self,
|
||||||
|
"Physische XML-Dateien löschen",
|
||||||
|
f"Folgende {len(unused_xml_files)} XML-Datei(en) werden in keiner anderen "
|
||||||
|
f"XSL-Datei mehr verwendet:\n\n{file_list}\n\n"
|
||||||
|
"Möchten Sie diese physisch löschen?",
|
||||||
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||||
|
QMessageBox.StandardButton.No,
|
||||||
|
)
|
||||||
|
|
||||||
|
if delete_reply == QMessageBox.StandardButton.Yes:
|
||||||
|
for xml_file_obj, xml_file_path in unused_xml_files:
|
||||||
|
try:
|
||||||
|
xml_file_path.unlink()
|
||||||
|
logger.info(f"Physische XML-Datei gelöscht: {xml_file_path}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Konnte XML-Datei nicht löschen: {xml_file_path} - {e}")
|
||||||
|
|
||||||
|
# Entferne das XslFile aus dem Eltern-TreeNode
|
||||||
|
children_before = len(parent_node.children)
|
||||||
|
parent_node.children = [child for child in parent_node.children if child is not xsl_file_obj]
|
||||||
|
children_after = len(parent_node.children)
|
||||||
|
|
||||||
|
if children_before == children_after:
|
||||||
|
QMessageBox.warning(self, "Warnung", "XSL-Datei konnte nicht aus dem Knoten entfernt werden.")
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.info(f"XSL-Datei '{xsl_file_obj.bez}' aus Knoten '{parent_node.bez}' entfernt")
|
||||||
|
|
||||||
|
# Speichere und aktualisiere
|
||||||
|
self._save_project_settings()
|
||||||
|
self._load_nodes_to_tree()
|
||||||
|
|
||||||
|
logger.info(f"XSL-Datei '{xsl_file_obj.bez}' erfolgreich entfernt")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = f"Fehler beim Löschen der XSL-Datei: {str(e)}"
|
||||||
|
logger.error(error_msg)
|
||||||
|
QMessageBox.critical(self, "Fehler", error_msg)
|
||||||
|
|
||||||
# Kontextmenü-Aktionen für XmlFile
|
# Kontextmenü-Aktionen für XmlFile
|
||||||
def _edit_xml_file(self, item):
|
def _edit_xml_file(self, item):
|
||||||
|
|||||||
Reference in New Issue
Block a user