Files
API_Karte_QGISDemo/tools/headless_panel_test.py
T
erikandClaude Fable 5.1 6b0ce65c61 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>
2026-09-08 10:06:45 +02:00

107 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
"""Seitenleiste headless pruefen: Zustaende, Filter, Rueckrufe — und als PNG rendern.
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_panel_test.py /tmp/panel.png
Holt die echte Verfahrensliste (GET /tgen) und prueft Zustaende, Filter und Rueckrufe der
Seitenleiste; das PNG zeigt das Layout ohne QGIS-Fenster.
"""
import os, sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from qgis.core import QgsApplication
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
QNetworkProxyFactory.setUseSystemConfiguration(False)
from qgis.PyQt.QtCore import QSize
from vln_karten.panel import VlnPanel
from vln_karten.api_client import KartenApiClient
ZIEL = sys.argv[1]
FEHLER, GERUFEN = [], []
def pruefe(bed, text):
print((" OK " if bed else " FEHL ") + text)
if not bed:
FEHLER.append(text)
rueckrufe = {name: (lambda *a, n=name: GERUFEN.append((n, a)))
for name in ("login", "logout", "verfahren_gewaehlt", "load_ogc",
"save_edits", "save_style")}
panel = VlnPanel(None, callbacks=rueckrufe)
print("== abgemeldet ==")
pruefe(panel.login_knopf.isVisible() or not panel.logout_knopf.isVisibleTo(panel),
"Anmelde-Knopf sichtbar, Abmelden verborgen")
pruefe(not panel.ogc_knopf.isEnabled() and not panel.combo.isEnabled()
and not panel.speichern_knopf.isEnabled(), "Knoepfe und Auswahl gesperrt")
print("== angemeldet, echte Verfahrensliste ==")
client = KartenApiClient(api_key=os.environ["VLN_TOKEN"])
verfahren = client.get_verfahren()
panel.set_angemeldet(True, "erik.sefkow@…")
panel.set_verfahren(verfahren)
pruefe(panel.ogc_knopf.isEnabled(), "Knoepfe frei")
pruefe(panel.anzahl_eintraege() == len(verfahren) + 1,
"Liste gefuellt: %d Verfahren + Platzhalter" % len(verfahren))
print("== Filter ==")
panel.filter_feld.setText("berb")
treffer = [panel.combo.itemText(i) for i in range(panel.combo.count())][1:]
pruefe(treffer and all("berb" in t.lower() for t in treffer),
"gefiltert auf %d Treffer: %s" % (len(treffer), ", ".join(treffer)[:70]))
panel.filter_feld.setText("gibtsnicht")
pruefe(panel.combo.count() == 1 and panel.combo.currentData() is None,
"kein Treffer -> Platzhalter, kein VKZ")
panel.filter_feld.clear()
pruefe(panel.anzahl_eintraege() == len(verfahren) + 1, "Filter geleert -> Liste wieder voll")
print("== Auswahl + Rueckruf ==")
panel.waehle_vkz("27027")
pruefe(panel.aktuelles_vkz() == "27027", "Wiederherstellen ohne Rueckruf: %s" % panel.aktuelles_vkz())
pruefe(not any(n == "verfahren_gewaehlt" for n, _ in GERUFEN), "waehle_vkz loest keinen Rueckruf aus")
panel.combo.setCurrentIndex(panel.combo.findData(verfahren[0]["vkz"]))
pruefe(any(n == "verfahren_gewaehlt" for n, _ in GERUFEN), "Nutzerauswahl meldet ans Plugin")
panel.waehle_vkz("27027")
print("== Knoepfe ==")
panel.ogc_knopf.click(); panel.speichern_knopf.click(); panel.stil_knopf.click()
namen = [n for n, _ in GERUFEN]
for erwartet in ("load_ogc", "save_edits", "save_style"):
pruefe(erwartet in namen, "Rueckruf %s" % erwartet)
pruefe(not hasattr(panel, "datensatz_knoepfe") and not hasattr(panel, "upload_knopf"),
"kein GeoJSON-Weg mehr in der Seitenleiste")
pruefe(panel.gewaehlte_gruppen() == {"Verfahren", "Vorerhebung", "Maßnahmenblätter"},
"alle Gruppen zunaechst angehakt: %s" % sorted(panel.gewaehlte_gruppen()))
panel.gruppen_haken["Verfahren"].setChecked(False)
pruefe(panel.gewaehlte_gruppen() == {"Vorerhebung", "Maßnahmenblätter"},
"Abwaehlen wirkt: %s" % sorted(panel.gewaehlte_gruppen()))
panel.gruppen_haken["Verfahren"].setChecked(True)
pruefe(not panel.als_vorlage(), "Vorlage-Haken standardmaessig aus")
panel.vorlage_haken.setChecked(True)
pruefe(panel.als_vorlage(), "Vorlage-Haken wirkt")
panel.vorlage_haken.setChecked(False)
print("== Bild ==")
panel.set_status("Stil gespeichert: kas-27027-flaeche (Vorlage)")
panel.widget().resize(QSize(300, 760))
panel.widget().grab().save(ZIEL)
print(" ", ZIEL, os.path.getsize(ZIEL), "Bytes")
app.exitQgis()
print("== Ergebnis: %d Fehler ==" % len(FEHLER))
for f in FEHLER:
print(" -", f)
sys.exit(1 if FEHLER else 0)