feat: Notruf — Telefon in SMS, Geo-Diagnose + Geräteerkennung; Sprach-UI-Fix

Notruf (Punkte 1+2):
- SMS enthält jetzt die Telefonnummer(n) der Person (Mobil/Festnetz).
- Geo-Diagnose (P1): captureGeo liefert bei Fehlschlag einen Grund
  (Permission/insecure/Timeout/Code) statt still null; geht als geo_error an
  /api/emergency, landet in E-Mail ("Standort nicht verfügbar (<Grund>)") und
  im Server-Log (logger.info) — Fehlversuche sind jetzt erklärbar.
- Geräteerkennung (P2): device {mobile, platform} via User-Agent Client Hints
  (Fallback UA-String); E-Mail zeigt "Auslösegerät: Mobilgerät/Festgerät (…)".
- schemas: DeviceInfo + EmergencyRequest.geo_error/device; chat reicht durch.
- Tests: Telefon in SMS, geo_error + Geräte-Zeile in E-Mail (240 grün).

Sprach-Bug (Punkt 3): allowed_languages wurde im Menü nur via <option hidden>
gefiltert, was manche Browser bei <select> ignorieren -> Sprachen blieben
wählbar. Jetzt zusätzlich opt.disabled (robust, nicht wählbar); Backend klemmt
ohnehin serverseitig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-25 17:24:36 +02:00
commit 5d05e081d4
5 changed files with 104 additions and 34 deletions

View file

@ -106,3 +106,21 @@ def test_record_manual_emergency_uses_profile(monkeypatch):
assert "Frieda Schlüter" in captured["subject"]
assert "Diabetes" in captured["body"]
assert MAPS in captured["body"]
def test_sms_includes_phone():
p = em._profile(FakeUser(FULL_PREFS))
sms = em._emergency_texts(p, GEO)["sms"]
assert "Tel: +4915100000000" in sms
def test_email_geo_error_shown():
p = em._profile(FakeUser(FULL_PREFS))
body = em._email_body(p, None, "code 2: POSITION_UNAVAILABLE", None)
assert "nicht verfügbar" in body and "code 2" in body
def test_email_device_line_mobile_and_desktop():
p = em._profile(FakeUser(FULL_PREFS))
assert "Festgerät" in em._email_body(p, GEO, None, {"mobile": False, "platform": "Linux"})
assert "Mobilgerät" in em._email_body(p, GEO, None, {"mobile": True, "platform": "Android"})