forked from AG_QGIS/Plugin_SN_Plan41
Button Fachdaten laden hinzugefügt und angebunden (pipeline datagrabber-prüfer-datenlader-datenschreiber)
This commit is contained in:
137
modules/listenauswerter.py
Normal file
137
modules/listenauswerter.py
Normal file
@@ -0,0 +1,137 @@
|
||||
#sn_plan41/modules/listenauswerter.py
|
||||
from typing import Any, Dict, List, Mapping, Optional, Tuple
|
||||
from collections.abc import Mapping as _Mapping
|
||||
# Prüfer-Typen (werden als Instanzen erwartet)
|
||||
from sn_basis.modules.Pruefmanager import Pruefmanager # type: ignore
|
||||
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
|
||||
from sn_basis.modules.stilpruefer import Stilpruefer # type: ignore
|
||||
|
||||
class Listenauswerter:
|
||||
"""
|
||||
Validiert Zeilen aus einem DataDict, das vom DataGrabber stammt.
|
||||
Erwartet wird die Struktur::
|
||||
|
||||
{"rows": [ {attr}, ... ]}
|
||||
|
||||
Die Linkprüfung entfällt vollständig, da der DataGrabber nur gültige
|
||||
Links liefert. Diese Methode prüft ausschließlich die Konsistenz der
|
||||
Zeilen mit dem erwarteten Datenschema und führt optional eine
|
||||
Stilprüfung durch.
|
||||
"""
|
||||
def __init__(self, pruefmanager, stil_pruefer):
|
||||
""" Parameters
|
||||
----------
|
||||
pruefmanager: Instanz des Pruefmanagers, der pruef_ergebnis verarbeitet.
|
||||
stil_pruefer: Instanz des Stilpruefers, der Stildateien prüft.
|
||||
"""
|
||||
self.pruefmanager = pruefmanager
|
||||
self.stil_pruefer = stil_pruefer
|
||||
|
||||
def validate_rows(
|
||||
self,
|
||||
data_dict: Dict[str, List[Mapping[str, Any]]]
|
||||
) -> Tuple[Dict[str, List[Mapping[str, Any]]], List[Any]]:
|
||||
"""
|
||||
Validiert die Zeilen aus ``data_dict`` anhand des erwarteten Schemas.
|
||||
|
||||
Erwartete Felder pro Zeile
|
||||
--------------------------
|
||||
Pflichtfelder:
|
||||
- ``ident``: eindeutige Kennung
|
||||
- ``Link``: bereits geprüfter Link (vom DataGrabber garantiert gültig)
|
||||
- ``Provider``: Datenquelle (wird in Großbuchstaben normalisiert)
|
||||
|
||||
Optionale Felder:
|
||||
- ``Inhalt``: thematische Beschreibung
|
||||
- ``Stildatei``: Pfad zur Stildatei (falls vorhanden)
|
||||
|
||||
Verhalten
|
||||
---------
|
||||
- Zeilen, denen Pflichtfelder fehlen oder deren Werte leer sind,
|
||||
werden verworfen.
|
||||
- ``Provider`` wird in Großbuchstaben normalisiert.
|
||||
- Wenn ``Stildatei`` vorhanden ist, wird sie durch
|
||||
``self.stil_pruefer.pruefe(...)`` geprüft.
|
||||
- Bei OK bleibt der Wert erhalten.
|
||||
- Bei nicht OK wird ``Stildatei`` auf ``None`` gesetzt und das
|
||||
verarbeitete Prüfergebnis gesammelt.
|
||||
- Alle Prüfergebnisse werden durch ``self.pruefmanager.verarbeite(...)``
|
||||
geleitet und in der Rückgabe gesammelt.
|
||||
|
||||
Rückgabe
|
||||
--------
|
||||
Tuple[Dict[str, List[Mapping[str, Any]]]], List[Any]]
|
||||
- ``valid_data_dict``: enthält nur Zeilen, die dem Schema entsprechen
|
||||
- ``processed_results``: Liste der verarbeiteten Prüfergebnisse
|
||||
|
||||
Hinweise
|
||||
--------
|
||||
- Diese Methode führt **keine Linkprüfung** durch.
|
||||
- Die Verantwortung für die Linkvalidität liegt vollständig beim DataGrabber.
|
||||
- Die Methode verändert die Zeilen nur minimal (Provider‑Normalisierung,
|
||||
Stildatei ggf. auf ``None``).
|
||||
"""
|
||||
|
||||
processed_results: List[Any] = []
|
||||
valid_rows: List[Mapping[str, Any]] = []
|
||||
|
||||
# Grundstruktur prüfen
|
||||
if not isinstance(data_dict, dict):
|
||||
return {"rows": []}, processed_results
|
||||
|
||||
rows = data_dict.get("rows", [])
|
||||
if not isinstance(rows, (list, tuple)):
|
||||
return {"rows": []}, processed_results
|
||||
|
||||
for raw in rows:
|
||||
# Sicherstellen, dass raw ein Mapping ist
|
||||
if not isinstance(raw, _Mapping):
|
||||
continue
|
||||
|
||||
ident = raw.get("ident")
|
||||
inhalt = raw.get("Inhalt")
|
||||
link = raw.get("Link")
|
||||
stildatei = raw.get("Stildatei")
|
||||
provider = raw.get("Provider")
|
||||
|
||||
# Pflichtfelder prüfen
|
||||
if not ident or not link or not provider:
|
||||
# Fehler dokumentieren
|
||||
pe = pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung="Pflichtfelder fehlen oder sind leer",
|
||||
aktion="pflichtfelder_fehlen",
|
||||
kontext=raw,
|
||||
)
|
||||
processed_results.append(self.pruefmanager.verarbeite(pe))
|
||||
continue
|
||||
|
||||
# Provider normalisieren
|
||||
provider_norm = str(provider).upper()
|
||||
|
||||
# Stildatei prüfen (falls vorhanden)
|
||||
if stildatei:
|
||||
pe_stil = self.stil_pruefer.pruefe(stildatei)
|
||||
processed_stil = self.pruefmanager.verarbeite(pe_stil)
|
||||
|
||||
if not getattr(processed_stil, "ok", False):
|
||||
processed_results.append(processed_stil)
|
||||
stildatei_value: Optional[str] = None
|
||||
else:
|
||||
stildatei_value = stildatei
|
||||
else:
|
||||
stildatei_value = None
|
||||
|
||||
# Validierte Zeile zusammenbauen
|
||||
validated_row = {
|
||||
"ident": ident,
|
||||
"Inhalt": inhalt,
|
||||
"Link": link,
|
||||
"Stildatei": stildatei_value,
|
||||
"Provider": provider_norm,
|
||||
}
|
||||
|
||||
valid_rows.append(validated_row)
|
||||
|
||||
result_dict = {"rows": valid_rows}
|
||||
return result_dict, processed_results
|
||||
Reference in New Issue
Block a user