Files
kundenplattform/unterrichtssteuerung.py
adminandClaude Opus 5.5 2d1b45e973 Einstieg Schritt 6: Unterrichtssteuerung (Veyon) am Standort/Zweck einschalten
Raum bleibt der Standort/Zweck (Schlüssel, Raumliste je OE). Auf der
Einstellungsseite des Standorts: Veyon einschalten (ohne Häkchen) und
Lehrergerät(e) ankreuzen; die kommen in die Gruppe "Lehrergeräte" (eine je
Organisation, Häkchen veyon_lehrer gesetzt), alle anderen dort sind
Schülergeräte. Ausschalten nimmt die Lehrergeräte aus der Gruppe. Hinweis
auf die alte Falle (Häkchen am Standort), Speichern behebt sie.
Geräteseite: "Als Lehrergerät festlegen" / "Kein Lehrergerät mehr".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:44:35 +01:00

80 lines
3.1 KiB
Python

"""
Unterrichtssteuerung (Veyon) ohne Gruppen-Handarbeit (Einstieg vereinfachen,
Schritt 6, 25.10.2026). Der Raum bleibt der Standort/Zweck: dort hängen
Schlüssel und Raumliste (provisioning-server, VEYON_MERKMAL). Die Rolle
Lehrergerät kommt aus einer gemeinsamen Gruppe "Lehrergeräte" je
Organisation mit gesetztem Häkchen veyon_lehrer; alle anderen Geräte am
Standort sind Schülergeräte.
"""
from anode_client import anode_request
VEYON_MERKMAL = "veyon"
LEHRER_GRUPPE = "Lehrergeräte"
def _gruppe_finden(organization_id: str) -> dict | None:
result = anode_request("GET", f"/api/v1/organizations/{organization_id}/gruppen")
gruppen = result.get("gruppen", []) if result.get("success") else []
return next((g for g in gruppen if g["name"] == LEHRER_GRUPPE), None)
def lehrer_gruppe(organization_id: str) -> tuple[dict | None, str | None]:
"""Gruppe "Lehrergeräte", bei Bedarf angelegt; das Häkchen wird jedes
Mal gesetzt, falls jemand es an der Gruppe zurückgenommen hat.
Rückgabe: (gruppe, fehlermeldung)."""
gruppe = _gruppe_finden(organization_id)
if gruppe is None:
result = anode_request(
"POST", f"/api/v1/organizations/{organization_id}/gruppen", json={"name": LEHRER_GRUPPE}
)
if not result.get("success"):
return None, result.get("message") or "Die Gruppe „Lehrergeräte“ ließ sich nicht anlegen."
gruppe = result["gruppe"]
result = anode_request(
"POST", f"/api/v1/gruppen/{gruppe['id']}/merkmale/{VEYON_MERKMAL}/select",
json={"optionen": {"veyon_lehrer": True}},
)
if not result.get("success"):
return None, result.get("message") or "Veyon ließ sich an der Gruppe „Lehrergeräte“ nicht setzen."
return gruppe, None
def lehrer_ids(organization_id: str, devices: list[dict]) -> set[str]:
"""Welche dieser Geräte in der Gruppe "Lehrergeräte" sind."""
gruppe = _gruppe_finden(organization_id)
if gruppe is None:
return set()
ids = set()
for device in devices:
result = anode_request("GET", f"/api/v1/devices/{device['id']}/gruppen")
if any(g["id"] == gruppe["id"] for g in result.get("gruppen", [])):
ids.add(device["id"])
return ids
def lehrergeraet_setzen(organization_id: str, device_id: str, lehrer: bool) -> str | None:
"""Gerät in die Gruppe "Lehrergeräte" aufnehmen oder herausnehmen.
Rückgabe: Fehlermeldung oder None."""
if lehrer:
gruppe, fehler = lehrer_gruppe(organization_id)
if fehler:
return fehler
result = anode_request("POST", f"/api/v1/devices/{device_id}/gruppen/{gruppe['id']}")
else:
gruppe = _gruppe_finden(organization_id)
if gruppe is None:
return None
result = anode_request("DELETE", f"/api/v1/devices/{device_id}/gruppen/{gruppe['id']}")
if not result.get("success"):
return result.get("message") or "Das Lehrergerät ließ sich nicht ändern."
return None
def veyon_eintrag(merkmale: list[dict]) -> dict | None:
return next((e for e in merkmale if e.get("merkmal") == VEYON_MERKMAL), None)