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>
81 lines
3.3 KiB
Python
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
|