Fassung 0.7.0: Landkreis-Linkliste, oFB liest nur, Untergruppen, 403 meldet nicht ab

- Auswahl über GET /tgen/auswahl (Manager seit 06.10.2026): oben die eigenen Landkreise
  („… — Linkliste des Landkreises“), dann die Verfahren; als oFB die Verfahren des Landkreises
  mit „(nur lesen)“. Älterer Server ohne die Route: Rückfall auf /tgen.
- Landkreis gewählt: „Liste holen“ lädt die Linkliste des ganzen Landkreises; „Layer laden“
  erklärt, dass es für einen Landkreis keine Verfahrenslayer gibt.
- 401 und 403 getrennt: nur 401 (AuthError) meldet ab, 403 (KeinZugriff) zeigt eine Meldung.
  Bis 0.6.0 verwarf jedes 403 den gespeicherten API-Key.
- OGC-Sammlungen mit vln:schreibbar: false werden schreibgeschützt geladen; Meldungen für Stil
  und Verkehrszeichen nennen „nur lesen“ als Grund.
- Linkliste: Gruppe › Untergruppe › Layer im Ebenenbaum (linkliste.zielgruppe), Untergruppe
  auch in der Dienstliste.
- README: Abschnitt „Geodienste aus der Linkliste“; Tests ohne Netz:
  tools/headless_linkliste_test.py (neu), tools/headless_panel_test.py erweitert — beide grün
  mit QGIS 4.2 offscreen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
KAI
2026-10-06 22:44:36 +02:00
co-authored by Claude Opus 5.5
parent c84bd6e378
commit a56bf7c397
10 changed files with 331 additions and 69 deletions
+23 -9
View File
@@ -17,7 +17,7 @@ from qgis.PyQt.QtWidgets import QAction, QDialog, QMessageBox
from qgis.core import Qgis, QgsDataSourceUri, QgsProject
from .api_client import ApiError, AuthError, KartenApiClient
from .panel import VlnPanel
from .panel import VlnPanel, ist_landkreis
from .login_dialog import LoginDialog, SETTINGS_GROUP
from . import linkliste
from . import ogc_layers
@@ -143,9 +143,10 @@ class VlnKartenPlugin:
self.populate_verfahren()
def populate_verfahren(self):
"""Füllt die Auswahlliste mit allen Verfahren aus GET /tgen."""
"""Füllt die Auswahlliste aus ``GET /tgen/auswahl``: eigene Verfahren, als oFB die
Verfahren des Landkreises (nur lesen) und die Landkreise selbst (für die Linkliste)."""
try:
verfahren = self.client.get_verfahren()
auswahl = self.client.get_auswahl()
except AuthError:
self._handle_session_expired()
return
@@ -159,8 +160,15 @@ class VlnKartenPlugin:
return
self.panel.set_angemeldet(True, self.client.mail or "API-Key")
self.panel.set_verfahren(verfahren)
self.panel.set_status("%d Verfahren geladen." % len(verfahren))
verfahren, aemter = auswahl["verfahren"], auswahl["aemter"]
self.panel.set_verfahren(verfahren, aemter)
text = "%d Verfahren geladen" % len(verfahren)
lesend = sum(1 for v in verfahren if v.get("zugriff") == "lesen")
if lesend:
text += " (davon %d nur lesen)" % lesend
if aemter:
text += ", %d Landkreis(e) für die Linkliste" % len(aemter)
self.panel.set_status(text + ".")
self.restore_project_selection()
def _handle_session_expired(self):
@@ -229,6 +237,12 @@ class VlnKartenPlugin:
if not vkz:
self._show_error("Kein Verfahren", "Bitte zuerst ein Verfahren auswählen.")
return
if ist_landkreis(vkz):
self._show_error("Landkreis gewählt",
"Für einen Landkreis gibt es keine Verfahrenslayer — bitte ein "
"Verfahren wählen. Die Linkliste des Landkreises holen Sie unter "
"„Geodienste“.")
return
authcfg = ogc_layers.authcfg_sicherstellen(self.client.api_key, SETTINGS_GROUP)
if not authcfg:
self.iface.messageBar().pushMessage(
@@ -363,11 +377,11 @@ class VlnKartenPlugin:
self.panel.set_status("%d von %d Layern gespeichert." % (len(gespeichert), len(offen)))
def run_dienste_holen(self):
"""Die Linkliste des gewählten Verfahrens holen und in der Seitenleiste anzeigen.
"""Die Linkliste des gewählten Verfahrens oder Landkreises holen und anzeigen.
Der Server liefert sie bereits aufgelöst: landesweit, Landkreis, Team und Verfahren
sind zusammengeführt, geerbte Einträge tragen ihre Herkunft. Das Plugin rechnet nichts
nach, es zeigt und lädt.
Der Server liefert sie bereits aufgelöst (landesweit und Landkreis), geerbte Einträge
tragen ihre Herkunft. Das Plugin rechnet nichts nach, es zeigt und lädt. Ein 403 meldet
nicht ab (seit 0.7.0), sondern zeigt nur, dass hier keine Berechtigung besteht.
"""
if not self._ensure_logged_in():
return