Files
Plugin_SN_Basis/modules/layerpruefer.py

183 lines
6.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
sn_basis/modules/layerpruefer.py Prüfung von QGIS-Layern.
Verwendet ausschließlich Wrapper und gibt pruef_ergebnis zurück.
"""
from sn_basis.functions 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, PruefAktion
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",
kontext=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",
kontext=self.layer, # Layerobjekt als Kontext
)
# -----------------------------------------------------
# 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}', "
f"erwartet wurde '{self.erwarteter_layertyp}'."
),
aktion="falscher_layertyp",
kontext=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}', "
f"erwartet wurde '{self.erwarteter_geotyp}'."
),
aktion="falscher_geotyp",
kontext=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",
kontext=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}', "
f"erwartet wurde '{self.erwartetes_crs}'."
),
aktion="falsches_crs",
kontext=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=(
"Der Layer enthält nicht alle erforderlichen Felder: "
+ ", ".join(fehlende)
),
aktion="felder_fehlen",
kontext=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",
kontext=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",
kontext=None,
)
# -----------------------------------------------------
# 10. Alles OK
# -----------------------------------------------------
return pruef_ergebnis(
ok=True,
meldung="Layerprüfung erfolgreich.",
aktion="ok",
kontext=None,
)