Feature: Alle 104 Übungen aus DB in Übungsseite — 9 Tabs, DB-basiert, abwärtskompatibel — SW by-v493, APP_VER 470

This commit is contained in:
rene 2026-04-29 11:44:47 +02:00
parent 175984e80f
commit 6d9f4a097e
5 changed files with 109 additions and 24 deletions

View file

@ -164,7 +164,11 @@ async def get_welcome_dashboard(dog_id: int, user=Depends(get_current_user)):
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_', 'grundlagen_')
_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')

View file

@ -10,6 +10,45 @@ from auth import get_current_user
router = APIRouter()
# ------------------------------------------------------------------
# Alle Übungen aus DB (öffentlich, kein Auth)
# ------------------------------------------------------------------
@router.get("/exercises")
async def get_exercises():
"""Alle Übungen aus der DB, gruppiert nach Tab-ID."""
import json as _json
CAT_TO_TAB = {
'Grundkommando': 'grundkommandos',
'Trick': 'tricks',
'Problemverhalten': 'problemverhalten',
'Mentale Auslastung': 'mentale-auslastung',
'Hundesport': 'hundesport',
'Koerperpflege': 'koerperpflege',
'Körperpflege': 'koerperpflege',
'Welpe Basics': 'welpe-basics',
}
with db() as conn:
rows = conn.execute("""
SELECT exercise_id, name, kategorie, schwierigkeit, alter_ab,
dauer, beschreibung, schritte, tipp
FROM training_exercises ORDER BY kategorie, name
""").fetchall()
by_tab = {}
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,
'schwierigkeit': r['schwierigkeit'] or 'mittel',
'alter': r['alter_ab'],
'dauer': r['dauer'],
'beschreibung': r['beschreibung'],
'schritte': _json.loads(r['schritte'] or '[]'),
'tipp': r['tipp'],
})
return by_tab
# ------------------------------------------------------------------
# Übungs-Status
# ------------------------------------------------------------------