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