Fassung 0.7.1: Liste der Geodienste gehoert zur Auswahl

Nach einem Wechsel von Verfahren oder Landkreis blieb die geholte Liste
stehen; "Ausgewaehlte laden" lud sie dann unter dem Namen der neuen
Auswahl. Jetzt merkt sich die Seitenleiste, fuer welche Auswahl die
Liste geholt wurde, und leert sie bei jedem Wechsel (auch beim stillen
Wiederherstellen aus der Projektdatei). Ein Filter, der die Auswahl
behaelt, laesst sie stehen. Die Meldung nach "Liste holen" nennt beim
Landkreis den Landkreis statt "dieses Verfahren".

Gefunden am 07.10.2026 bei der Aufnahme des Erklaervideos Linkliste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
KAI
2026-10-07 20:12:29 +02:00
co-authored by Claude Opus 5.5
parent c3386dc454
commit 8253f4f863
5 changed files with 63 additions and 8 deletions
+2 -1
View File
@@ -268,7 +268,8 @@ mit den Häkchen (Erik, 06.10.2026).
- **Liste holen** ruft `GET /linkliste?vkz=…` — für ein Verfahren oder, seit 0.7.0, für einen - **Liste holen** ruft `GET /linkliste?vkz=…` — für ein Verfahren oder, seit 0.7.0, für einen
ganzen Landkreis (Eintrag „… — Linkliste des Landkreises“ oben in der Auswahl). Die Liste ganzen Landkreis (Eintrag „… — Linkliste des Landkreises“ oben in der Auswahl). Die Liste
kommt fertig aufgelöst; je Zeile stehen Name, Gruppe › Untergruppe und Herkunft. kommt fertig aufgelöst; je Zeile stehen Name, Gruppe › Untergruppe und Herkunft. Wechselt die
Auswahl, leert sich die Liste (seit 0.7.1) — „Liste holen“ holt sie für die neue Auswahl.
- **Ausgewählte laden** hängt die angehakten Dienste schrittweise unter „Geodienste <vkz> <Name>“ - **Ausgewählte laden** hängt die angehakten Dienste schrittweise unter „Geodienste <vkz> <Name>“
ein: Gruppe › Untergruppe › Layer (`linkliste.zielgruppe`); ohne Untergruppe direkt unter die ein: Gruppe › Untergruppe › Layer (`linkliste.zielgruppe`); ohne Untergruppe direkt unter die
Gruppe. Ein hinterlegter Stil kommt über `GET /linkliste/{id}/style.qml`. Gruppe. Ein hinterlegter Stil kommt über `GET /linkliste/{id}/style.qml`.
+29
View File
@@ -109,7 +109,36 @@ pruefe(an() == [True, False], "neue Liste uebernimmt die Kartenwahl: %r" % an())
pruefe("Karten: Wertermittlung" in panel.dienste_liste.item(0).toolTip(), "Karten im Tooltip") pruefe("Karten: Wertermittlung" in panel.dienste_liste.item(0).toolTip(), "Karten im Tooltip")
for haken in panel.karten_haken.values(): for haken in panel.karten_haken.values():
haken.setChecked(False) haken.setChecked(False)
print("== 0.7.1: die Liste gehoert zur Auswahl ==")
# Bis 0.7.0 blieb die Liste nach einem Wechsel stehen; „Ausgewaehlte laden“ lud sie dann unter
# dem Namen der neuen Auswahl (gefunden 07.10.2026 bei der Videoaufnahme).
dienste = [{"name": "LSG", "gruppe_name": "Natur", "herkunft_text": "landesweit"},
{"name": "Biotope Punkte", "gruppe_name": "Natur", "untergruppe": "Biotope",
"herkunft_text": "landesweit"}]
panel.combo.setCurrentIndex(panel.combo.findData("27"))
panel.set_dienste(dienste, "27")
pruefe(panel.dienste_liste.count() == 2, "Liste fuer den Landkreis geholt")
panel.filter_feld.setText("meiß")
pruefe(panel.aktuelles_vkz() == "27" and panel.dienste_liste.count() == 2,
"Filter, der die Auswahl behaelt: Liste bleibt")
panel.filter_feld.clear()
pruefe(panel.aktuelles_vkz() == "27" and panel.dienste_liste.count() == 2, "Filter geleert: Liste bleibt")
panel.combo.setCurrentIndex(panel.combo.findData("27027"))
pruefe(panel.dienste_liste.count() == 0, "Wechsel zum Verfahren leert die Liste")
pruefe("Liste holen" in panel.status_zeile.text(), "Hinweis in der Statuszeile: %r" % panel.status_zeile.text())
panel.set_dienste(dienste) # ohne vkz: gilt fuer die aktuelle Auswahl
panel.waehle_vkz("27027")
pruefe(panel.dienste_liste.count() == 2, "dieselbe Auswahl erneut gesetzt: Liste bleibt")
panel.waehle_vkz("31005")
pruefe(panel.dienste_liste.count() == 0, "stiller Wechsel (Projektdatei) leert ebenfalls")
panel.set_dienste(dienste)
panel.filter_feld.setText("gibtsnicht")
pruefe(panel.dienste_liste.count() == 0, "Filter ohne Treffer: keine Auswahl, keine Liste")
panel.filter_feld.clear()
panel.set_dienste(dienste)
panel.set_angemeldet(False) panel.set_angemeldet(False)
pruefe(panel.dienste_liste.count() == 0 and panel._dienste_vkz is None, "Abmelden leert Liste und Zuordnung")
GERUFEN.clear() GERUFEN.clear()
if not os.environ.get("VLN_TOKEN"): if not os.environ.get("VLN_TOKEN"):
+3 -2
View File
@@ -5,7 +5,7 @@ qgisMaximumVersion=4.99
supportsQt6=True supportsQt6=True
description=Karten des VLN Managers in QGIS: OGC API Features, alle Layer editierbar — von der Vorerhebung über das Maßnahmenblatt bis zu Widmungen und Verkehrszeichen. description=Karten des VLN Managers in QGIS: OGC API Features, alle Layer editierbar — von der Vorerhebung über das Maßnahmenblatt bis zu Widmungen und Verkehrszeichen.
about=Anmeldung mit der Manager-Kennung (der API-Key wird gemerkt), Verfahrenslayer über die OGC API laden und bearbeiten (jede Änderung geht einzeln zurück), Geodienste aus der Linkliste, Stile vom Server. Verkehrszeichen und Widmungen lassen sich wie im Web setzen: Schild aus der Palette wählen, erster Klick Standort, zweiter Klick Blickrichtung; die Schildgrafiken kommen von der API und liegen danach lokal. about=Anmeldung mit der Manager-Kennung (der API-Key wird gemerkt), Verfahrenslayer über die OGC API laden und bearbeiten (jede Änderung geht einzeln zurück), Geodienste aus der Linkliste, Stile vom Server. Verkehrszeichen und Widmungen lassen sich wie im Web setzen: Schild aus der Palette wählen, erster Klick Standort, zweiter Klick Blickrichtung; die Schildgrafiken kommen von der API und liegen danach lokal.
version=0.7.0 version=0.7.1
author=Erik author=Erik
email=phpwelt@gmail.com email=phpwelt@gmail.com
tracker=https://entwicklung.flurneuordnung-sachsen.de/VLN_SN/API_Karte_QGISDemo/issues tracker=https://entwicklung.flurneuordnung-sachsen.de/VLN_SN/API_Karte_QGISDemo/issues
@@ -15,6 +15,7 @@ category=Web
icon= icon=
experimental=True experimental=True
deprecated=False deprecated=False
changelog=0.7.0 Linkliste mit Untergruppen (Gruppe › Untergruppe › Layer), Kartenwahl (Wege- und Gewässerplan, Neugestaltungsgrundsätze, Wertermittlung) hakt passende Dienste vor, Linkliste auch für den ganzen Landkreis; Auswahl über /tgen/auswahl: als oFB die Verfahren des Landkreises „nur lesen“, Layer dort schreibgeschützt; ein 403 meldet nicht mehr ab. changelog=0.7.1 Liste der Geodienste leert sich beim Wechsel von Verfahren oder Landkreis (bis 0.7.0 blieb die alte Liste stehen, „Ausgewählte laden“ lud sie unter dem neuen Namen); Meldung nach „Liste holen“ nennt beim Landkreis den Landkreis.
0.7.0 Linkliste mit Untergruppen (Gruppe › Untergruppe › Layer), Kartenwahl (Wege- und Gewässerplan, Neugestaltungsgrundsätze, Wertermittlung) hakt passende Dienste vor, Linkliste auch für den ganzen Landkreis; Auswahl über /tgen/auswahl: als oFB die Verfahren des Landkreises „nur lesen“, Layer dort schreibgeschützt; ein 403 meldet nicht mehr ab.
0.6.0 Widmungen und Verkehrszeichen: eigene Layergruppe, Schildgrafiken vom Server (lokal abgelegt), Palette mit Suche, Werkzeuge „Schild setzen" und „Zusatzzeichen"; Seitenleiste rollt statt das QGIS-Fenster zu strecken (Issue #1). 0.6.0 Widmungen und Verkehrszeichen: eigene Layergruppe, Schildgrafiken vom Server (lokal abgelegt), Palette mit Suche, Werkzeuge „Schild setzen" und „Zusatzzeichen"; Seitenleiste rollt statt das QGIS-Fenster zu strecken (Issue #1).
0.5.0 Geodienste aus der Linkliste, Stile speichern, Seitenleiste statt Werkzeugleiste. 0.5.0 Geodienste aus der Linkliste, Stile speichern, Seitenleiste statt Werkzeugleiste.
+26 -3
View File
@@ -72,6 +72,7 @@ class VlnPanel(QDockWidget):
self._cb = callbacks or {} self._cb = callbacks or {}
self._verfahren = [] # [(beschriftung, vkz)] — ungefiltert self._verfahren = [] # [(beschriftung, vkz)] — ungefiltert
self._stumm = False # unterdrückt Signale beim programmatischen Füllen self._stumm = False # unterdrückt Signale beim programmatischen Füllen
self._dienste_vkz = None # Auswahl, für die die Liste der Geodienste geholt wurde
inhalt = QWidget() inhalt = QWidget()
aussen = QVBoxLayout(inhalt) aussen = QVBoxLayout(inhalt)
@@ -330,9 +331,14 @@ class VlnPanel(QDockWidget):
for eintrag, an in zip(eintraege, vorhaken(daten, self.gewaehlte_karten())): for eintrag, an in zip(eintraege, vorhaken(daten, self.gewaehlte_karten())):
eintrag.setCheckState(Qt.CheckState.Checked if an else Qt.CheckState.Unchecked) eintrag.setCheckState(Qt.CheckState.Checked if an else Qt.CheckState.Unchecked)
def set_dienste(self, dienste): def set_dienste(self, dienste, vkz=None):
"""Die geholte Liste anzeigen: Name, Gruppe › Untergruppe und Herkunft, alle zunächst """Die geholte Liste anzeigen: Name, Gruppe › Untergruppe und Herkunft, alle zunächst
angehakt.""" angehakt.
:param vkz: Verfahren oder Landkreis, für das die Liste geholt wurde (ohne Angabe: die
aktuelle Auswahl). Wechselt die Auswahl, leert sich die Liste (seit 0.7.1).
"""
self._dienste_vkz = self.combo.currentData() if vkz is None else vkz
self.dienste_liste.clear() self.dienste_liste.clear()
for d in dienste or []: for d in dienste or []:
gruppe = d.get("gruppe_name") or "" gruppe = d.get("gruppe_name") or ""
@@ -404,6 +410,7 @@ class VlnPanel(QDockWidget):
self.combo.addItem("— bitte anmelden —", None) self.combo.addItem("— bitte anmelden —", None)
self.filter_feld.clear() self.filter_feld.clear()
self.dienste_liste.clear() self.dienste_liste.clear()
self._dienste_vkz = None
self._stumm = False self._stumm = False
def set_verfahren(self, verfahren, aemter=()): def set_verfahren(self, verfahren, aemter=()):
@@ -441,11 +448,13 @@ class VlnPanel(QDockWidget):
return {name for name, haken in self.gruppen_haken.items() if haken.isChecked()} return {name for name, haken in self.gruppen_haken.items() if haken.isChecked()}
def waehle_vkz(self, vkz): def waehle_vkz(self, vkz):
"""Setzt die Auswahl ohne Rückruf (Wiederherstellen aus der Projektdatei).""" """Setzt die Auswahl ohne Rückruf (Wiederherstellen aus der Projektdatei); eine Liste
der Geodienste für eine andere Auswahl leert sich trotzdem."""
self._stumm = True self._stumm = True
index = self.combo.findData(vkz) if vkz else -1 index = self.combo.findData(vkz) if vkz else -1
self.combo.setCurrentIndex(index if index >= 0 else 0) self.combo.setCurrentIndex(index if index >= 0 else 0)
self._stumm = False self._stumm = False
self._dienste_zur_auswahl()
def anzahl_eintraege(self): def anzahl_eintraege(self):
return self.combo.count() return self.combo.count()
@@ -472,6 +481,7 @@ class VlnPanel(QDockWidget):
index = self.combo.findData(vorher) if vorher else -1 index = self.combo.findData(vorher) if vorher else -1
self.combo.setCurrentIndex(index if index >= 0 else 0) self.combo.setCurrentIndex(index if index >= 0 else 0)
self._stumm = False self._stumm = False
self._dienste_zur_auswahl()
if index < 0 and vorher: if index < 0 and vorher:
self._auswahl_geaendert(0) self._auswahl_geaendert(0)
@@ -480,8 +490,21 @@ class VlnPanel(QDockWidget):
def _auswahl_geaendert(self, _index): def _auswahl_geaendert(self, _index):
if not self._stumm: if not self._stumm:
self._dienste_zur_auswahl()
self._ruf("verfahren_gewaehlt", self.combo.currentData()) self._ruf("verfahren_gewaehlt", self.combo.currentData())
def _dienste_zur_auswahl(self):
"""Die Liste der Geodienste gehört zu der Auswahl, für die sie geholt wurde.
Nach einem Wechsel leert sie sich — sonst lüde „Ausgewählte laden“ die alte Liste unter
dem Namen der neuen Auswahl (bis 0.7.0). Ein Filter, der die Auswahl behält, lässt sie
stehen.
"""
if self.dienste_liste.count() and self.combo.currentData() != self._dienste_vkz:
self.dienste_liste.clear()
self._dienste_vkz = None
self.set_status("Auswahl gewechselt — „Liste holen“ zeigt die Geodienste.")
def _ruf(self, name, *args): def _ruf(self, name, *args):
rueckruf = self._cb.get(name) rueckruf = self._cb.get(name)
if rueckruf: if rueckruf:
+3 -2
View File
@@ -403,14 +403,15 @@ class VlnKartenPlugin:
self.panel.set_karten(linkliste.karten_laden(self.client)) self.panel.set_karten(linkliste.karten_laden(self.client))
except ApiError: except ApiError:
self.panel.set_karten(linkliste.KARTEN_VORGABE) self.panel.set_karten(linkliste.KARTEN_VORGABE)
self.panel.set_dienste(dienste) self.panel.set_dienste(dienste, vkz)
herkunft = {} herkunft = {}
for d in dienste: for d in dienste:
herkunft[d.get("herkunft_text") or "?"] = herkunft.get(d.get("herkunft_text") or "?", 0) + 1 herkunft[d.get("herkunft_text") or "?"] = herkunft.get(d.get("herkunft_text") or "?", 0) + 1
text = ", ".join("%d %s" % (n, k) for k, n in herkunft.items()) or "nichts hinterlegt" text = ", ".join("%d %s" % (n, k) for k, n in herkunft.items()) or "nichts hinterlegt"
self.panel.set_status("%d Geodienste: %s" % (len(dienste), text)) self.panel.set_status("%d Geodienste: %s" % (len(dienste), text))
wofuer = "diesen Landkreis" if ist_landkreis(vkz) else "dieses Verfahren"
self.iface.messageBar().pushMessage( self.iface.messageBar().pushMessage(
"VLN Karten", "%d Geodienste für dieses Verfahren (%s)." % (len(dienste), text), "VLN Karten", "%d Geodienste für %s (%s)." % (len(dienste), wofuer, text),
level=Qgis.Info, duration=6) level=Qgis.Info, duration=6)
def run_dienste_laden(self): def run_dienste_laden(self):