# Homework System Redesign - Spezifikation ## Überblick Komplette Neugestaltung des Homework-Systems ohne Vorlagen. Homework wird direkt von der Training-Seite aus Assignees zugewiesen. ## Konzept **Workflow:** 1. Trainer ist auf Training-Detail-Seite 2. Bei jedem Teilnehmer gibt es einen Homework-Button (Icon) 3. Klick öffnet Modal: Exercises auswählen (mit reps/time) 4. Homework wird dem Wrestler für dieses Training zugewiesen 5. Auf der Homework-Seite sieht man alle Zuweisungen gruppiert nach Training **Keine Templates** - Exercises werden direkt zugewiesen, keine wiederverwendbaren Vorlagen. --- ## Datenmodell ### Neues Model: `TrainingHomework` Verknüpft ein Training mit Exercises. | Feld | Typ | Beschreibung | |------|-----|--------------| | `id` | AutoField | Primary Key | | `training` | FK → Training | Das Training | | `created_at` | DateTime | Auto | ### Neues Model: `TrainingHomeworkAssignment` Welcher Wrestler welche Homework eines Trainings bekommen hat. | Feld | Typ | Beschreibung | |------|-----|--------------| | `id` | AutoField | Primary Key | | `training_homework` | FK → TrainingHomework | Die Homework | | `wrestler` | FK → Wrestler | Der Wrestler | | `club` | FK → Club | Club (für Filter) | | `notes` | TextField | Optionale Notizen | | `created_at` | DateTime | Auto | ### Junction Table: `TrainingHomeworkExercise` | Feld | Typ | Beschreibung | |------|-----|--------------| | `id` | AutoField | Primary Key | | `training_homework` | FK → TrainingHomework | Die Homework | | `exercise` | FK → Exercise | Die Übung | | `reps` | PositiveInteger | Wiederholungen | | `time_minutes` | PositiveInteger | Zeit in Minuten | | `order` | Integer | Sortierung | --- ## API Endpoints ### Backend ``` GET /homework/training-assignments/ - Alle Zuweisungen für Club (gefiltert) POST /homework/training-assignments/ - Neue Zuweisung erstellen GET /homework/training-assignments/{id}/ - Detail PATCH /homework/training-assignments/{id}/ - Aktualisieren (notizen, etc.) DELETE /homework/training-assignments/{id}/ - Löschen POST /homework/training-assignments/{id}/complete/ - Als erledigt markieren POST /homework/training-assignments/{id}/uncomplete/ - Als nicht erledigt markieren ``` ### Frontend Types ```typescript interface ITrainingHomework { id: number training: number training_date: string training_group: string exercises: ITrainingHomeworkExercise[] created_at: string } interface ITrainingHomeworkExercise { id: number exercise: number exercise_name: string exercise_category: string reps: number | null time_minutes: number | null order: number } interface ITrainingHomeworkAssignment { id: number training_homework: number training_homework_detail: ITrainingHomework wrestler: number wrestler_name: string wrestler_group: string is_completed: boolean completion_date: string | null notes: string created_at: string } ``` --- ## UI: Training Detail Seite ### Layout (oben nach unten) ``` ┌─────────────────────────────────────────────────────────────┐ │ [← Zurück] Training vom 22.03.2026 [Kinder Badge]│ ├─────────────────────────────────────────────────────────────┤ │ Datum: Montag, 22. März 2026 │ │ Zeit: 17:00 - 18:30 │ │ Ort: Sporthalle │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ TEILNEHMER (8) │ │ TRAININGSHOMEWORK │ │ │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ Hier kommen die │ │ │ │ │ 🧒 Max M. 📚 │ │ │ Homework-Übungen │ │ │ │ │ Club A │ │ │ für dieses Training │ │ │ │ └─────────────────┘ │ │ rein wenn jemand │ │ │ │ ┌─────────────────┐ │ │ Homework hat. │ │ │ │ │ 🧒 Anna S. 📚 │ │ │ │ │ │ │ │ Club B │ │ │ │ │ │ │ └─────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ [+ Ringer hinzu] │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### Teilnehmer-Karte - Liste der Teilnehmer mit Avatar - Bei jedem Teilnehmer rechts: - **Homework-Button** (Buch-Icon) → öffnet Modal - **X-Button** → entfernen - "Ringer hinzufügen" Button unter der Liste ### Homework-Button Modal ``` ┌─────────────────────────────────────────────────────────────┐ │ 📚 Hausaufgabe zuweisen - Max Mustermann │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Übungen auswählen: │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ [🔍] Übungen durchsuchen... ││ │ ├─────────────────────────────────────────────────────────┤│ │ │ ○ Liegestütze (Kraft) [10] Reps ││ │ │ ○ Sit-ups (Kraft) [30] Sek ││ │ │ ○ Ausfallschritte (Technik) [ ] Reps [60] Sek ││ │ └─────────────────────────────────────────────────────────┘│ │ │ │ Ausgewählte Übungen: │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 1. Liegestütze - 10 Wiederholungen [✕] ││ │ │ 2. Sit-ups - 30 Sekunden [✕] ││ │ └─────────────────────────────────────────────────────────┘│ │ │ │ Notizen (optional): │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ ││ │ └─────────────────────────────────────────────────────────┘│ │ │ ├─────────────────────────────────────────────────────────────┤ │ [Abbrechen] [Zuweisen] │ └─────────────────────────────────────────────────────────────┘ ``` --- ## UI: Hausaufgaben Seite ### Layout ``` ┌─────────────────────────────────────────────────────────────┐ │ 📚 Hausaufgaben │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Filter: [Alle] [Offen] [Erledigt] [🔍 Suche...] │ │ │ │ Training: 22.03.2026 (Kinder) │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ ┌─────────────────────────────────────────────────────┐ ││ │ │ │ 🧒 Max Mustermann [Erledigt ✓] │ ││ │ │ │ Liegestütze (10), Sit-ups (30s), ... │ ││ │ │ │ Zugewiesen: vor 2 Tagen │ ││ │ │ └─────────────────────────────────────────────────────┘ ││ │ │ ┌─────────────────────────────────────────────────────┐ ││ │ │ │ 🧒 Anna Schmidt [Offen] │ ││ │ │ │ Liegestütze (10), Sit-ups (30s), ... │ ││ │ │ │ Zugewiesen: vor 2 Tagen │ ││ │ │ └─────────────────────────────────────────────────────┘ ││ │ └─────────────────────────────────────────────────────────┘│ │ │ │ Training: 20.03.2026 (Jugend) │ │ ... │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### Assignment Card - Wrestler Name + Avatar - Status Badge: "Offen" (orange) oder "Erledigt" (grün) - Liste der Exercises mit reps/time - "Erledigt" Button zum Markieren - Click auf Card → expandiert Details --- ## UI: Dashboard Zeigt offene Homework-Anzahl: ``` ┌─────────────────────────────────────────────────────────────┐ │ 📊 Dashboard │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 🧒 24 │ │ 👨‍🏫 8 │ │ 📅 12 │ │ 📚 5 │ │ │ │ Ringer │ │ Trainer │ │ Training │ │ Offene │ │ │ │ │ │ │ │ diese Wo │ │ Homework│ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## Farben & Styling - Status "Offen": `bg-warning/10 text-warning` - Status "Erledigt": `bg-success/10 text-success` - Homework Icon: `BookOpen` von Lucide --- ## Technische Umsetzung ### Backend 1. **Neue Models** in `backend/homework/models.py`: - `TrainingHomework` - `TrainingHomeworkExercise` (Junction) - `TrainingHomeworkAssignment` 2. **Serializers** in `backend/homework/serializers.py`: - `TrainingHomeworkSerializer` - `TrainingHomeworkExerciseSerializer` - `TrainingHomeworkAssignmentSerializer` 3. **Views** in `backend/homework/views.py`: - `TrainingHomeworkAssignmentViewSet` mit `/training-assignments/` endpoint - `complete` und `uncomplete` actions 4. **URLs** in `backend/homework/urls.py`: - `training-assignments/` routes 5. **Admin** in `backend/homework/admin.py`: - Neue Models registrieren ### Frontend 1. **Types** in `frontend/src/lib/api.ts`: - `ITrainingHomework` - `ITrainingHomeworkExercise` - `ITrainingHomeworkAssignment` 2. **Training Detail Page** `frontend/src/app/(dashboard)/trainings/[id]/page.tsx`: - Layout: Details oben, dann 2-Spalten (Teilnehmer | TrainingHomework) - Teilnehmer-Karte mit Homework-Button - Modal für Homework-Zuweisung 3. **Homework Page** `frontend/src/app/(dashboard)/homework/page.tsx`: - Komplett neu schreiben - Gruppiert nach Training - Status-Filter - Erledigt/Undone togglen 4. **Dashboard** `frontend/src/app/(dashboard)/dashboard/page.tsx`: - Homework-Count hinzufügen --- ## Zu löschende alte Components - Alte `Homework`, `HomeworkExerciseItem`, `HomeworkAssignment`, `HomeworkAssignmentItem`, `HomeworkStatus` Models optional behalten (für Migration) aber nicht mehr nutzen - Alte Frontend-Homework-Logik entfernen