Files
adminandClaude Opus 5.5 6e79baedf6 Einstieg Schritt 7: Einladung zur Personalisierung ohne Seitenwechsel
Geräteseite: Formular immer da; fehlt "Personalisierung möglich", kommt
das Gerät beim Senden in die Gruppe "Personalisierte Geräte" (eine je
Organisation, bei Bedarf angelegt, Merkmal aktiv). Gruppen- und
Standortseite: mit aktivem Merkmal eine Liste der Geräte mit E-Mail-Feld,
nach dem Senden zurück auf dieselbe Seite. Gefunden im Erstkontakt-Probelauf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:58:51 +01:00

81 lines
3.3 KiB
Python

"""
Einladungen zur Personalisierung dort, wo der Kunde gerade ist (Einstieg
vereinfachen, Schritt 7, 25.10.2026): auf der Geräteseite ohne vorher das
Merkmal setzen zu müssen, und auf der Seite einer Gruppe bzw. eines
Standorts/Zwecks mit aktivem Merkmal für alle ihre Geräte.
"""
from anode_client import anode_request
PERSONALISIERUNG_MERKMAL = "personalisierung"
# Eine gemeinsame Gruppe je Organisation statt einer Ein-Geräte-Gruppe pro
# Gerät; Gruppen können ein Merkmal nur einschalten, nie abschalten.
PERSONALISIERT_GRUPPE = "Personalisierte Geräte"
PERSONALISIERUNG_STATUS = {
"eingeladen": "Einladung verschickt, noch nicht eingelöst",
"code_offen": "Code erzeugt, noch nicht eingelöst",
"eingereicht": "eingelöst, wartet auf Bestätigung per Mail",
"bestaetigt": "Konto gewählt, wird beim nächsten Start eingerichtet",
"angelegt": "eingerichtet",
"zurueckgezogen": "zurückgezogen",
"verfallen": "verfallen",
"fehlgeschlagen": "am Gerät fehlgeschlagen",
"beendet": "beendet",
}
def personalisierung_moeglich(katalog: list[dict]) -> bool:
return any(e.get("merkmal") == PERSONALISIERUNG_MERKMAL and e.get("state") == "present" for e in katalog)
def personalisierung_einschalten(organization_id: str, device_id: str) -> str | None:
"""Gerät in die Gruppe "Personalisierte Geräte" (bei Bedarf angelegt, Merkmal
aktiv). Rückgabe: Fehlermeldung oder None."""
gruppen = anode_request("GET", f"/api/v1/organizations/{organization_id}/gruppen")
gruppe = next(
(g for g in gruppen.get("gruppen", []) if g["name"] == PERSONALISIERT_GRUPPE),
None,
) if gruppen.get("success") else None
if gruppe is None:
result = anode_request(
"POST", f"/api/v1/organizations/{organization_id}/gruppen", json={"name": PERSONALISIERT_GRUPPE}
)
if not result.get("success"):
return result.get("message") or "Die Gruppe „Personalisierte Geräte“ ließ sich nicht anlegen."
gruppe = result["gruppe"]
result = anode_request(
"POST", f"/api/v1/gruppen/{gruppe['id']}/merkmale/{PERSONALISIERUNG_MERKMAL}/select", json={"optionen": {}}
)
if not result.get("success"):
return result.get("message") or "„Personalisierung möglich“ ließ sich nicht setzen."
result = anode_request("POST", f"/api/v1/devices/{device_id}/gruppen/{gruppe['id']}")
if not result.get("success"):
return result.get("message") or "Das Gerät ließ sich der Gruppe nicht zuordnen."
return None
def email_domaenen(organization_id: str) -> list[str]:
result = anode_request("GET", f"/api/v1/organizations/{organization_id}")
return result["organization"].get("email_domaenen", []) if result.get("success") else []
def einladungs_zeilen(devices: list[dict]) -> list[dict]:
"""Je Gerät der Stand der Personalisierung für die Liste auf Gruppen- und
Standortseiten."""
zeilen = []
for device in devices:
result = anode_request("GET", f"/api/v1/devices/{device['id']}/personalisierung")
pers = result.get("personalisierungen", []) if result.get("success") else []
zeilen.append({
"device": device,
"konten": [p for p in pers if p["status"] == "angelegt"],
"laufend": next((p for p in pers if p["status"] in ("eingeladen", "bestaetigt")), None),
})
return zeilen