Feature: Züchter-Profil Komplett-Redesign — Hero, Hunde+Tests, Würfe, Gesundheitsstatistik (SW by-v900)
This commit is contained in:
parent
d5a3a1bb05
commit
b17706e7ba
6 changed files with 362 additions and 143 deletions
|
|
@ -301,7 +301,7 @@ async def admin_reject_breeder(user_id: int, body: RejectBody, admin=Depends(req
|
|||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# GET /api/breeder/profil/{zwingername} — öffentliches Profil
|
||||
# GET /api/breeder/profil/{zwingername} — öffentliches Profil (angereichert)
|
||||
# ------------------------------------------------------------------
|
||||
@router.get("/breeder/profil/{zwingername}")
|
||||
async def breeder_public_profile(zwingername: str):
|
||||
|
|
@ -318,9 +318,84 @@ async def breeder_public_profile(zwingername: str):
|
|||
AND u.rolle IN ('breeder', 'admin')
|
||||
AND (u.breeder_status = 'approved' OR u.rolle = 'admin')
|
||||
""", (zwingername,)).fetchone()
|
||||
if not row:
|
||||
raise HTTPException(404, "Züchter nicht gefunden.")
|
||||
return dict(row)
|
||||
if not row:
|
||||
raise HTTPException(404, "Züchter nicht gefunden.")
|
||||
|
||||
breeder_id = row["id"]
|
||||
result = dict(row)
|
||||
|
||||
# Öffentliche Zuchthunde + ihre wichtigsten Gesundheitstests + Titel
|
||||
hunde_rows = conn.execute("""
|
||||
SELECT id, name, rufname, geschlecht, geburtsdatum, farbe, zuchtbuchnummer, foto_url
|
||||
FROM zucht_hunde
|
||||
WHERE breeder_id=? AND is_public=1 AND (sterbedatum IS NULL OR sterbedatum='')
|
||||
ORDER BY geschlecht, name
|
||||
""", (breeder_id,)).fetchall()
|
||||
|
||||
hunde = []
|
||||
for h in hunde_rows:
|
||||
hund = dict(h)
|
||||
# Gesundheitstests (nur öffentliche, nur HD/ED/Augen/Herz)
|
||||
tests = conn.execute("""
|
||||
SELECT test_typ, ergebnis, test_name, untersuch_am
|
||||
FROM dog_health_tests
|
||||
WHERE hund_id=? AND is_public=1
|
||||
AND test_typ IN ('HD','ED','augen','herz','OCD','patella','ZTP')
|
||||
ORDER BY test_typ, untersuch_am DESC
|
||||
""", (h["id"],)).fetchall()
|
||||
seen = set()
|
||||
hund["health_tests"] = []
|
||||
for t in tests:
|
||||
if t["test_typ"] not in seen:
|
||||
seen.add(t["test_typ"])
|
||||
hund["health_tests"].append(dict(t))
|
||||
# Gentests (nur öffentliche, Zusammenfassung)
|
||||
gentests = conn.execute("""
|
||||
SELECT COUNT(*) as total,
|
||||
SUM(CASE WHEN ergebnis_klasse='clear' THEN 1 ELSE 0 END) as clear_cnt
|
||||
FROM dog_genetic_tests WHERE hund_id=? AND is_public=1
|
||||
""", (h["id"],)).fetchone()
|
||||
hund["gentests_total"] = gentests["total"] or 0
|
||||
hund["gentests_clear"] = gentests["clear_cnt"] or 0
|
||||
# Auszeichnungen (nur Zucht/Champion)
|
||||
titles = conn.execute("""
|
||||
SELECT titel_name FROM dog_titles
|
||||
WHERE hund_id=? AND titel_typ IN ('champion','zucht','ausstellung')
|
||||
ORDER BY verliehen_am DESC LIMIT 3
|
||||
""", (h["id"],)).fetchall()
|
||||
hund["titel"] = [t["titel_name"] for t in titles]
|
||||
hunde.append(hund)
|
||||
|
||||
result["hunde"] = hunde
|
||||
|
||||
# Sichtbare Würfe
|
||||
wuerfe = conn.execute("""
|
||||
SELECT id, vater_name, mutter_name, geburt_datum, erwartetes_datum,
|
||||
status, welpen_gesamt, welpen_verfuegbar, preis_spanne, beschreibung
|
||||
FROM litters
|
||||
WHERE breeder_id=? AND sichtbar=1 AND status != 'abgeschlossen'
|
||||
ORDER BY COALESCE(geburt_datum, erwartetes_datum) DESC
|
||||
""", (breeder_id,)).fetchall()
|
||||
result["wuerfe"] = [dict(w) for w in wuerfe]
|
||||
|
||||
# Gesundheits-Statistik (aggregiert über alle öffentlichen Hunde)
|
||||
hd_stats = conn.execute("""
|
||||
SELECT ergebnis, COUNT(*) as cnt FROM dog_health_tests
|
||||
WHERE hund_id IN (SELECT id FROM zucht_hunde WHERE breeder_id=? AND is_public=1)
|
||||
AND test_typ='HD' AND is_public=1
|
||||
GROUP BY ergebnis
|
||||
""", (breeder_id,)).fetchall()
|
||||
result["hd_stats"] = [dict(r) for r in hd_stats]
|
||||
|
||||
ed_stats = conn.execute("""
|
||||
SELECT ergebnis, COUNT(*) as cnt FROM dog_health_tests
|
||||
WHERE hund_id IN (SELECT id FROM zucht_hunde WHERE breeder_id=? AND is_public=1)
|
||||
AND test_typ='ED' AND is_public=1
|
||||
GROUP BY ergebnis
|
||||
""", (breeder_id,)).fetchall()
|
||||
result["ed_stats"] = [dict(r) for r in ed_stats]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue