Feature: Hunde-Persönlichkeitstest + Kilometer-Lebenswerk-Badge (SW by-v698)

- personality.js: 10-Fragen-Quiz mit 4 Typen (Abenteurer/Entdecker/Kuschler/Denker), Ergebnis-Speicherung in localStorage, Share-Funktion
- achievements.py: neue Badge-Kategorie km_lebenswerk (Bronze 100 km bis Platin 5000 km)
- settings.js: Lifetime-km-Balken mit Meilenstein-Markierungen bei 100/500/1000/5000 km
- app.js + index.html: personality-Seite registriert
This commit is contained in:
rene 2026-05-04 20:52:51 +02:00
parent a4e97348ed
commit 0fdc32eaf4
5 changed files with 601 additions and 27 deletions

View file

@ -131,6 +131,20 @@ CATEGORIES = [
("platin", 30, "Schneewolf"),
],
},
{
"id": "km_lebenswerk",
"name": "Kilometer-Lebenswerk",
"emoji": "🐾",
"metrik": "gesamt_km_lebenswerk",
"einheit": " km",
"icon": "path",
"stufen": [
("bronze", 100, "100-km-Club"),
("silber", 500, "500-km-Wanderer"),
("gold", 1000, "Tausend-km-Held"),
("platin", 5000, "Ultraläufer"),
],
},
]
# Flat-Liste aller Badge-IDs für DB-Kompatibilität
@ -222,14 +236,15 @@ def check_and_award(user_id: int, conn):
""", (user_id,)).fetchone()
metrics = {
"total_km": stats["total_km"] if stats else 0,
"routen": stats["routen"] if stats else 0,
"pois": stats["pois"] if stats else 0,
"streak": (streak_row["current_streak"] if streak_row else 0),
"wiki_fotos": stats["wiki_fotos"] if stats else 0,
"wetter_tapfer_score": wetter_row["cnt"] if wetter_row else 0,
"jahreszeiten_score": (jahreszeiten_row["jahreszeiten_score"] if jahreszeiten_row else 0),
"schnee_eintraege": schnee_row["cnt"] if schnee_row else 0,
"total_km": stats["total_km"] if stats else 0,
"routen": stats["routen"] if stats else 0,
"pois": stats["pois"] if stats else 0,
"streak": (streak_row["current_streak"] if streak_row else 0),
"wiki_fotos": stats["wiki_fotos"] if stats else 0,
"wetter_tapfer_score": wetter_row["cnt"] if wetter_row else 0,
"jahreszeiten_score": (jahreszeiten_row["jahreszeiten_score"] if jahreszeiten_row else 0),
"schnee_eintraege": schnee_row["cnt"] if schnee_row else 0,
"gesamt_km_lebenswerk": stats["total_km"] if stats else 0,
}
earned = {r["badge_id"] for r in
@ -336,14 +351,15 @@ async def my_achievements(user=Depends(get_current_user)):
""", (stats["punkte"] if stats else 0,)).fetchone()
metrics = {
"total_km": stats["total_km"] if stats else 0,
"routen": stats["routen"] if stats else 0,
"pois": stats["pois"] if stats else 0,
"streak": (streak_row["current_streak"] if streak_row else 0),
"wiki_fotos": stats["wiki_fotos"] if stats else 0,
"wetter_tapfer_score": wetter_row["cnt"] if wetter_row else 0,
"jahreszeiten_score": (jahreszeiten_row["jahreszeiten_score"] if jahreszeiten_row else 0),
"schnee_eintraege": schnee_row["cnt"] if schnee_row else 0,
"total_km": stats["total_km"] if stats else 0,
"routen": stats["routen"] if stats else 0,
"pois": stats["pois"] if stats else 0,
"streak": (streak_row["current_streak"] if streak_row else 0),
"wiki_fotos": stats["wiki_fotos"] if stats else 0,
"wetter_tapfer_score": wetter_row["cnt"] if wetter_row else 0,
"jahreszeiten_score": (jahreszeiten_row["jahreszeiten_score"] if jahreszeiten_row else 0),
"schnee_eintraege": schnee_row["cnt"] if schnee_row else 0,
"gesamt_km_lebenswerk": stats["total_km"] if stats else 0,
}
# Kategorien mit aktuellem Tier + Fortschritt aufbauen