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>
80 lines
3.1 KiB
Python
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)
|