From 1881af93f8d1fde77e4a527df04f2642a1b86ecc Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 2 Dec 2025 20:55:51 +0100 Subject: [PATCH] =?UTF-8?q?PruefManager=20und=20Daten=20aus=20P41=20=C3=BC?= =?UTF-8?q?bertragen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Dateipruefer_flowchart.svg | 102 ++++ assets/Linkpruefer_flowchart.svg | 3 + assets/Objektstruktur.txt | 122 +++++ assets/Pluginkonzept.md | 22 + assets/Stilpruefer_flowchart.svg | 1 + assets/UML_Struktur.png | Bin 0 -> 141866 bytes modules/Dateipruefer.py | 97 ++++ modules/Pruefmanager.py | 51 ++ modules/__init__py | 0 modules/linkpruefer.py | 94 ++++ modules/pruef_ergebnis | 11 + modules/pruef_ergebnis.py | 11 + modules/stilpruefer.py | 45 ++ styles/GIS_63000F_Objekt_Denkmalschutz.qml | 609 +++++++++++++++++++++ styles/GIS_Biotope_F.qml | 225 ++++++++ styles/GIS_Flst_Beschriftung_ALKIS_NAS.qml | 349 ++++++++++++ styles/GIS_LfULG_LSG.qml | 371 +++++++++++++ styles/verfahrensgebiet.qml | 414 ++++---------- test/__init__.py | 1 + test/run_tests.py | 29 + test/start_osgeo4w_qgis.bat | 9 + test/test_dateipruefer.py | 88 +++ test/test_linkpruefer.py | 125 +++++ test/test_pruefmanager.py | 36 ++ test/test_stilpruefer.py | 47 ++ 25 files changed, 2567 insertions(+), 295 deletions(-) create mode 100644 assets/Dateipruefer_flowchart.svg create mode 100644 assets/Linkpruefer_flowchart.svg create mode 100644 assets/Objektstruktur.txt create mode 100644 assets/Pluginkonzept.md create mode 100644 assets/Stilpruefer_flowchart.svg create mode 100644 assets/UML_Struktur.png create mode 100644 modules/Dateipruefer.py create mode 100644 modules/Pruefmanager.py create mode 100644 modules/__init__py create mode 100644 modules/linkpruefer.py create mode 100644 modules/pruef_ergebnis create mode 100644 modules/pruef_ergebnis.py create mode 100644 modules/stilpruefer.py create mode 100644 styles/GIS_63000F_Objekt_Denkmalschutz.qml create mode 100644 styles/GIS_Biotope_F.qml create mode 100644 styles/GIS_Flst_Beschriftung_ALKIS_NAS.qml create mode 100644 styles/GIS_LfULG_LSG.qml create mode 100644 test/__init__.py create mode 100644 test/run_tests.py create mode 100644 test/start_osgeo4w_qgis.bat create mode 100644 test/test_dateipruefer.py create mode 100644 test/test_linkpruefer.py create mode 100644 test/test_pruefmanager.py create mode 100644 test/test_stilpruefer.py diff --git a/assets/Dateipruefer_flowchart.svg b/assets/Dateipruefer_flowchart.svg new file mode 100644 index 0000000..b9abfe8 --- /dev/null +++ b/assets/Dateipruefer_flowchart.svg @@ -0,0 +1,102 @@ +

Ja

VERBOTEN

NUTZE_STANDARD
ohne plugin_pfad/standard

NUTZE_STANDARD
mit plugin_pfad+standard

TEMPORAER_ERLAUBT

Nein

Ja

Nein

Ja=ABBRECHEN

Ja=ERSETZEN/ANHAENGEN

Nein

Start: Eingabe prüfen

Pfad leer?

leer_modus

Return: erfolgreich=False
Fehler: 'Kein Pfad angegeben'

Return: erfolgreich=False
Fehler: 'Standardpfad/-name fehlen'

Setze Pfad=plugin_pfad+standard

Return: erfolgreich=True
temporär=True

Datei existiert?

vorhandene_datei_entscheidung gesetzt?

Return: erfolgreich=True
entscheidung=None
Fehler: 'Datei existiert bereits – Entscheidung ausstehend'

Return: erfolgreich=False
Fehler: 'Benutzer hat abgebrochen'

Return: erfolgreich=True
entscheidung=...

Return: erfolgreich=True
pfad=...

\ No newline at end of file diff --git a/assets/Linkpruefer_flowchart.svg b/assets/Linkpruefer_flowchart.svg new file mode 100644 index 0000000..7d791de --- /dev/null +++ b/assets/Linkpruefer_flowchart.svg @@ -0,0 +1,3 @@ + + +

Nein

Ja

Ja

Nein

Ja

Ja

Nein

Nein

Ja

Nein

Start Linkprüfung

Ist Link vorhanden?

Fehler: Link fehlt

Prüfergebnis: Fehler zurückgeben

Ist Link Remote http/https?

HEAD-Anfrage mit QgsNetworkAccessManager

Antwort erhalten?

Fehler: Verbindungsfehler

Prüfergebnis: Fehler zurückgeben

HTTP-Statuscode < 200 oder ≥ 400?

Fehler: Link nicht erreichbar

Anbieter klassifizieren

Prüfergebnis zurückgeben

Plausibilitätscheck für lokalen Link

Link sieht ungewöhnlich aus?

Warnung ausgeben

\ No newline at end of file diff --git a/assets/Objektstruktur.txt b/assets/Objektstruktur.txt new file mode 100644 index 0000000..df3e392 --- /dev/null +++ b/assets/Objektstruktur.txt @@ -0,0 +1,122 @@ ++ PluginController + └─ GUIManager + └─ PrüfManager (koordiniert alle Prüfer) + ├─ Dateiprüfer + ├─ Linklistenprüfer + │ └─ Zeilenprüfer[n] + │ ├─ Linkprüfer + │ └─ Stilprüfer + └─ LayerLoader + └─ Logger + +Plan41_plugin/ +│ +├── plugin/ # Plugin-Code +│ ├── main_plugin.py # PluginController +│ ├── dock_widget.py # GUIManager +│ ├── pruefer/ +│ │ ├── dateipruefer.py +│ │ ├── linklistenpruefer.py +│ │ ├── zeilenpruefer.py +│ │ ├── linkpruefer.py +│ │ └── stilpruefer.py +│ ├── loader.py +│ └── logger.py +│ +├── tests/ # Unit-Tests +│ ├── __init__.py +│ ├── test_dateipruefer.py +│ ├── test_linklistenpruefer.py +│ ├── test_zeilenpruefer.py +│ ├── test_linkpruefer.py +│ ├── test_stilpruefer.py +│ ├── test_logger.py +│ └── run_tests.py # zentraler Test-Runner +│ +├── requirements.txt +└── README.md + + ++------------------------------------+ +| PluginController | ++------------------------------------+ +| - Dock_widget: GUIManager | +| - pruef_manager: PruefManager | +| - loader: LayerLoader | +| - logger: Logger | ++------------------------------------+ +| + start(): void | ++------------------------------------+ + ++------------------------------------+ +| GUIManager | ++------------------------------------+ +| - dialog: QWidget | ++------------------------------------+ +| + getParameter(): dict | ++------------------------------------+ + ++------------------------------------+ +| PruefManager | ++------------------------------------+ +| - dateipruefer: Dateipruefer | +| - linklistenpruefer: Linklisten... | ++------------------------------------+ +| + pruefe_alle(parameter): list | ++------------------------------------+ + ++------------------------------------+ +| Dateipruefer | ++------------------------------------+ +| + pruefe(pfad: str): PruefErgebnis | ++------------------------------------+ + ++------------------------------------+ +| Linklistenpruefer | ++------------------------------------+ +| + pruefe(pfad: str): list[Zeile] | ++------------------------------------+ + ++------------------------------------+ +| Zeilenpruefer | ++------------------------------------+ +| - linkpruefer: Linkpruefer | +| - stilpruefer: Stilpruefer | ++------------------------------------+ +| + pruefe(zeile: str): LayerAuftrag | ++------------------------------------+ + ++------------------------------------+ +| Linkpruefer | ++------------------------------------+ +| + pruefe(link: str): PruefErgebnis | ++------------------------------------+ + ++------------------------------------+ +| Stilpruefer | ++------------------------------------+ +| + pruefe(stilname: str): Pruef... | ++------------------------------------+ + ++------------------------------------+ +| LayerLoader | ++------------------------------------+ +| + lade(layer_auftrag): void | ++------------------------------------+ + ++------------------------------------+ +| Logger | ++------------------------------------+ +| + schreibe(msg: str): void | +| + exportiere(): file | ++------------------------------------+ + ++------------------------------------+ +| PruefErgebnis | ++------------------------------------+ +| - erfolgreich: bool | +| - daten: dict | +| - fehler: list[str] | +| - warnungen: list[str] | ++------------------------------------+ + diff --git a/assets/Pluginkonzept.md b/assets/Pluginkonzept.md new file mode 100644 index 0000000..fd3ff8a --- /dev/null +++ b/assets/Pluginkonzept.md @@ -0,0 +1,22 @@ +**Pluginkonzept** +Das Plugin ist grundsätzlich als modulares System gedacht. Komponenten sollen sowohl im Plugin selbst, aber auch in anderen Anwendungen verbaut werden können. +Die Module sind als Python-Objekte angelegt. +Alle Fallunterscheidungen, Exception-Management und Fehlerbehandlung sind in die "Prüfer" ausgelagert. +Der "Prüfmanager" übernimmt dabei die Interaktion mit dem Anwender, um Abfragen oder Fallunterscheidungen durchzuführen, die nicht anhand des Codes erfolgen können. +Alle Prüfer geben ein Objekt "Prüfergebnis" zurück, das das Ergebnis der Fallunterscheidung, Exceptions und Fehlermeldungen enthält. Die Prüfer haben selbst keine UI-Elemente. + +| Modul | Aufgabe | Beschreibung | +|-------------------|---------------------------------------|--------------| +|PruefManager | Nutzerabfragen, Ergebnisanpassung | Der Pruefmanager wertet das Ergebnis vom Typ "PruefErgebnis" aus. Sind Entscheidungen erforderlich, fragt er den Anwender und passt das PruefErgebnis entsprechend an, bzw gibt Fehler aus| +|Dateipruefer | Auswertung der Eingaben in Dateiauswahlfeldern | Der Dateipruefer prüft die Eingaben in Dateifeldern. Dabei kann bei jeder Prüfung vorgegeben werden, ob leere Eingabefelder zulässig sind, und ob sie, wenn sie leer sind, eine Standarddatei aufrufen oder temporäre Layer erzeugen. In jedem Fall wird der Nutzer zur Entscheidung aufgefordert, ob das leere Feld beabsichtigt ist, oder ein Bedienfehler| +|Linklistenpruefer | Spezialprüfer für die Linkliste aus dem Plan41-Plugin | Damit die beiden Objekte Stilpruefer und Linkpruefer auch unabhängig voneinander verwendet werden können, fasst der Linklistenpruefer die Ergebnisse zusammen und ergänzt eine Prüfung zur Kartenreihenfolge/Layerreihenfolge| +|Linkpruefer | prüft die Quelle eines angegebenen Links technisch und entscheidet die technischen Parameter nach Typ und Quellort | Enthält eine Fallunterscheidung für lokale und remote-Quellen, sowie für unterschiedliche Datenanbieter. Der Linkpruefer gibt Fehler und Exceptions zurück, wenn die Quelle fehlerhaft oder nicht erreichbar ist.| +|Stilpruefer | Prüft verschiedene Stilquellen | Der Stilpruefer prüft .qml und eingebettete Stile und gibt Warnungen zurück, bzw. Exceptions, um Nutzerentscheidungen auszulösen| + +Jedes Modul hat seinen eigenen Unittest. Die Tests werden im Unterordner "Test" zusammengefasst und können gesammelt über die "run_tests.py" aufgerufen werden. + +Jedes Modul wird durch ein Mermaid-ClassDiagram beschrieben. Die Entscheidungen und Exceptions, sowie die behandelten Fehler werden visuell aufbereitet. + +Zur Verarbeitung werden alle Nutzerinteraktionen und Angaben zunächst in den zuständigen Prüfer übergeben. Wenn vorhanden, mit den erforderlichen Parametern. Das Ergebnis wird zur Auswertung an den Pruefmanager übergeben. Dieser bereitet das Ergebnis auf, behandelt alle Exceptions und Anwenderentscheidungen und gibt die Daten mit den richtigen Parametern zur Weiterverarbeitung an die eigentliche Funktion. + + diff --git a/assets/Stilpruefer_flowchart.svg b/assets/Stilpruefer_flowchart.svg new file mode 100644 index 0000000..dafc0d0 --- /dev/null +++ b/assets/Stilpruefer_flowchart.svg @@ -0,0 +1 @@ +
Nein
Ja
Nein
Ja
Nein
Ja
Input Stilpfad
Stilpfad vorhanden?
Ergebnis: Erfolg, Stil=None, Warnung 'Kein Stil angegeben'
Datei existiert?
Ergebnis: Fehler 'Stildatei nicht gefunden'
Endet mit .qml?
Ergebnis: Fehler 'Ungültige Dateiendung'
Ergebnis: Erfolg, Stil=pfad
\ No newline at end of file diff --git a/assets/UML_Struktur.png b/assets/UML_Struktur.png new file mode 100644 index 0000000000000000000000000000000000000000..70fea303a3720dbd07bc07f635fb618d7432752d GIT binary patch literal 141866 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%0Alf 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�(rw7tyS&q?bX$z zxUtN7c?wn3#*V&lLKfz`D*SEp4aqOog%PKb2o0=A`?LW0Zj{!knbiS_C)LpzO8fDu zG)DmS>qeNm2INNQo|K+BT)!{q3Cal5z=^0L+AQz+!YSrthR4STS-N-lUCqll3(`2L zgM~^ut!2Q>*3#19tEZ4=0I{;OZIy;IYd;fLb;6&Q-~loJYZtwrbR=^p%2Qj~lKV7Y z)qwGGWC5+@I9&+i9V}BdWgNrOlHWy9m-+c)Ljy9#IB=o6J|sijS<$uf#t}`ULmD(Y z{BU!-dbXcqx%FUfYn7hMPP-gjfzn{w+O|7qAzom3o^QsLG2DN~X#q~SiP{|cdEvr^ z-tpTb>5Hgr(vJ_K!_TR?7eLu6vyVKc!JiGXi^a|7hEh5+A7vz3^}-zlxNq2`Jx^-e zFF)Rp`S$r4S62X%5@_MgPd}Td7qfdlxl02SB%D&x>TXNCt*}uT0RbBnYaSN37A0+x zb{J)nci`bP7O{k;mQ~NEI+Vs7Nr5{^1*xA>)}+#kQg)cWecKe;!67?#=J1Z02QoE( zQz?AsrxMWUpD!9rQ>$n``Qb48LWWX$XOme4X@=2QpzFPH=744hQBLL`QuT+FqE%yN zRCYLSp=?TSb_y}K8}UoCPb?Std@PUE4cYg=J`vYBF2MK9?iVuL?TeOdcZdhS@o<(hgz5>Vi&8-3xLO2b}<~0DCJI9R8&OW2)c9U zPGj{5phb|l)7g*L3)m#sIXIm1jw{BHl_sGvlEvx+=eB;>ONi#Nq(?lm5zaS%l{tk* zr$=}j8@sFR%CNn>zOL^CSt(ThX3z4Ty`FRrc~vNwrKPbSx#a2#e4^G g0Osghe~ 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 literal 0 HcmV?d00001 diff --git a/modules/Dateipruefer.py b/modules/Dateipruefer.py new file mode 100644 index 0000000..166eccc --- /dev/null +++ b/modules/Dateipruefer.py @@ -0,0 +1,97 @@ +import os +from enum import Enum, auto + + +# ------------------------------- +# ENUMS +# ------------------------------- +class LeererPfadModus(Enum):#legt die modi fest, die für Dateipfade möglich sind + VERBOTEN = auto() #ein leeres Eingabefeld stellt einen Fehler dar + NUTZE_STANDARD = auto() #ein leeres Eingabefeld fordert zur Entscheidung auf: nutze Standard oder brich ab + TEMPORAER_ERLAUBT = auto() #ein leeres Eingabefeld fordert zur Entscheidung auf: arbeite temporär oder brich ab. + + +class DateiEntscheidung(Enum):#legt die Modi fest, wie mit bestehenden Dateien umgegangen werden soll (hat das das QGSFile-Objekt schon selbst?) + ERSETZEN = auto()#Ergebnis der Nutzerentscheidung: bestehende Datei ersetzen + ANHAENGEN = auto()#Ergebnis der Nutzerentscheidung: an bestehende Datei anhängen + ABBRECHEN = auto()#bricht den Vorgang ab. (muss das eine definierte Option sein? oder geht das auch mit einem normalen Abbruch-Button) + + +# ------------------------------- +# RÜCKGABEOBJEKT +# ------------------------------- +#Das Dateiprüfergebnis wird an den Prüfmanager übergeben. Alle GUI-Abfragen werden im Prüfmanager behandelt. +class DateipruefErgebnis: + #Definition der Parameter und Festlegung auf den Parametertyp,bzw den Standardwert + def __init__(self, erfolgreich: bool, pfad: str = None, temporär: bool = False, + entscheidung: DateiEntscheidung = None, fehler: list = None): + self.erfolgreich = erfolgreich + self.pfad = pfad + self.temporär = temporär + self.entscheidung = entscheidung + self.fehler = fehler or [] + + def __repr__(self): + return (f"DateipruefErgebnis(erfolgreich={self.erfolgreich}, " + f"pfad={repr(self.pfad)}, temporär={self.temporär}, " + f"entscheidung={repr(self.entscheidung)}, fehler={repr(self.fehler)})") + +# ------------------------------- +# DATEIPRÜFER +# ------------------------------- +class Dateipruefer: + def pruefe(self, pfad: str, + leer_modus: LeererPfadModus, + standardname: str = None, + plugin_pfad: str = None, + vorhandene_datei_entscheidung: DateiEntscheidung = None) -> DateipruefErgebnis: #Rückgabetypannotation; "Die Funktion "pruefe" gibt ein Objekt vom Typ "DateipruefErgebnis" zurück + + # 1. Prüfe, ob das Eingabefeld leer ist + if not pfad or pfad.strip() == "":#wenn der angegebene Pfad leer oder ungültig ist: + if leer_modus == LeererPfadModus.VERBOTEN: #wenn der Modus "verboten" vorgegeben ist, gib zurück, dass der Test fehlgeschlagen ist + return DateipruefErgebnis( + erfolgreich=False, + fehler=["Kein Pfad angegeben."] + ) + elif leer_modus == LeererPfadModus.NUTZE_STANDARD:#wenn der Modus "Nutze_Standard" vorgegeben ist... + if not plugin_pfad or not standardname:#wenn kein gültiger Pluginpfad angegeben ist oder die Standarddatei fehlt... + return DateipruefErgebnis( + erfolgreich=False, + fehler=["Standardpfad oder -name fehlen."]#..gib zurück, dass der Test fehlgeschlagen ist + ) + pfad = os.path.join(plugin_pfad, standardname)#...wenn es Standarddatei und Pluginpfad gibt...setze sie zum Pfad zusammen... + elif leer_modus == LeererPfadModus.TEMPORAER_ERLAUBT:#wenn der Modus "temporär" vorgegeben ist,... + return DateipruefErgebnis(#...gib zurück, dass das Prüfergebnis erfolgreich ist (Entscheidung, ob temporör gearbeitet werden soll oder nicht, kommt woanders) + erfolgreich=True, + pfad=None + ) + + # 2. Existiert die Datei bereits? + if os.path.exists(pfad):#wenn die Datei vorhanden ist... + if not vorhandene_datei_entscheidung:#aber noch keine Entscheidung getroffen ist... + return DateipruefErgebnis( + erfolgreich=True,#ist die Prüfung erfolgreich, aber es muss noch eine Entscheidung verlangt werden + pfad=pfad, + entscheidung=None, + fehler=["Datei existiert bereits – Entscheidung ausstehend."] + ) + + if vorhandene_datei_entscheidung == DateiEntscheidung.ABBRECHEN: + return DateipruefErgebnis(#...der Nutzer aber abgebrochen hat... + erfolgreich=False,#ist die Prüfung fehlgeschlagen ISSUE: ergibt das Sinn? + pfad=pfad, + fehler=["Benutzer hat abgebrochen."] + ) + + return DateipruefErgebnis( + erfolgreich=True, + pfad=pfad, + entscheidung=vorhandene_datei_entscheidung + ) + + # 3. Pfad gültig und Datei nicht vorhanden + #wenn alle Varianten NICHT zutreffen, weil ein gültiger Pfad eingegeben wurde und die Datei noch nicht vorhanden ist: + return DateipruefErgebnis( + erfolgreich=True, + pfad=pfad + ) diff --git a/modules/Pruefmanager.py b/modules/Pruefmanager.py new file mode 100644 index 0000000..e3b97ce --- /dev/null +++ b/modules/Pruefmanager.py @@ -0,0 +1,51 @@ +from PyQt5.QtWidgets import QMessageBox, QFileDialog +from Dateipruefer import DateiEntscheidung + +class PruefManager: + + def __init__(self, iface=None, plugin_pfad=None): + self.iface = iface + self.plugin_pfad = plugin_pfad + + def frage_datei_ersetzen_oder_anhaengen(self, pfad: str) -> DateiEntscheidung: + """Fragt den Nutzer, ob die vorhandene Datei ersetzt, angehängt oder abgebrochen werden soll.""" + msg = QMessageBox() + msg.setIcon(QMessageBox.Question) + msg.setWindowTitle("Datei existiert") + msg.setText(f"Die Datei '{pfad}' existiert bereits.\nWas möchtest du tun?") + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) + msg.setDefaultButton(QMessageBox.Yes) + msg.button(QMessageBox.Yes).setText("Ersetzen") + msg.button(QMessageBox.No).setText("Anhängen") + msg.button(QMessageBox.Cancel).setText("Abbrechen") + + result = msg.exec_() + + if result == QMessageBox.Yes: + return DateiEntscheidung.ERSETZEN + elif result == QMessageBox.No: + return DateiEntscheidung.ANHAENGEN + else: + return DateiEntscheidung.ABBRECHEN + + def frage_temporär_verwenden(self) -> bool: + """Fragt den Nutzer, ob mit temporären Layern gearbeitet werden soll.""" + msg = QMessageBox() + msg.setIcon(QMessageBox.Question) + msg.setWindowTitle("Temporäre Layer") + msg.setText("Kein Speicherpfad wurde angegeben.\nMit temporären Layern fortfahren?") + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + msg.setDefaultButton(QMessageBox.Yes) + + result = msg.exec_() + return result == QMessageBox.Yes + + def waehle_dateipfad(self, titel="Speicherort wählen", filter="GeoPackage (*.gpkg)") -> str: + """Öffnet einen QFileDialog zur Dateiauswahl.""" + pfad, _ = QFileDialog.getSaveFileName( + parent=None, + caption=titel, + directory=self.plugin_pfad or "", + filter=filter + ) + return pfad diff --git a/modules/__init__py b/modules/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/modules/linkpruefer.py b/modules/linkpruefer.py new file mode 100644 index 0000000..b840a25 --- /dev/null +++ b/modules/linkpruefer.py @@ -0,0 +1,94 @@ +# Importiert den Event-Loop und URL-Objekte aus der PyQt-Bibliothek von QGIS +from qgis.PyQt.QtCore import QEventLoop, QUrl +# Importiert den NetworkAccessManager aus dem QGIS Core-Modul +from qgis.core import QgsNetworkAccessManager +# Importiert das QNetworkRequest-Objekt für HTTP-Anfragen +from qgis.PyQt.QtNetwork import QNetworkRequest +# Importiert die Klasse für das Ergebnisobjekt der Prüfung +from pruef_ergebnis import PruefErgebnis + +# Definiert die Klasse zum Prüfen von Links +class Linkpruefer: + """Prüft den Link mit QgsNetworkAccessManager und klassifiziert Anbieter nach Attribut.""" + + # Statische Zuordnung möglicher Anbietertypen als Konstanten + ANBIETER_TYPEN: dict[str, str] = { + "REST": "REST", + "WFS": "WFS", + "WMS": "WMS", + "OGR": "OGR" + } + + # Konstruktor zum Initialisieren der Instanz + def __init__(self, link: str, anbieter: str): + # Speichert den übergebenen Link als Instanzvariable + self.link = link + + # Speichert den Anbietertyp, bereinigt und in Großbuchstaben (auch wenn leer oder None) + self.anbieter = anbieter.upper().strip() if anbieter else "" + # Erstellt einen neuen NetworkAccessManager für Netzwerkverbindungen + self.network_manager = QgsNetworkAccessManager() + + # Methode zur Klassifizierung des Anbieters und der Quelle + def klassifiziere_anbieter(self): + # Bestimmt den Typ auf Basis der vorgegebenen Konstante oder nimmt den Rohwert + typ = self.ANBIETER_TYPEN.get(self.anbieter, self.anbieter) + # Unterscheidet zwischen "remote" (http/https) oder "local" (Dateipfad) + quelle = "remote" if self.link.startswith(("http://", "https://")) else "local" + # Gibt Typ und Quelle als Dictionary zurück + return { + "typ": typ, + "quelle": quelle + } + + + # Prüft die Erreichbarkeit und Plausibilität des Links + def pruefe_link(self): + # Initialisiert Listen für Fehler und Warnungen + fehler = [] + warnungen = [] + + # Prüft, ob ein Link übergeben wurde + if not self.link: + fehler.append("Link fehlt.") + return PruefErgebnis(False, fehler=fehler, warnungen=warnungen) + + # Prüft, ob ein Anbieter angegeben ist + if not self.anbieter or not self.anbieter.strip(): + fehler.append("Anbieter muss gesetzt werden und darf nicht leer sein.") + + # Prüfung für Remote-Links (http/https) + if self.link.startswith(("http://", "https://")): + # Erstellt eine HTTP-Anfrage mit dem Link + request = QNetworkRequest(QUrl(self.link)) + # Startet eine HEAD-Anfrage über den NetworkManager + reply = self.network_manager.head(request) + + # Wartet synchron auf die Netzwerkanwort (Event Loop) + loop = QEventLoop() + reply.finished.connect(loop.quit) + loop.exec_() + + # Prüft auf Netzwerkfehler + if reply.error(): + fehler.append(f"Verbindungsfehler: {reply.errorString()}") + else: + # Holt den HTTP-Statuscode aus der Antwort + status = reply.attribute(reply.HttpStatusCodeAttribute) + # Prüft, ob der Status außerhalb des Erfolgsbereichs liegt + if status is None or status < 200 or status >= 400: + fehler.append(f"Link nicht erreichbar: HTTP {status}") + # Räumt die Antwort auf (Vermeidung von Speicherlecks) + reply.deleteLater() + else: + # Plausibilitäts-Check für lokale Links (Dateien), prüft auf Dateiendung + if "." not in self.link.split("/")[-1]: + warnungen.append("Der lokale Link sieht ungewöhnlich aus.") + + # Gibt das Ergebnisobjekt mit allen gesammelten Informationen zurück + return PruefErgebnis(len(fehler) == 0, daten=self.klassifiziere_anbieter(), fehler=fehler, warnungen=warnungen) + + # Führt die Linkprüfung als externe Methode aus + def ausfuehren(self): + # Gibt das Ergebnis der Prüf-Methode zurück + return self.pruefe_link() diff --git a/modules/pruef_ergebnis b/modules/pruef_ergebnis new file mode 100644 index 0000000..4f9b719 --- /dev/null +++ b/modules/pruef_ergebnis @@ -0,0 +1,11 @@ +# Klasse zur Definition eines Pruefergebnis-Objekts, das in allen Prüfern verwendet werden kann +class PruefErgebnis: + def __init__(self, erfolgreich: bool, daten=None, fehler=None, warnungen=None): + self.erfolgreich = erfolgreich + self.daten = daten or {} + self.fehler = fehler or [] + self.warnungen = warnungen or [] + + def __repr__(self): + return (f"PruefErgebnis(erfolgreich={self.erfolgreich}, " + f"daten={self.daten}, fehler={self.fehler}, warnungen={self.warnungen})") diff --git a/modules/pruef_ergebnis.py b/modules/pruef_ergebnis.py new file mode 100644 index 0000000..4f9b719 --- /dev/null +++ b/modules/pruef_ergebnis.py @@ -0,0 +1,11 @@ +# Klasse zur Definition eines Pruefergebnis-Objekts, das in allen Prüfern verwendet werden kann +class PruefErgebnis: + def __init__(self, erfolgreich: bool, daten=None, fehler=None, warnungen=None): + self.erfolgreich = erfolgreich + self.daten = daten or {} + self.fehler = fehler or [] + self.warnungen = warnungen or [] + + def __repr__(self): + return (f"PruefErgebnis(erfolgreich={self.erfolgreich}, " + f"daten={self.daten}, fehler={self.fehler}, warnungen={self.warnungen})") diff --git a/modules/stilpruefer.py b/modules/stilpruefer.py new file mode 100644 index 0000000..1ac65b1 --- /dev/null +++ b/modules/stilpruefer.py @@ -0,0 +1,45 @@ +import os +from pruef_ergebnis import PruefErgebnis + + +class Stilpruefer: + """ + Prüft, ob ein angegebener Stilpfad gültig und nutzbar ist. + - Wenn kein Stil angegeben ist, gilt die Prüfung als erfolgreich. + - Wenn angegeben: + * Datei muss existieren + * Dateiendung muss '.qml' sein + """ + + def pruefe(self, stilpfad: str) -> PruefErgebnis: + # kein Stil angegeben -> erfolgreich, keine Warnung + if not stilpfad or stilpfad.strip() == "": + return PruefErgebnis( + erfolgreich=True, + daten={"stil": None}, + warnungen=["Kein Stil angegeben."] + ) + + fehler = [] + warnungen = [] + + # Prüfung: Datei existiert? + if not os.path.exists(stilpfad): + fehler.append(f"Stildatei nicht gefunden: {stilpfad}") + + # Prüfung: Endung .qml? + elif not stilpfad.lower().endswith(".qml"): + fehler.append(f"Ungültige Dateiendung für Stil: {stilpfad}") + else: + # Hinweis: alle Checks bestanden + return PruefErgebnis( + erfolgreich=True, + daten={"stil": stilpfad} + ) + + return PruefErgebnis( + erfolgreich=False if fehler else True, + daten={"stil": stilpfad}, + fehler=fehler, + warnungen=warnungen + ) diff --git a/styles/GIS_63000F_Objekt_Denkmalschutz.qml b/styles/GIS_63000F_Objekt_Denkmalschutz.qml new file mode 100644 index 0000000..06bb9e5 --- /dev/null +++ b/styles/GIS_63000F_Objekt_Denkmalschutz.qml @@ -0,0 +1,609 @@ + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "gml_id" + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "gml_id" + + 2 + diff --git a/styles/GIS_Biotope_F.qml b/styles/GIS_Biotope_F.qml new file mode 100644 index 0000000..ed06272 --- /dev/null +++ b/styles/GIS_Biotope_F.qml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 2 + diff --git a/styles/GIS_Flst_Beschriftung_ALKIS_NAS.qml b/styles/GIS_Flst_Beschriftung_ALKIS_NAS.qml new file mode 100644 index 0000000..5e40734 --- /dev/null +++ b/styles/GIS_Flst_Beschriftung_ALKIS_NAS.qml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 2 + diff --git a/styles/GIS_LfULG_LSG.qml b/styles/GIS_LfULG_LSG.qml new file mode 100644 index 0000000..28082ba --- /dev/null +++ b/styles/GIS_LfULG_LSG.qml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 2 + diff --git a/styles/verfahrensgebiet.qml b/styles/verfahrensgebiet.qml index 5504107..474e368 100644 --- a/styles/verfahrensgebiet.qml +++ b/styles/verfahrensgebiet.qml @@ -1,25 +1,83 @@ - - - 1 - 1 - 1 - - + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1 - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . - - 0 - . - - 0 - generatedlayout - - - - - - - - - - - - - - - - - - - - - - COALESCE( "name", '<NULL>' ) - + + + + + + + + + + + + + + + + + + + 0 + 0 2 diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..324c4b2 --- /dev/null +++ b/test/__init__.py @@ -0,0 +1 @@ +#Testordner \ No newline at end of file diff --git a/test/run_tests.py b/test/run_tests.py new file mode 100644 index 0000000..6f94a3a --- /dev/null +++ b/test/run_tests.py @@ -0,0 +1,29 @@ +import sys +import os +import unittest + +# Projekt-Root dem Suchpfad hinzufügen +project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +def main(): + loader = unittest.TestLoader() + suite = unittest.TestSuite() + + test_modules = [ + "test_dateipruefer", + "test_stilpruefer", + "test_linkpruefer", + # "test_pruefmanager" enthält QGIS-spezifische Funktionen + ] + + for mod_name in test_modules: + mod = __import__(mod_name) + suite.addTests(loader.loadTestsFromModule(mod)) + + runner = unittest.TextTestRunner(verbosity=2) + runner.run(suite) + +if __name__ == "__main__": + main() diff --git a/test/start_osgeo4w_qgis.bat b/test/start_osgeo4w_qgis.bat new file mode 100644 index 0000000..a4b0c23 --- /dev/null +++ b/test/start_osgeo4w_qgis.bat @@ -0,0 +1,9 @@ +@echo off +SET OSGEO4W_ROOT=D:\QGISQT5 +call %OSGEO4W_ROOT%\bin\o4w_env.bat +set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis +set PYTHONPATH=%QGIS_PREFIX_PATH%\python;%PYTHONPATH% +set PATH=%OSGEO4W_ROOT%\bin;%QGIS_PREFIX_PATH%\bin;%PATH% + +REM Neue Eingabeaufforderung starten und Python-Skript ausführen +start cmd /k "python run_tests.py" diff --git a/test/test_dateipruefer.py b/test/test_dateipruefer.py new file mode 100644 index 0000000..6f8ff7d --- /dev/null +++ b/test/test_dateipruefer.py @@ -0,0 +1,88 @@ +import unittest +import os +import tempfile +import sys + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from Dateipruefer import ( + Dateipruefer, + LeererPfadModus, + DateiEntscheidung, + DateipruefErgebnis +) + + +class TestDateipruefer(unittest.TestCase): + def setUp(self): + self.pruefer = Dateipruefer() + self.plugin_pfad = tempfile.gettempdir() + self.standardname = "test_standard.gpkg" + + def test_verbotener_leerer_pfad(self): + result = self.pruefer.pruefe( + pfad="", + leer_modus=LeererPfadModus.VERBOTEN + ) + self.assertFalse(result.erfolgreich) + self.assertIn("Kein Pfad angegeben.", result.fehler) + + def test_standardpfad_wird_verwendet(self): + result = self.pruefer.pruefe( + pfad="", + leer_modus=LeererPfadModus.NUTZE_STANDARD, + standardname=self.standardname, + plugin_pfad=self.plugin_pfad + ) + self.assertTrue(result.erfolgreich) + expected_path = os.path.join(self.plugin_pfad, self.standardname) + self.assertEqual(result.pfad, expected_path) + + def test_temporärer_layer_wird_erkannt(self): + result = self.pruefer.pruefe( + pfad="", + leer_modus=LeererPfadModus.TEMPORAER_ERLAUBT + ) + self.assertTrue(result.erfolgreich) + self.assertIsNone(result.pfad) + self.assertFalse(result.temporär) + + def test_existierende_datei_ohne_entscheidung(self): + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_path = tmp_file.name + try: + result = self.pruefer.pruefe( + pfad=tmp_path, + leer_modus=LeererPfadModus.VERBOTEN + ) + self.assertTrue(result.erfolgreich) # neu: jetzt True, nicht False + self.assertIn("Datei existiert bereits – Entscheidung ausstehend.", result.fehler) + self.assertIsNone(result.entscheidung) + finally: + os.remove(tmp_path) + + def test_existierende_datei_mit_entscheidung_ersetzen(self): + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_path = tmp_file.name + try: + result = self.pruefer.pruefe( + pfad=tmp_path, + leer_modus=LeererPfadModus.VERBOTEN, + vorhandene_datei_entscheidung=DateiEntscheidung.ERSETZEN + ) + self.assertTrue(result.erfolgreich) + self.assertEqual(result.entscheidung, DateiEntscheidung.ERSETZEN) + finally: + os.remove(tmp_path) + + def test_datei_nicht_existiert(self): + fake_path = os.path.join(self.plugin_pfad, "nicht_existierend.gpkg") + result = self.pruefer.pruefe( + pfad=fake_path, + leer_modus=LeererPfadModus.VERBOTEN + ) + self.assertTrue(result.erfolgreich) + self.assertEqual(result.pfad, fake_path) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/test_linkpruefer.py b/test/test_linkpruefer.py new file mode 100644 index 0000000..35baeb3 --- /dev/null +++ b/test/test_linkpruefer.py @@ -0,0 +1,125 @@ +# test/test_linkpruefer.py + +import unittest +import sys +from unittest.mock import patch +from qgis.PyQt.QtCore import QCoreApplication, QTimer +from qgis.PyQt.QtNetwork import QNetworkRequest + +from linkpruefer import Linkpruefer + +# Stelle sicher, dass eine Qt-App existiert +app = QCoreApplication.instance() +if app is None: + app = QCoreApplication(sys.argv) + + +class DummyReply: + """Fake-Reply, um Netzwerkabfragen zu simulieren""" + HttpStatusCodeAttribute = QNetworkRequest.HttpStatusCodeAttribute + + def __init__(self, error, status_code): + self._error = error + self._status_code = status_code + self.finished = self # Fake-Signal + + def connect(self, slot): + # sorgt dafür, dass loop.quit() nach Start von loop.exec_() ausgeführt wird + QTimer.singleShot(0, slot) + + def error(self): + return self._error + + def errorString(self): + return "Simulierter Fehler" if self._error != 0 else "" + + def attribute(self, attr): + if attr == self.HttpStatusCodeAttribute: + return self._status_code + return None + + def deleteLater(self): + # kein echtes QObject → wir tun einfach nichts + pass + + +class TestLinkpruefer(unittest.TestCase): + """Tests für alle Funktionen des Linkpruefer""" + + # ---------------------------- + # Remote-Tests mit DummyReply + # ---------------------------- + @patch('linkpruefer.QgsNetworkAccessManager.head') + def test_remote_link_success(self, mock_head): + mock_head.return_value = DummyReply(0, 200) + + checker = Linkpruefer("https://example.com/service", "REST") + result = checker.ausfuehren() + + self.assertTrue(result.erfolgreich) + self.assertEqual(result.daten['typ'], 'REST') + self.assertEqual(result.daten['quelle'], 'remote') + self.assertEqual(result.fehler, []) + self.assertEqual(result.warnungen, []) + + @patch('linkpruefer.QgsNetworkAccessManager.head') + def test_remote_link_failure(self, mock_head): + mock_head.return_value = DummyReply(1, 404) + + checker = Linkpruefer("https://example.com/kaputt", "WMS") + result = checker.ausfuehren() + + self.assertFalse(result.erfolgreich) + self.assertIn("Verbindungsfehler: Simulierter Fehler", result.fehler) + + # ---------------------------- + # Klassifizierungstests + # ---------------------------- + def test_klassifiziere_anbieter_remote(self): + checker = Linkpruefer("https://beispiel.de", "wms") + daten = checker.klassifiziere_anbieter() + self.assertEqual(daten["typ"], "WMS") + self.assertEqual(daten["quelle"], "remote") + + def test_klassifiziere_anbieter_local(self): + checker = Linkpruefer("C:/daten/test.shp", "ogr") + daten = checker.klassifiziere_anbieter() + self.assertEqual(daten["typ"], "OGR") + self.assertEqual(daten["quelle"], "local") + + # ---------------------------- + # Lokale Links + # ---------------------------- + def test_pruefe_link_local_ok(self): + checker = Linkpruefer("C:/daten/test.shp", "OGR") + result = checker.pruefe_link() + self.assertTrue(result.erfolgreich) + self.assertEqual(result.warnungen, []) + + def test_pruefe_link_local_warnung(self): + checker = Linkpruefer("C:/daten/ordner/", "OGR") + result = checker.pruefe_link() + self.assertTrue(result.erfolgreich) + self.assertIn("ungewöhnlich", result.warnungen[0]) + + # ---------------------------- + # Sonderfall: leerer Link + # ---------------------------- + def test_pruefe_link_empty(self): + checker = Linkpruefer("", "REST") + result = checker.pruefe_link() + self.assertFalse(result.erfolgreich) + self.assertIn("Link fehlt.", result.fehler) + + # ---------------------------- + # leerer Anbieter + # ---------------------------- + def test_pruefe_link_leerer_anbieter(self): + checker = Linkpruefer("https://example.com/service", "") + result = checker.pruefe_link() + self.assertFalse(result.erfolgreich) + self.assertIn("Anbieter muss gesetzt werden und darf nicht leer sein.", result.fehler) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/test_pruefmanager.py b/test/test_pruefmanager.py new file mode 100644 index 0000000..a33d4e5 --- /dev/null +++ b/test/test_pruefmanager.py @@ -0,0 +1,36 @@ +import unittest +import os +from unittest.mock import patch +from pruefmanager import PruefManager +from Dateipruefer import DateiEntscheidung +import sys + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +class TestPruefManager(unittest.TestCase): + + def setUp(self): + self.manager = PruefManager(plugin_pfad="/tmp") + + @patch("PyQt5.QtWidgets.QMessageBox.exec_", return_value=QMessageBox.Yes) + def test_frage_datei_ersetzen(self, mock_msgbox): + entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg") + self.assertEqual(entscheidung, DateiEntscheidung.ERSETZEN) + + @patch("PyQt5.QtWidgets.QMessageBox.exec_", return_value=QMessageBox.No) + def test_frage_datei_anhaengen(self, mock_msgbox): + entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg") + self.assertEqual(entscheidung, DateiEntscheidung.ANHAENGEN) + + @patch("PyQt5.QtWidgets.QMessageBox.exec_", return_value=QMessageBox.Cancel) + def test_frage_datei_abbrechen(self, mock_msgbox): + entscheidung = self.manager.frage_datei_ersetzen_oder_anhaengen("dummy.gpkg") + self.assertEqual(entscheidung, DateiEntscheidung.ABBRECHEN) + + @patch("PyQt5.QtWidgets.QMessageBox.exec_", return_value=QMessageBox.Yes) + def test_frage_temporär_verwenden_ja(self, mock_msgbox): + self.assertTrue(self.manager.frage_temporär_verwenden()) + + @patch("PyQt5.QtWidgets.QMessageBox.exec_", return_value=QMessageBox.No) + def test_frage_temporär_verwenden_nein(self, mock_msgbox): + self.assertFalse(self.manager.frage_temporär_verwenden()) diff --git a/test/test_stilpruefer.py b/test/test_stilpruefer.py new file mode 100644 index 0000000..ea37db7 --- /dev/null +++ b/test/test_stilpruefer.py @@ -0,0 +1,47 @@ +import unittest +import tempfile +import os +from stilpruefer import Stilpruefer +from pruef_ergebnis import PruefErgebnis + + +class TestStilpruefer(unittest.TestCase): + def setUp(self): + self.pruefer = Stilpruefer() + + def test_keine_datei_angegeben(self): + result = self.pruefer.pruefe("") + self.assertTrue(result.erfolgreich) + self.assertIn("Kein Stil angegeben.", result.warnungen) + self.assertIsNone(result.daten["stil"]) + + def test_datei_existiert_mit_qml(self): + with tempfile.NamedTemporaryFile(suffix=".qml", delete=False) as tmp_file: + tmp_path = tmp_file.name + try: + result = self.pruefer.pruefe(tmp_path) + self.assertTrue(result.erfolgreich) + self.assertEqual(result.daten["stil"], tmp_path) + self.assertEqual(result.fehler, []) + finally: + os.remove(tmp_path) + + def test_datei_existiert_falsche_endung(self): + with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as tmp_file: + tmp_path = tmp_file.name + try: + result = self.pruefer.pruefe(tmp_path) + self.assertFalse(result.erfolgreich) + self.assertIn("Ungültige Dateiendung", result.fehler[0]) + finally: + os.remove(tmp_path) + + def test_datei_existiert_nicht(self): + fake_path = os.path.join(tempfile.gettempdir(), "nichtvorhanden.qml") + result = self.pruefer.pruefe(fake_path) + self.assertFalse(result.erfolgreich) + self.assertIn("Stildatei nicht gefunden", result.fehler[0]) + + +if __name__ == "__main__": + unittest.main()