""" 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, )