feat: Notruf mit Kontaktdaten + Geoposition anreichern (Backend, Phase 1+3)

Notruf-Meldungen tragen jetzt das Notfall-Profil der auslösenden Person und —
falls vom Gerät mitgeschickt — die Geoposition. Kanal-Rollen:
- E-Mail: Voll-Dossier (Name, Adresse, Telefone, Geburtsdatum, med. Hinweise,
  Koordinaten + Karten-Link + Genauigkeit + Zeit; sonst "nicht verfügbar")
- SMS: kompakt, Name + Adresse + Karten-Link
- Anruf (TTS): Name + Wohnadresse gesprochen, KEINE URL/Koordinaten, Verweis
  auf SMS/E-Mail

- schemas: GeoFix + EmergencyRequest.geo; AdminUserPrefsUpdate um Profilfelder
  erweitert (full_name, Adresse, Telefone, birth_date, medical_notes,
  emergency_contacts/_phones, location_consent) — in user.prefs (keine Migration)
- api/chat: geo an record_manual_emergency durchgereicht
- api/admin: list_users gibt Profilfelder mit zurück (für die spätere Admin-UI)
- emergency.py: _profile/_geo_fields/_maps_link/_location_block/_email_body,
  kanal-spezifische _emergency_texts; record_manual_emergency(..., geo=...)
- Tests: 9 neue (Profil-Injektion, SMS/Call/E-Mail-Texte, Geo→Map-Link,
  ohne-Geo-Fallback, Payload). Suite 237 grün.

Frontend (Phase 2: Browser-Geolocation beim 🆘 + Admin-Profil-UI) steht noch aus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-25 15:33:58 +02:00
commit 5ed4a386bb
5 changed files with 265 additions and 30 deletions

View file

@ -174,6 +174,12 @@ async def list_users():
"external_id": u.external_id,
"created_at": u.created_at,
"allowed_languages": (u.prefs or {}).get("allowed_languages", ""),
**{k: (u.prefs or {}).get(k, "") for k in (
"full_name", "street", "postal_code", "city",
"phone_landline", "phone_mobile", "birth_date", "medical_notes",
"emergency_contacts", "emergency_phones",
)},
"location_consent": bool((u.prefs or {}).get("location_consent", False)),
"is_admin": is_admin_user(u),
}
for u in get_store().list_users()