# Gelieferte Features & technische Basis (April 2026) **Stand:** 2026-04-30 **Referenz:** `backend/version.py` — **APP_VERSION 0.8.7**, **DB_SCHEMA_VERSION 20260430034** Dieses Dokument bündelt die in der Entwicklungsphase erreichten **lieferbaren** Funktionen und die zugehörigen **technischen Artefakte**. **Progressionsgraph zwischen Übungen** (Zwischenstand, Grenzen): **`technical/TRAINING_FRAMEWORK_SPEC.md`** §3–§4. Detail-Spezifikationen bleiben in den verlinkten Pfaden unter `.claude/docs/technical/` und `.claude/docs/functional/`. --- ## 1. Datenbank-Migrationen (Auswahl) | Migration | Inhalt | |-----------|--------| | **032–034** | **Progressionsgraph Übung→Übung:** Container `exercise_progression_graphs`, Kanten `exercise_progression_edges`; **`notes`** (033); optionale Varianten-Endpunkte + Constraints (034) | | **028** | `exercise_media` erweitert (Embed/Metadaten), `exercise_skills` Level-Felder (VARCHAR); Medien-API | | **029** | Kanonische Fähigkeitsstufen (basis–optimierung), `model_levels`-Namen | | **030** | `training_unit_exercises.exercise_variant_id` → FK `exercise_variants(id)` ON DELETE SET NULL | --- ## 2. Backend – Progressionsgraphen (`routers/exercise_progression_graphs.py`) - REST unter **`/api/exercise-progression-graphs`** inkl. Kanten-CRUD, **`POST …/edges/sequence`** (Reihe auf einmal), **`POST …/edges/delete-batch`**. - AuthZ wie Trainingsvorlagen: Admin/Superadmin oder Graph‑Ersteller; Anlegen mit Trainings-/Planungsrolle (`_has_planning_role`). - Listenresponses mit Übungstiteln und Variantennamen (JOIN). --- ## 3. Backend – Übungen (`routers/exercises.py`) ### 3.1 Liste & Suche - `GET /api/exercises` mit Filtern u. a.: Fokus, Stilrichtung, Trainingsstil, Zielgruppe, Fähigkeiten, **Skill-Stufe min/max**, `visibility_any`, `status_any`, `search`, **`ai_search`** (Platzhalter, derzeit gleiche Volltextlogik wie `search`). - Optional: **`include_variants=true`** — liefert pro Übung ein kompaktes **`variants`**-JSON (id, variant_name, sequence_order) für Planung/UI. ### 3.2 Übungsvarianten (CRUD) Implementiert gemäß **`EXERCISES_API_SPEC.md`** (Varianten-Abschnitt): - `POST /api/exercises/{id}/variants` - `PUT /api/exercises/{id}/variants/{variant_id}` - `DELETE /api/exercises/{id}/variants/{variant_id}` (409, wenn andere Varianten diese als Voraussetzung nutzen) - `PUT /api/exercises/{id}/variants/reorder` — `sequence_order` 1…n Sortierung der Varianten im Detail: **`sequence_order`**, dann **`progression_level`**, dann **`id`**. ### 3.3 Medien-Upload – Größenlimits - Standard: **50 MB** pro Datei (`EXERCISE_MEDIA_MAX_UPLOAD_MB`, Default 50). - **`admin`** / **`superadmin`**: **1024 MB** Default (`EXERCISE_MEDIA_ADMIN_MAX_UPLOAD_MB`), nie unter dem Nutzer-Limit (in MB verglichen). Logik: `_upload_limit_bytes(session)` vor `read()`-Prüfung. --- ## 4. Backend – Trainingsplanung (`routers/training_planning.py`) - `training_unit_exercises`: Schreiben/Lesen von **`exercise_variant_id`**. - Validierung: Variante muss zur gewählten **`exercise_id`** gehören. - JOIN liefert u. a. **`exercise_variant_name`** beim Lesen einer Einheit. --- ## 5. Frontend – Übungsliste (`ExercisesListPage.jsx`) - Tabs **Liste** · **Progressionsgraphen** (`ExerciseProgressionGraphPanel`): Graphen anlegen/bearbeiten, Kanten inkl. Sequenz-Bulk und Tabellenansicht. - **Filter-Modal** (Fokus, Stilrichtung, Trainingsstil, Zielgruppe, Fähigkeit + Stufen von/bis, Sichtbarkeit, Status). - **Filter-Chips** unter der Suchleiste; Klick entfernt einen Filter; Badge am Filter-Button = Anzahl Chips. - **Kein Vollbild-Spinner** bei jeder Suche: nur noch **`listFetching`** — Suchfelder bleiben im DOM (**Fokus/Cursor** bleiben erhalten); Liste zeigt optional „Aktualisiere Treffer…“. - **``** mit Titeln der aktuellen Treffer; **`autoComplete="on"`** für Browser-Vorschläge. - **`api.listExercises`**: Booleans (z. B. `include_variants`) werden als Query übergeben. --- ## 6. Frontend – Übung bearbeiten (`ExerciseFormPage.jsx`) - **Varianten-Editor**: eingeklappter Bereich (`
`), **eine Variante zur Zeit** über Dropdown oder „Neue Variante“; Felder über **`ExerciseVariantFields`**; Reihenfolge Nach oben/unten; Speichern/Löschen pro Variante. - **Medien** wie zuvor (Formularteil). - Block **Progressionsgraph** (Edit): Kanten mit Bezug zur aktuellen Übung. Hinweis: Es gibt **keine** separaten Routen `/exercises/:id/variants/...` — Bearbeitung erfolgt unter **`/exercises/:id/edit`** (Routing-Doku ggf. anpassen). --- ## 7. Frontend – Übung Detail (`ExerciseDetailPage.jsx`) - Varianten-Abschnitt mit **Meta** (Dauer, Schwierigkeit, Material, Progressionsstufe) wo vorhanden. --- ## 8. Frontend – Trainingsplanung (`TrainingPlanningPage.jsx`) - `listExercises({ include_variants: true })`. - Pro Zeile: Übung + **Variante** (optional), Dauer, Reihenfolge. --- ## 9. Rich-Text (`RichTextEditor.jsx` + CSS) - **Selection Save/Restore** vor Toolbar-Klicks (`insertUnorderedList` / `insertOrderedList` zuverlässiger bei Mehrzeilen-Markierung). - **`styleWithCSS` false** vor Formatbefehlen. - **Listen-Styling** für `.rich-text-editor ul/ol/li` (Einzüge sichtbar). --- ## 10. Admin – Matrix / Reifegrad (Kontext) - Bereits dokumentiert in **`CHANGELOG`** / Module **`maturity_models`**: Matrix-Stack-Bundle Export/Import, Kontext-Bindings — siehe `version.py` und Admin-UI-Pfade. --- ## 11. Nächste sinnvolle Schritte (nicht Lieferstand) - Trainingsplanungs-/Rahmenmodul (**CURR‑002 (2)**) — Progressionsgraph ist unterstützend, siehe **`TRAINING_FRAMEWORK_SPEC.md`** §4. - Progressions-Serien als **Blöcke** (angekündigt; Voraussetzung: `prerequisite_variant_id` / `progression_level` vorhanden). - Serverseitige **Suchvorschläge** (Autocomplete-Endpoint), falls datalist nicht reicht. - Optional: Streaming/chunked Upload für sehr große Videos (RAM-Thema). --- ## 12. Verweise | Thema | Dokument | |--------|----------| | Rahmenprogramm / Progressionsgraph | `technical/TRAINING_FRAMEWORK_SPEC.md` | | API Übungen | `technical/EXERCISES_API_SPEC.md` | | Domänenmodell | `functional/DOMAIN_MODEL.md` | | Datenbank Überblick | `technical/DATABASE_SCHEMA.md` | | Upload formal | `technical/MEDIA_UPLOAD_SPEC.md` | | Projektstatus-Kachel | `../PROJECT_STATUS.md` |