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
49 lines
2.5 KiB
Python
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
|