Cleanup: training_exercises.js_exercise_id — ID-Mismatch bereinigt, JOIN mit exercise_progress, Fuß-Umbenennung — SW by-v508, APP_VER 485

This commit is contained in:
rene 2026-04-29 19:00:53 +02:00
parent 9e9b87af35
commit ad3b73d687
5 changed files with 75 additions and 31 deletions

View file

@ -159,36 +159,58 @@ async def get_welcome_dashboard(dog_id: int, user=Depends(get_current_user)):
"SELECT COUNT(*) AS n FROM diary WHERE dog_id=?", (dog_id,)
).fetchone()["n"]
# Tagesübung — aus exercise_progress im JS-Format (tab_Name), tagesstabil
# Tagesübung — JOIN mit training_exercises via js_exercise_id, tagesstabil
import datetime as _dt
day_num = (_dt.date.today() - _dt.date(2024, 1, 1)).days
# Nur exercise_ids im JS-Format (starten mit bekanntem Tab-Namen)
_KNOWN_PREFIXES = (
'grundkommandos_', 'tricks_', 'problemverhalten_',
'mentale-auslastung_', 'hundesport_', 'koerperpflege_', 'welpe-basics_',
'grundlagen_',
)
raw_progress = conn.execute(
"""SELECT exercise_id FROM exercise_progress
WHERE user_id = ? AND status IN ('noch-nicht', 'manchmal', 'meistens')
ORDER BY updated_at ASC LIMIT 50""",
(user["id"],)
).fetchall()
valid = [r["exercise_id"] for r in raw_progress
if any(r["exercise_id"].startswith(p) for p in _KNOWN_PREFIXES)]
# Versuche JOIN (funktioniert wenn js_exercise_id-Spalte vorhanden)
try:
joined = conn.execute(
"""SELECT ep.exercise_id, te.name, te.kategorie AS kategorie_raw,
te.schwierigkeit, te.js_exercise_id
FROM exercise_progress ep
JOIN training_exercises te ON te.js_exercise_id = ep.exercise_id
WHERE ep.user_id = ? AND ep.status IN ('noch-nicht', 'manchmal', 'meistens')
ORDER BY ep.updated_at ASC LIMIT 50""",
(user["id"],)
).fetchall()
except Exception:
joined = []
daily_exercise = None
if valid:
ex_id = valid[day_num % len(valid)]
# Tab + Name aus exercise_id ableiten
for prefix in _KNOWN_PREFIXES:
if ex_id.startswith(prefix):
tab = prefix.rstrip('_')
name = ex_id[len(prefix):].replace('_', ' ')
daily_exercise = {"exercise_id": ex_id, "name": name, "kategorie": tab}
break
if joined:
row = joined[day_num % len(joined)]
# Tab-ID aus exercise_id ableiten (alles vor erstem '_' + '_')
ex_id = row["exercise_id"]
tab = ex_id.split('_')[0] if '_' in ex_id else ex_id
daily_exercise = {
"exercise_id": ex_id,
"name": row["name"],
"kategorie": tab,
"schwierigkeit": row["schwierigkeit"],
}
else:
# Fallback: exercise_progress ohne JOIN (Legacy-IDs ohne Matching in DB)
_KNOWN_PREFIXES = (
'grundkommandos_', 'tricks_', 'problemverhalten_',
'mentale-auslastung_', 'hundesport_', 'koerperpflege_', 'welpe-basics_',
)
raw = conn.execute(
"""SELECT exercise_id FROM exercise_progress
WHERE user_id = ? AND status IN ('noch-nicht', 'manchmal', 'meistens')
ORDER BY updated_at ASC LIMIT 50""",
(user["id"],)
).fetchall()
valid = [r["exercise_id"] for r in raw
if any(r["exercise_id"].startswith(p) for p in _KNOWN_PREFIXES)]
if valid:
ex_id = valid[day_num % len(valid)]
for prefix in _KNOWN_PREFIXES:
if ex_id.startswith(prefix):
tab = prefix.rstrip('_')
name = ex_id[len(prefix):].replace('_', ' ')
daily_exercise = {"exercise_id": ex_id, "name": name, "kategorie": tab}
break
return {
"random_photo": random_photo,

View file

@ -29,7 +29,7 @@ async def get_exercises():
}
with db() as conn:
rows = conn.execute("""
SELECT exercise_id, name, kategorie, schwierigkeit, alter_ab,
SELECT exercise_id, js_exercise_id, name, kategorie, schwierigkeit, alter_ab,
dauer, beschreibung, schritte, tipp
FROM training_exercises ORDER BY kategorie, name
""").fetchall()
@ -37,9 +37,10 @@ async def get_exercises():
for r in rows:
tab = CAT_TO_TAB.get(r['kategorie'], r['kategorie'].lower().replace(' ', '-'))
by_tab.setdefault(tab, []).append({
'exercise_id': r['exercise_id'],
'name': r['name'],
'kategorie': tab,
'exercise_id': r['exercise_id'],
'js_exercise_id': r['js_exercise_id'],
'name': r['name'],
'kategorie': tab,
'schwierigkeit': r['schwierigkeit'] or 'mittel',
'alter': r['alter_ab'],
'dauer': r['dauer'],