feat(notruf): Alarmpause pro Nutzer im Notfall-Profil (Minuten, 0=aus, leer=global)
Bisher war die Wiederauslöse-Sperre nur global einstellbar. Jetzt zusätzlich pro Nutzer im Notfall-Profil (Admin), hinter „Standort im Notfall mitsenden": „Pause bis zum erneuten Alarm: [n] Minuten" (leer = globaler Standard, 0 = aus). - Auflösung serverseitig: Nutzer-Pref > globale Einstellung > 5 (_resolve_cooldown_minutes in emergency.py; emergency_cooldown_status nutzt sie, die Notruf-UI/der Status-Endpunkt liefern dadurch automatisch den per-User-Wert). - Schema AdminUserPrefsUpdate.emergency_cooldown_minutes (String) mit Validator (leer/0–60, sonst 422). /api/admin/users gibt das Feld jetzt mit aus (sonst lädt das Formular leer). - Frontend: Zahlenfeld + Hinweis im Notfall-Profil, über PROF_KEYS/PROF_VALIDATORS verdrahtet. Bump app.js v=51 -> v=52. - Doku: BEDIENUNGSANLEITUNG § Nutzer › Verwalten. Tests: per-User-Override/Erben/Aus + Schema-Validierung. 254 Offline-Tests grün. Live verifiziert: PUT prefs -> /status spiegelt 300->120s, 99 -> 422, Formular zeigt/lädt das Feld hinter der Standort-Checkbox. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f3dbd434b0
commit
904f7db82c
7 changed files with 97 additions and 8 deletions
|
|
@ -270,20 +270,34 @@ async def _post_webhook(url: str, payload: dict, cfg) -> bool:
|
|||
return False
|
||||
|
||||
|
||||
def _cooldown_seconds(cfg) -> int:
|
||||
def _resolve_cooldown_minutes(user, cfg) -> int:
|
||||
"""Alarmpause in Minuten. Präzedenz: Nutzer-Pref > globale Einstellung > 5.
|
||||
Leerer/fehlender Pref-Wert erbt die globale Einstellung; "0" bedeutet aus.
|
||||
"""
|
||||
raw = (getattr(user, "prefs", None) or {}).get("emergency_cooldown_minutes")
|
||||
if raw is not None and str(raw).strip() != "":
|
||||
try:
|
||||
return max(0, int(raw))
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
try:
|
||||
return max(0, int(getattr(cfg, "emergency_cooldown_minutes", 5)) * 60)
|
||||
return max(0, int(getattr(cfg, "emergency_cooldown_minutes", 5)))
|
||||
except (TypeError, ValueError):
|
||||
return 300
|
||||
return 5
|
||||
|
||||
|
||||
def _cooldown_seconds(user, cfg) -> int:
|
||||
return _resolve_cooldown_minutes(user, cfg) * 60
|
||||
|
||||
|
||||
def emergency_cooldown_status(user, store, cfg=settings) -> dict:
|
||||
"""Aktueller Sperr-Status: ist nach dem letzten manuellen Notruf noch
|
||||
eine Wiederauslöse-Sperre aktiv, wie lange ist er her, wie viel bleibt.
|
||||
|
||||
Schützt verwirrte/verängstigte Senioren vor Mehrfach-Alarmen.
|
||||
Schützt verwirrte/verängstigte Senioren vor Mehrfach-Alarmen. Die Pause ist
|
||||
pro Nutzer einstellbar (sonst greift die globale Einstellung).
|
||||
"""
|
||||
total = _cooldown_seconds(cfg)
|
||||
total = _cooldown_seconds(user, cfg)
|
||||
last = store.last_manual_emergency_at(user.id) if total > 0 else None
|
||||
base = {"active": False, "cooldown_seconds": total, "remaining_seconds": 0, "minutes_ago": 0}
|
||||
if not last:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue