Erik, 08.09.2026: "ich will keine Toolbar, sondern so eine Seitenleiste auf der rechten Seite." - vln_karten/panel.py (neu): andockbares QDockWidget, rechts angedockt, mit den Abschnitten Anmeldung, Verfahren, OGC API und Klassisch (GeoJSON) sowie einer Statuszeile. Reine Oberflaeche; Klicks gehen als Rueckrufe ans Plugin. - Verfahrensliste bekommt ein Suchfeld (Hausregel: Auswahllisten immer mit Filter). Die Auswahl bleibt beim Filtern erhalten, "kein Treffer" liefert kein VKZ. - Der Stil-Knopf hat jetzt ein Haekchen "als Vorlage fuer alle Verfahren"; die Umschalttaste wirkt weiterhin. - Abmelden ist ein eigener Knopf (verwirft den gespeicherten API-Key). - Menue Web -> VLN Karten -> "Seitenleiste anzeigen" blendet sie wieder ein. - tools/headless_panel_test.py: prueft Zustaende, Filter, Rueckrufe und rendert das Layout als PNG (QGIS 4.2 offscreen). Lauf am 08.09.2026: 17 Pruefungen, 0 Fehler, 285 Verfahren in der Liste. - README und metadata.txt (0.3.0) nachgezogen. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
104 lines
4.3 KiB
Python
104 lines
4.3 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.plugin import DATASETS
|
|
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_style", "load_dataset", "upload")}
|
|
panel = VlnPanel(None, callbacks=rueckrufe,
|
|
datensaetze=[(k, d["label"]) for k, d in DATASETS.items()])
|
|
|
|
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(),
|
|
"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.stil_knopf.click(); panel.upload_knopf.click()
|
|
panel.datensatz_knoepfe[0].click()
|
|
namen = [n for n, _ in GERUFEN]
|
|
for erwartet in ("load_ogc", "save_style", "upload", "load_dataset"):
|
|
pruefe(erwartet in namen, "Rueckruf %s" % erwartet)
|
|
ds = [a for n, a in GERUFEN if n == "load_dataset"]
|
|
pruefe(ds and ds[0][0] == list(DATASETS)[0], "Datensatz-Knopf uebergibt Schluessel: %s" % (ds[0] if ds else "-"))
|
|
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)
|