Files
kundenplattform/optionen_felder.py
T
adminandClaude Sonnet 5 2618e5e468 Optionen-Eingabe auf OE-/Gruppen-Ebene + Text-/Passwort-Feldtypen
Bisher konnten Merkmal-Optionen nur pro Gerät gesetzt werden (nur
Checkboxen, siehe alte OPTIONEN_FELDER in geraete.py) - für die neuen
AD/Fileserver/Update-Proxy-Merkmale (admin/ansible-content) muss das aber
auf OE-/Gruppen-Ebene passieren (Entscheidung vom 09.09.2026: Geräte-
Einzel-Konfiguration ist nicht der vorgesehene Weg).

Neues gemeinsames Modul optionen_felder.py (ersetzt die bisher lokale,
duplizierte Map in geraete.py): Feld-Definitionen mit type
(checkbox/text/password), genutzt von geraete.py, struktur.py (neu) und
gruppen.py (neu). parse_optionen_form() ersetzt die bisherige reine
Checkbox-Parsing-Logik - Text-/Passwort-Felder werden nur übernommen,
wenn tatsächlich etwas eingegeben wurde (leer = "nicht ändern", siehe
merge_optionen() in admin/provisioning-server).

Templates (auftragskatalog.html, struktur_merkmale.html neu,
gruppe_detail.html neu) rendern je nach type ein Checkbox- oder Text-/
Passwort-Eingabefeld, mit Hinweis-Platzhalter, wenn für ein Passwort-Feld
bereits ein Wert hinterlegt ist (aus der maskierten optionen-Anzeige des
Servers, nie der Klartext).

Gehört zusammen mit admin/provisioning-server (encrypt/decrypt/merge-
Logik, erweiterte OE-/Gruppen-Select-Endpunkte) und admin/ansible-content
(die drei neuen Rollen, die diese Optionen konsumieren).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-10 09:39:02 +02:00

49 lines
2.5 KiB
Python

# Gemeinsame Feld-Definitionen für Merkmal-Optionen (ADR-0010), verwendet
# von geraete.py (Geräte-Ebene), struktur.py (OE-Ebene) und gruppen.py
# (Gruppen-Ebene) - bisher lag das nur lokal+dupliziert in geraete.py und
# kannte nur Checkboxen (siehe browser-brave/standardbrowser). Seit den
# AD/OIDC/Fileserver-Merkmalen (10.09.2026) gibt es auch Text- und
# Passwort-Felder - "type" steuert den HTML-Input-Typ und die
# Parsing-Logik in parse_optionen_form().
#
# Passwort-Felder werden nie mit ihrem aktuellen Wert vorausgefüllt (siehe
# Templates) und nur übernommen, wenn tatsächlich etwas eingegeben wurde -
# ein leer gelassenes Passwort-Feld beim Bearbeiten überschreibt also
# nicht versehentlich ein bereits gesetztes Passwort mit nichts.
OPTIONEN_FELDER = {
"browser-brave": [
{"key": "standardbrowser", "label": "Als Standardbrowser festlegen", "type": "checkbox"},
],
"ad-anbindung": [
{"key": "ad_domain", "label": "AD-Domäne (z.B. schule.local)", "type": "text"},
{"key": "ad_join_user", "label": "Beitritts-Benutzer (z.B. Administrator)", "type": "text"},
{"key": "ad_join_passwort", "label": "Beitritts-Passwort", "type": "password"},
],
"fileserver": [
{"key": "fileserver_adresse", "label": "Server-Adresse (Host oder IP)", "type": "text"},
{"key": "fileserver_protokoll", "label": "Protokoll (smb oder webdav)", "type": "text"},
{"key": "fileserver_home_freigabe", "label": "Freigabename für $HOME (leer = kein Home-Mount)", "type": "text"},
{"key": "fileserver_user", "label": "Zugangs-Benutzer (leer = Kerberos/AD-Anmeldung verwenden)", "type": "text"},
{"key": "fileserver_passwort", "label": "Zugangs-Passwort (leer = Kerberos/AD-Anmeldung verwenden)", "type": "password"},
],
"update-proxy": [
{"key": "proxy_adresse", "label": "Proxy-Gerät (Host oder IP, Port 3142)", "type": "text"},
],
}
def parse_optionen_form(form, merkmal_key: str) -> dict:
"""Liest die zu einem Merkmal gehörenden optionen-Felder aus einem
FastAPI-Formular gemäß OPTIONEN_FELDER - Checkboxen werden zu bool,
Text-/Passwort-Felder nur übernommen, wenn tatsächlich etwas eingegeben
wurde (leer = "nicht ändern", siehe Modul-Kommentar oben)."""
ergebnis = {}
for feld in OPTIONEN_FELDER.get(merkmal_key, []):
roh = form.get(f"optionen.{feld['key']}")
if feld["type"] == "checkbox":
ergebnis[feld["key"]] = roh == "on"
elif roh:
ergebnis[feld["key"]] = roh
return ergebnis