Nur noch OGC: Aenderungen speichern in der Seitenleiste, GeoJSON-Weg entfernt

Erik, 08.09.2026: "in die GUI das Speichern via OGC einbauen, GeoJSON nicht mehr
verwenden."

- Seitenleiste hat jetzt zwei Bloecke: "Layer" (Auswahl, laden, Aenderungen
  speichern) und "Darstellung" (Stil, Vorlage-Haken).
- Neuer Knopf "Aenderungen speichern" -> VlnKartenPlugin.run_save_edits():
  schliesst die offenen Bearbeitungssitzungen ALLER geladenen OAPIF-Layer auf
  einmal; ohne offene Bearbeitung kommt ein Hinweis statt einer Aktion.
  Zurueckgeschrieben wird ohnehin je Feature (Part 4), der Knopf beendet nur die
  Sitzung.
- Der GeoJSON-Weg ist raus: die vier Datensatz-Knoepfe, "Aktiven Layer
  hochladen", DATASETS, run_load_dataset, run_upload_active_layer,
  _confirm_replace_existing, vln_karten/layer_manager.py sowie
  KartenApiClient.load_layer_complete/save_feature_collection.
- Stil-Hinweise angepasst: den Stil des eigenen Verfahrens darf jeder speichern,
  die Vorlage nur die Gruppe MODUL_KARTENSTIL (Server-PR #565).

Geprueft headless mit QGIS 4.2 gegen die Live-API (TG Test 27998): ohne
Bearbeitung Hinweis, mit Aenderung Sitzung geschlossen, API zaehlt +1, Feature
sichtbar, danach wieder aufgeraeumt. Panel-Test deckt die neuen Knoepfe ab.
metadata.txt 0.5.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
erik
2026-09-08 10:06:45 +02:00
co-authored by Claude Fable 5.1
parent 1680b4ede3
commit 6b0ce65c61
7 changed files with 92 additions and 468 deletions
-38
View File
@@ -127,35 +127,6 @@ class KartenApiClient:
# Karten-Layer (die konkreten Pfade stehen in plugin.DATASETS)
# ------------------------------------------------------------------
def load_layer_complete(self, layer_key, vkz, page_size=2000):
"""Lädt ALLE Objekte eines Layers für eine VKZ aus KARTE_OBJEKT.
Nutzt wie das Web-GIS (0_map, db_p41) den Listen-Endpunkt
/maps/<layer>?vkz=…, aber mit limit/offset-Paging, bis keine
weitere Seite mehr kommt — so ist der Abruf auch bei mehr als
2000 Objekten garantiert vollständig."""
from urllib.parse import quote
features = []
offset = 0
while True:
data = self._request(
"GET",
"/maps/%s?vkz=%s&limit=%d&offset=%d"
% (quote(str(layer_key)), quote(str(vkz)), page_size, offset),
)
if not isinstance(data, dict) or data.get("type") != "FeatureCollection":
raise ApiError(
"Antwort von /maps/%s ist keine GeoJSON FeatureCollection."
% layer_key
)
page = data.get("features", [])
features.extend(page)
if len(page) < page_size:
break
offset += page_size
return {"type": "FeatureCollection", "features": features}
def load_feature_collection(self, path):
"""Lädt einen Layer als GeoJSON FeatureCollection (dict)."""
data = self._request("GET", path)
@@ -171,15 +142,6 @@ class KartenApiClient:
"Antwort von %s ist keine GeoJSON FeatureCollection." % path
)
def save_feature_collection(self, path, feature_collection):
"""Schreibt eine GeoJSON FeatureCollection zurück an die API
(PUT ersetzt den kompletten Layer der jeweiligen VKZ)."""
return self._request("PUT", path, payload=feature_collection)
# ------------------------------------------------------------------
# Intern
# ------------------------------------------------------------------
def _request(self, method, path, payload=None, with_auth=True):
if with_auth and not self.is_authenticated:
raise AuthError("Nicht angemeldet — bitte zuerst einloggen.")