Erik, 11.09.2026: "als angemeldeter Nutzer TG-spezifisch die Dienste aus der Linkliste einbinden". - vln_karten/linkliste.py (neu): holt GET /v2/linkliste?vkz=…, baut je Anbieter den passenden Layer (wms, wfs, rest/ArcGIS, geojson/ogr), wendet den beim Eintrag hinterlegten QML-Stil an und haengt alles schrittweise in die Gruppe "Geodienste <VKZ> <Name>" mit Untergruppen je Listengruppe. - Seitenleiste: neuer Block "Geodienste (Linkliste)" mit Liste holen, Haken je Dienst (Name, Gruppe, Herkunft, Stil-Hinweis), alle an/aus und Ausgewaehlte laden. - Die Liste kommt fertig aufgeloest vom Server; das Plugin rechnet nichts nach. Zwei Dinge, die der Test gezeigt hat (tools/headless_dienste_test.py, QGIS 4.2 ohne Fenster gegen die Live-Schnittstelle): * Die Adressform muss schlicht "url=<Adresse>" sein, wie in Plugin_SN_Basis/modules/LayerLoader.py. Mit einem selbst gebauten QgsDataSourceUri (crs, format) kam der ArcGIS-Layer erst nach 60 s und ungueltig zurueck; jetzt 0,4 s und 4457 Objekte. * Ein 404 auf style.qml erreicht QgsBlockingNetworkRequest als Transportfehler. Erst den Statuscode ansehen, sonst meldet das Plugin einen Fehler, wo schlicht kein Stil hinterlegt ist. Testlauf 11.09.2026: 44 Dienste in 0,8 s, Layer gueltig, Stil angewendet, "kein Stil hinterlegt" sauber gemeldet — 0 Fehler. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
90 lines
3.5 KiB
Python
90 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Die Linkliste im Plugin: holen, Layer bauen, Stil anwenden — gegen die echte Schnittstelle.
|
|
|
|
Aufruf (macOS, QGIS 4.2 im Bundle; VLN_TOKEN = API-Key aus dem Login):
|
|
|
|
APP=/Applications/QGIS-final-4_2_0.app; LIB="$APP/Contents/Resources/python3.12"
|
|
QT_QPA_PLATFORM=offscreen PROJ_DATA="$APP/Contents/Resources/qgis/proj" \\
|
|
PYTHONPATH="$LIB:$LIB/lib-dynload:$LIB/site-packages" \\
|
|
"$APP/Contents/MacOS/python3.12" tools/headless_dienste_test.py
|
|
"""
|
|
import os, sys, tempfile, time
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
from qgis.core import QgsApplication, QgsNetworkAccessManager, QgsProject
|
|
|
|
app = QgsApplication([], True)
|
|
QgsApplication.setPrefixPath("/Applications/QGIS-final-4_2_0.app/Contents/MacOS", True)
|
|
QgsApplication.setPluginPath("/Applications/QGIS-final-4_2_0.app/Contents/PlugIns/qgis")
|
|
app.initQgis()
|
|
from qgis.PyQt.QtNetwork import QNetworkProxyFactory, QNetworkDiskCache
|
|
QNetworkProxyFactory.setUseSystemConfiguration(False)
|
|
c = QNetworkDiskCache(); c.setCacheDirectory(tempfile.mkdtemp())
|
|
QgsNetworkAccessManager.instance().setCache(c)
|
|
|
|
from vln_karten import linkliste as LL
|
|
from vln_karten.api_client import KartenApiClient
|
|
|
|
BASE, KEY, VKZ = "https://api.flurneuordnung-sachsen.de/v2", os.environ["VLN_TOKEN"], "27027"
|
|
FEHLER = []
|
|
|
|
|
|
def pruefe(b, t):
|
|
print((" OK " if b else " FEHL ") + t)
|
|
if not b:
|
|
FEHLER.append(t)
|
|
|
|
|
|
client = KartenApiClient(base_url=BASE, api_key=KEY)
|
|
print("== 1) Liste holen ==")
|
|
t = time.time()
|
|
dienste = LL.dienste_laden(client, VKZ)
|
|
pruefe(len(dienste) > 0, "%d Dienste in %.2f s" % (len(dienste), time.time() - t))
|
|
pruefe(all({"name", "provider", "url", "herkunft"} <= set(d) for d in dienste),
|
|
"alle Felder vorhanden, die der Layerbau braucht")
|
|
|
|
print("== 2) Layer bauen, je Anbieter einer ==")
|
|
gebaut = {}
|
|
for d in dienste:
|
|
p = d["provider"]
|
|
if p in gebaut:
|
|
continue
|
|
t = time.time()
|
|
lyr = LL.layer_bauen(d)
|
|
ok = lyr is not None and lyr.isValid()
|
|
gebaut[p] = ok
|
|
pruefe(ok, "%-5s %-34s %s (%.1f s)" % (p, d["name"][:34],
|
|
"gueltig" if ok else (lyr.error().message()[:60] if lyr else "kein Layer"),
|
|
time.time() - t))
|
|
if ok and hasattr(lyr, "featureCount"):
|
|
print(" Features:", lyr.featureCount())
|
|
|
|
print("== 3) Stil aus der Datenbank anwenden ==")
|
|
mit_stil = [d for d in dienste if d.get("stil")]
|
|
if mit_stil:
|
|
d = mit_stil[0]
|
|
lyr = LL.layer_bauen(d)
|
|
if lyr is not None and lyr.isValid():
|
|
vorher = lyr.renderer().type() if hasattr(lyr, "renderer") and lyr.renderer() else "-"
|
|
ok, meldung = LL.stil_anwenden(lyr, BASE, d["id"], KEY)
|
|
nachher = lyr.renderer().type() if hasattr(lyr, "renderer") and lyr.renderer() else "-"
|
|
pruefe(ok, "Stil fuer '%s': %s (Renderer %s -> %s)" % (d["name"], meldung or "angewendet",
|
|
vorher, nachher))
|
|
else:
|
|
print(" (Layer nicht gueltig, Stil nicht pruefbar)")
|
|
else:
|
|
print(" (kein Eintrag mit Stil)")
|
|
|
|
print("== 4) ohne Stil meldet sauber ==")
|
|
ohne = [d for d in dienste if not d.get("stil")]
|
|
if ohne:
|
|
lyr = LL.layer_bauen(ohne[0])
|
|
if lyr is not None and lyr.isValid():
|
|
ok, meldung = LL.stil_anwenden(lyr, BASE, ohne[0]["id"], KEY)
|
|
pruefe(not ok and "kein Stil" in meldung, "Meldung statt Fehler: %s" % meldung)
|
|
|
|
app.exitQgis()
|
|
print("== %d Fehler ==" % len(FEHLER))
|
|
for f in FEHLER:
|
|
print(" -", f)
|
|
sys.exit(1 if FEHLER else 0)
|