forked from AG_QGIS/Plugin_SN_Basis
Auf Wrapper umgestellt, Prüfarchitektur QT6-kompatibel gemacht (Nicht lauffähig)
This commit is contained in:
170
modules/layerpruefer.py
Normal file
170
modules/layerpruefer.py
Normal file
@@ -0,0 +1,170 @@
|
||||
"""
|
||||
sn_basis/modules/layerpruefer.py – Prüfung von QGIS-Layern.
|
||||
Verwendet ausschließlich qgisqt_wrapper und gibt pruef_ergebnis zurück.
|
||||
"""
|
||||
|
||||
from sn_basis.functions.qgisqt_wrapper import (
|
||||
layer_exists,
|
||||
get_layer_geometry_type,
|
||||
get_layer_feature_count,
|
||||
is_layer_visible,
|
||||
get_layer_type,
|
||||
get_layer_crs,
|
||||
get_layer_fields,
|
||||
get_layer_source,
|
||||
is_layer_editable,
|
||||
)
|
||||
|
||||
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
|
||||
|
||||
|
||||
class Layerpruefer:
|
||||
"""
|
||||
Prüft Layer auf Existenz, Sichtbarkeit, Geometrietyp, Objektanzahl,
|
||||
Layertyp, CRS, Felder, Datenquelle und Editierbarkeit.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
layer,
|
||||
erwarteter_geotyp: str | None = None,
|
||||
muss_sichtbar_sein: bool = False,
|
||||
erwarteter_layertyp: str | None = None,
|
||||
erwartetes_crs: str | None = None,
|
||||
erforderliche_felder: list[str] | None = None,
|
||||
erlaubte_datenquellen: list[str] | None = None,
|
||||
muss_editierbar_sein: bool = False,
|
||||
):
|
||||
self.layer = layer
|
||||
self.erwarteter_geotyp = erwarteter_geotyp
|
||||
self.muss_sichtbar_sein = muss_sichtbar_sein
|
||||
self.erwarteter_layertyp = erwarteter_layertyp
|
||||
self.erwartetes_crs = erwartetes_crs
|
||||
self.erforderliche_felder = erforderliche_felder or []
|
||||
self.erlaubte_datenquellen = erlaubte_datenquellen or []
|
||||
self.muss_editierbar_sein = muss_editierbar_sein
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# Hauptfunktion
|
||||
# ---------------------------------------------------------
|
||||
|
||||
def pruefe(self) -> pruef_ergebnis:
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 1. Existenz
|
||||
# -----------------------------------------------------
|
||||
if not layer_exists(self.layer):
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung="Der Layer existiert nicht oder wurde nicht geladen.",
|
||||
aktion="layer_nicht_gefunden", # type: ignore
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 2. Sichtbarkeit
|
||||
# -----------------------------------------------------
|
||||
sichtbar = is_layer_visible(self.layer)
|
||||
if self.muss_sichtbar_sein and not sichtbar:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung="Der Layer ist unsichtbar. Soll er eingeblendet werden?",
|
||||
aktion="layer_unsichtbar", # type: ignore
|
||||
pfad=self.layer, # Layerobjekt wird übergeben
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 3. Layertyp
|
||||
# -----------------------------------------------------
|
||||
layertyp = get_layer_type(self.layer)
|
||||
if self.erwarteter_layertyp and layertyp != self.erwarteter_layertyp:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung=f"Der Layer hat den Typ '{layertyp}', erwartet wurde '{self.erwarteter_layertyp}'.",
|
||||
aktion="falscher_layertyp",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 4. Geometrietyp
|
||||
# -----------------------------------------------------
|
||||
geotyp = get_layer_geometry_type(self.layer)
|
||||
if self.erwarteter_geotyp and geotyp != self.erwarteter_geotyp:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung=f"Der Layer hat den Geometrietyp '{geotyp}', erwartet wurde '{self.erwarteter_geotyp}'.",
|
||||
aktion="falscher_geotyp",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 5. Featureanzahl
|
||||
# -----------------------------------------------------
|
||||
anzahl = get_layer_feature_count(self.layer)
|
||||
if anzahl == 0:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung="Der Layer enthält keine Objekte.",
|
||||
aktion="layer_leer",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 6. CRS
|
||||
# -----------------------------------------------------
|
||||
crs = get_layer_crs(self.layer)
|
||||
if self.erwartetes_crs and crs != self.erwartetes_crs:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung=f"Der Layer hat das CRS '{crs}', erwartet wurde '{self.erwartetes_crs}'.",
|
||||
aktion="falsches_crs",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 7. Felder
|
||||
# -----------------------------------------------------
|
||||
felder = get_layer_fields(self.layer)
|
||||
fehlende = [f for f in self.erforderliche_felder if f not in felder]
|
||||
|
||||
if fehlende:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung=f"Der Layer enthält nicht alle erforderlichen Felder: {', '.join(fehlende)}",
|
||||
aktion="felder_fehlen",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 8. Datenquelle
|
||||
# -----------------------------------------------------
|
||||
quelle = get_layer_source(self.layer)
|
||||
if self.erlaubte_datenquellen and quelle not in self.erlaubte_datenquellen:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung=f"Die Datenquelle '{quelle}' ist nicht erlaubt.",
|
||||
aktion="datenquelle_unerwartet",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 9. Editierbarkeit
|
||||
# -----------------------------------------------------
|
||||
editable = is_layer_editable(self.layer)
|
||||
if self.muss_editierbar_sein and not editable:
|
||||
return pruef_ergebnis(
|
||||
ok=False,
|
||||
meldung="Der Layer ist nicht editierbar.",
|
||||
aktion="layer_nicht_editierbar",
|
||||
pfad=None,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------
|
||||
# 10. Alles OK
|
||||
# -----------------------------------------------------
|
||||
return pruef_ergebnis(
|
||||
ok=True,
|
||||
meldung="Layerprüfung erfolgreich.",
|
||||
aktion="ok",
|
||||
pfad=None,
|
||||
)
|
||||
Reference in New Issue
Block a user