Files
API_Karte_QGISDemo/tools/headless_dienste_test.py
T
erikandClaude Opus 5 c8b723b653 Geodienste aus der Linkliste laden — je Verfahren, aus der Seitenleiste
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>
2026-09-11 17:37:58 +02:00

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)