138 lines
5.0 KiB
Python
138 lines
5.0 KiB
Python
|
|
"""
|
||
|
|
ObsoleteEntriesDialog — Dialog zur Bestätigung des Entfernens veralteter Projekteinträge.
|
||
|
|
|
||
|
|
Zeigt XslFile-Einträge an, die nicht mehr in der Datenbank vorhanden sind,
|
||
|
|
und lässt den Benutzer entscheiden ob sie entfernt werden sollen.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import logging
|
||
|
|
from PySide6.QtCore import Qt
|
||
|
|
from PySide6.QtWidgets import (
|
||
|
|
QCheckBox,
|
||
|
|
QDialog,
|
||
|
|
QDialogButtonBox,
|
||
|
|
QLabel,
|
||
|
|
QSizePolicy,
|
||
|
|
QTreeWidget,
|
||
|
|
QTreeWidgetItem,
|
||
|
|
QVBoxLayout,
|
||
|
|
)
|
||
|
|
|
||
|
|
from obsolete_detector import ObsoleteGroup
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class ObsoleteEntriesDialog(QDialog):
|
||
|
|
"""
|
||
|
|
Dialog zur Anzeige und Bestätigung veralteter Einträge nach einem DB-Import.
|
||
|
|
|
||
|
|
Zeigt die veralteten XslFile-Einträge gruppiert nach ihrer Baumhierarchie an.
|
||
|
|
Der Benutzer kann entscheiden ob die Einträge entfernt und ob nicht mehr
|
||
|
|
verwendete XML-Dateien physisch gelöscht werden sollen.
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self, parent, obsolete_groups: list[ObsoleteGroup]):
|
||
|
|
"""
|
||
|
|
Args:
|
||
|
|
parent: Eltern-Widget
|
||
|
|
obsolete_groups: Veraltete Einträge gruppiert nach Hierarchiepfad
|
||
|
|
"""
|
||
|
|
super().__init__(parent)
|
||
|
|
self._obsolete_groups = obsolete_groups
|
||
|
|
self._setup_ui()
|
||
|
|
self._populate_tree()
|
||
|
|
|
||
|
|
def _setup_ui(self) -> None:
|
||
|
|
"""Erstellt die UI-Elemente des Dialogs."""
|
||
|
|
total_count = sum(len(g.xsl_entries) for g in self._obsolete_groups)
|
||
|
|
|
||
|
|
self.setWindowTitle("Veraltete Einträge gefunden")
|
||
|
|
self.resize(640, 420)
|
||
|
|
self.setSizeGripEnabled(True)
|
||
|
|
|
||
|
|
layout = QVBoxLayout(self)
|
||
|
|
layout.setSpacing(10)
|
||
|
|
|
||
|
|
# Erklärungstext
|
||
|
|
info_label = QLabel(
|
||
|
|
f"<b>{total_count} XSL-Datei(en)</b> sind nicht mehr in der Datenbank vorhanden "
|
||
|
|
f"und können aus dem Projekt entfernt werden."
|
||
|
|
)
|
||
|
|
info_label.setWordWrap(True)
|
||
|
|
layout.addWidget(info_label)
|
||
|
|
|
||
|
|
# Baumansicht der veralteten Einträge
|
||
|
|
self._tree = QTreeWidget()
|
||
|
|
self._tree.setColumnCount(3)
|
||
|
|
self._tree.setHeaderLabels(["Bezeichnung", "XSL-Datei", "XML-Dateien"])
|
||
|
|
self._tree.setColumnWidth(0, 280)
|
||
|
|
self._tree.setColumnWidth(1, 200)
|
||
|
|
self._tree.setColumnWidth(2, 80)
|
||
|
|
self._tree.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
||
|
|
self._tree.setAlternatingRowColors(True)
|
||
|
|
self._tree.setEditTriggers(QTreeWidget.EditTrigger.NoEditTriggers)
|
||
|
|
layout.addWidget(self._tree)
|
||
|
|
|
||
|
|
# Checkbox für physische XML-Löschung
|
||
|
|
self._delete_xml_checkbox = QCheckBox("Nicht mehr verwendete XML-Dateien physisch löschen")
|
||
|
|
self._delete_xml_checkbox.setChecked(False)
|
||
|
|
layout.addWidget(self._delete_xml_checkbox)
|
||
|
|
|
||
|
|
# Dialog-Buttons
|
||
|
|
self._button_box = QDialogButtonBox()
|
||
|
|
remove_button = self._button_box.addButton(
|
||
|
|
"Veraltete Einträge entfernen", QDialogButtonBox.ButtonRole.AcceptRole
|
||
|
|
)
|
||
|
|
remove_button.setToolTip("Entfernt alle aufgelisteten Einträge aus dem Projekt")
|
||
|
|
self._button_box.addButton(QDialogButtonBox.StandardButton.Cancel)
|
||
|
|
self._button_box.accepted.connect(self.accept)
|
||
|
|
self._button_box.rejected.connect(self.reject)
|
||
|
|
layout.addWidget(self._button_box)
|
||
|
|
|
||
|
|
def _populate_tree(self) -> None:
|
||
|
|
"""Befüllt den QTreeWidget mit den veralteten Einträgen."""
|
||
|
|
self._tree.clear()
|
||
|
|
|
||
|
|
for group in self._obsolete_groups:
|
||
|
|
# Hierarchiepfad als verschachtelte Items aufbauen
|
||
|
|
parent_item = self._tree.invisibleRootItem()
|
||
|
|
for path_part in group.node_path:
|
||
|
|
# Prüfe ob dieser Pfadteil bereits als Kind vorhanden ist
|
||
|
|
existing = None
|
||
|
|
for i in range(parent_item.childCount()):
|
||
|
|
child = parent_item.child(i)
|
||
|
|
if child.text(0) == path_part and not child.data(0, Qt.ItemDataRole.UserRole):
|
||
|
|
existing = child
|
||
|
|
break
|
||
|
|
if existing:
|
||
|
|
parent_item = existing
|
||
|
|
else:
|
||
|
|
node_item = QTreeWidgetItem(parent_item, [path_part])
|
||
|
|
font = node_item.font(0)
|
||
|
|
font.setBold(True)
|
||
|
|
node_item.setFont(0, font)
|
||
|
|
parent_item = node_item
|
||
|
|
|
||
|
|
# XslFile-Einträge unter dem Hierarchiepfad
|
||
|
|
for entry in group.xsl_entries:
|
||
|
|
xsl = entry.xsl_file
|
||
|
|
xml_count = str(len(xsl.xmls)) if xsl.xmls else "0"
|
||
|
|
xsl_item = QTreeWidgetItem(
|
||
|
|
parent_item,
|
||
|
|
[xsl.bez, xsl.xsl_file.name, xml_count],
|
||
|
|
)
|
||
|
|
xsl_item.setData(0, Qt.ItemDataRole.UserRole, xsl)
|
||
|
|
xsl_item.setToolTip(1, str(xsl.xsl_file))
|
||
|
|
|
||
|
|
self._tree.expandAll()
|
||
|
|
|
||
|
|
def delete_xml_files(self) -> bool:
|
||
|
|
"""
|
||
|
|
Gibt zurück ob der Benutzer die physische Löschung der XML-Dateien gewünscht hat.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
True wenn die Checkbox aktiviert ist
|
||
|
|
"""
|
||
|
|
return self._delete_xml_checkbox.isChecked()
|