Backend Sprint 2+3: Health-Modul, Multi-Dog Tagebuch, Pillow, Migrations

- database.py: diary_dogs + walk_participant_dogs Tabellen, idempotente
  Migration für Health-Felder (charge_nr, kosten, diagnose, …), Backfill
- routes/health.py: vollständiges Health-Modul (war Stub), CRUD für
  Impfung/Entwurmung/Tierarzt/Medikament/Gewicht/Allergie/Dokument
- routes/diary.py: Multi-Dog n:m via diary_dogs (dog_ids in allen Endpoints)
- routes/dogs.py: Foto-Upload konvertiert HEIC/PNG/WebP → JPEG via Pillow
- routes/poison.py: Resolve mit Grundauswahl + Soft-Delete (geloest_von/at/grund)
- ki.py: health_summary() für KI-Gesundheitsbericht
- main.py: /favicon.ico Route
- requirements.txt: Pillow 11.2.1 + pillow-heif 0.22.0
This commit is contained in:
rene 2026-04-13 19:29:51 +02:00
parent 96e7a97b52
commit 6f48ec581d
8 changed files with 570 additions and 52 deletions

View file

@ -289,6 +289,71 @@ Bewerte als JSON:
return {"plausibel": True, "typ": "unbekannt", "hinweis": description}
async def health_summary(health_data: list, dog_info: dict,
user_is_premium: bool = False) -> str:
"""
Tierärztliche Zusammenfassung aller Gesundheitsdaten lokal für alle.
Fasst Impfungen, Besuche, Medikamente etc. in einem lesbaren Bericht zusammen.
"""
system = (
"Du bist ein erfahrener Veterinär-Assistent. "
"Erstelle präzise, strukturierte Gesundheitsberichte für Hunde auf Deutsch. "
"Weise auf fällige Impfungen und wichtige Termine hin."
)
# Daten nach Typ gruppieren für den Prompt
def _fmt(entries, typ):
subset = [e for e in entries if e.get("typ") == typ]
if not subset:
return " (keine Einträge)"
lines = []
for e in subset[:10]: # maximal 10 pro Typ
line = f" - {e.get('datum', '?')}: {e.get('bezeichnung', '?')}"
if e.get("naechstes"):
line += f" (nächste Fälligkeit: {e['naechstes']})"
if e.get("notiz"):
line += f"{e['notiz']}"
lines.append(line)
return "\n".join(lines)
heute = __import__("datetime").date.today().isoformat()
prompt = f"""
Hund: {dog_info.get('name')}, {dog_info.get('rasse', 'unbekannt')},
Geburtstag: {dog_info.get('geburtstag', 'unbekannt')}, Gewicht: {dog_info.get('gewicht_kg', '?')} kg
Heutiges Datum: {heute}
=== IMPFUNGEN ===
{_fmt(health_data, 'impfung')}
=== ENTWURMUNG ===
{_fmt(health_data, 'entwurmung')}
=== TIERARZTBESUCHE ===
{_fmt(health_data, 'tierarzt')}
=== MEDIKAMENTE ===
{_fmt(health_data, 'medikament')}
=== ALLERGIEN ===
{_fmt(health_data, 'allergie')}
Erstelle einen strukturierten Gesundheitsbericht mit:
1. Aktueller Status (2-3 Sätze)
2. Fällige / überfällige Impfungen und Termine
3. Wichtige Hinweise für den nächsten Tierarztbesuch
4. Allgemeine Empfehlungen
Schreibe klar und verständlich für den Hundebesitzer.
"""
return await complete(
prompt, system,
max_tokens=700,
requires_premium=False, # Kostenlos für alle
user_is_premium=user_is_premium,
)
# ------------------------------------------------------------------
# Status-Endpoint (für Admin/Debug)
# ------------------------------------------------------------------