Feature: Aktions-Menü mit Batch-Transformationen und UI-Bereinigung
- Neues Aktions-Menü mit Transformations- und Datenbankfunktionen - Menü wird beim Projekt-Laden automatisch aktiviert - Neue Aktion: Alle XML-Dateien transformieren (inkrementell) - Neue Aktion: Alle XML-Dateien neu transformieren (force) - Neue Aktion: Aus Datenbank laden (ersetzt Button) - Entfernte obsolete Buttons (pushButton, pushButton_2, pB_lade_aus_fn2) - UI-Bereinigung: Button-Frame unterhalb TreeWidget entfernt - Batch-Transformationen sammeln rekursiv alle XML/XSL-Paare - Bestätigungsdialoge mit Job-Anzahl und Warnungen - Deutsche Log-Meldungen und Fehlertexte
This commit is contained in:
@@ -740,3 +740,128 @@ class TransformationMixin:
|
||||
"Abgeschlossen mit Fehlern",
|
||||
f"{successful_count} von {total_count} Transformationen erfolgreich\n{failed_count} fehlgeschlagen\n\nGesamtdauer: {duration_str}",
|
||||
)
|
||||
|
||||
def _transform_all_xml_files(self):
|
||||
"""
|
||||
Transformiert ALLE XML-Dateien in allen TreeNodes des TreeWidgets.
|
||||
Nur Dateien, die nicht up-to-date sind, werden transformiert.
|
||||
"""
|
||||
try:
|
||||
if not self.project or not self.pdf_project:
|
||||
QMessageBox.warning(self, "Fehler", "Kein Projekt geladen")
|
||||
return
|
||||
|
||||
# Sammle alle XSL/XML-Paare aus allen Root-Nodes
|
||||
all_jobs = []
|
||||
root = self.ui.treeWidget.invisibleRootItem()
|
||||
|
||||
for i in range(root.childCount()):
|
||||
root_item = root.child(i)
|
||||
root_node = root_item.data(0, Qt.ItemDataRole.UserRole)
|
||||
|
||||
if isinstance(root_node, TreeNode):
|
||||
# Sammle alle XSL/XML-Paare rekursiv
|
||||
xsl_xml_pairs = self._collect_all_xsl_xml_pairs_recursive(root_node, root_item)
|
||||
|
||||
# Erstelle TransformationJobs
|
||||
for xsl_file_obj, xml_file_obj, xsl_file_item in xsl_xml_pairs:
|
||||
job = self._create_transformation_job(xsl_file_obj, xml_file_obj, xsl_file_item)
|
||||
if job:
|
||||
all_jobs.append(job)
|
||||
|
||||
elif isinstance(root_node, XslFile):
|
||||
# Direkt XslFile als Root-Element
|
||||
for xml_file_obj in root_node.xmls:
|
||||
job = self._create_transformation_job(root_node, xml_file_obj, root_item)
|
||||
if job:
|
||||
all_jobs.append(job)
|
||||
|
||||
if not all_jobs:
|
||||
QMessageBox.information(self, "Info", "Keine XML-Dateien zum Transformieren gefunden")
|
||||
return
|
||||
|
||||
# Frage Benutzer um Bestätigung
|
||||
reply = QMessageBox.question(
|
||||
self,
|
||||
"Alle XML-Dateien transformieren",
|
||||
f"Möchten Sie wirklich alle {len(all_jobs)} XML-Dateien transformieren?\n\n"
|
||||
f"Nur Dateien mit Änderungen werden verarbeitet.",
|
||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||
QMessageBox.StandardButton.Yes,
|
||||
)
|
||||
|
||||
if reply != QMessageBox.StandardButton.Yes:
|
||||
logger.info("Transformation abgebrochen durch Benutzer")
|
||||
return
|
||||
|
||||
logger.info(f"Starte Transformation für alle {len(all_jobs)} XML-Dateien (nicht-force)")
|
||||
|
||||
# Starte Transformation in separatem Thread
|
||||
self._start_transformation(all_jobs, force=False)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Transformieren aller XML-Dateien: {e}")
|
||||
QMessageBox.critical(self, "Fehler", f"Fehler beim Starten der Transformation: {str(e)}")
|
||||
|
||||
def _transform_all_xml_files_force(self):
|
||||
"""
|
||||
Transformiert ALLE XML-Dateien in allen TreeNodes des TreeWidgets (force).
|
||||
Alle Dateien werden unabhängig vom Änderungsstatus neu transformiert.
|
||||
"""
|
||||
try:
|
||||
if not self.project or not self.pdf_project:
|
||||
QMessageBox.warning(self, "Fehler", "Kein Projekt geladen")
|
||||
return
|
||||
|
||||
# Sammle alle XSL/XML-Paare aus allen Root-Nodes
|
||||
all_jobs = []
|
||||
root = self.ui.treeWidget.invisibleRootItem()
|
||||
|
||||
for i in range(root.childCount()):
|
||||
root_item = root.child(i)
|
||||
root_node = root_item.data(0, Qt.ItemDataRole.UserRole)
|
||||
|
||||
if isinstance(root_node, TreeNode):
|
||||
# Sammle alle XSL/XML-Paare rekursiv
|
||||
xsl_xml_pairs = self._collect_all_xsl_xml_pairs_recursive(root_node, root_item)
|
||||
|
||||
# Erstelle TransformationJobs
|
||||
for xsl_file_obj, xml_file_obj, xsl_file_item in xsl_xml_pairs:
|
||||
job = self._create_transformation_job(xsl_file_obj, xml_file_obj, xsl_file_item)
|
||||
if job:
|
||||
all_jobs.append(job)
|
||||
|
||||
elif isinstance(root_node, XslFile):
|
||||
# Direkt XslFile als Root-Element
|
||||
for xml_file_obj in root_node.xmls:
|
||||
job = self._create_transformation_job(root_node, xml_file_obj, root_item)
|
||||
if job:
|
||||
all_jobs.append(job)
|
||||
|
||||
if not all_jobs:
|
||||
QMessageBox.information(self, "Info", "Keine XML-Dateien zum Transformieren gefunden")
|
||||
return
|
||||
|
||||
# Frage Benutzer um Bestätigung (mit Warnung wegen force)
|
||||
reply = QMessageBox.question(
|
||||
self,
|
||||
"Alle XML-Dateien neu transformieren (force)",
|
||||
f"Möchten Sie wirklich ALLE {len(all_jobs)} XML-Dateien NEU transformieren?\n\n"
|
||||
f"⚠ WARNUNG: Im Force-Modus werden alle Dateien unabhängig von ihrem Status neu verarbeitet!\n"
|
||||
f"Dies kann längere Zeit in Anspruch nehmen.",
|
||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||
QMessageBox.StandardButton.No,
|
||||
)
|
||||
|
||||
if reply != QMessageBox.StandardButton.Yes:
|
||||
logger.info("Force-Transformation abgebrochen durch Benutzer")
|
||||
return
|
||||
|
||||
logger.info(f"Starte Force-Transformation für alle {len(all_jobs)} XML-Dateien")
|
||||
|
||||
# Starte Transformation in separatem Thread (mit force=True)
|
||||
self._start_transformation(all_jobs, force=True)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Force-Transformieren aller XML-Dateien: {e}")
|
||||
QMessageBox.critical(self, "Fehler", f"Fehler beim Starten der Force-Transformation: {str(e)}")
|
||||
|
||||
Reference in New Issue
Block a user