Files
WrestleDesk/docs/superpowers/specs/2026-03-22-homework-redesign-design.md
Andrej Spielmann 3fefc550fe Initial commit: WrestleDesk full project
- Django backend with DRF (clubs, wrestlers, trainers, exercises, templates, trainings, homework, locations, leistungstest)
- Next.js 16 frontend with React, Shadcn UI, Tailwind
- JWT authentication
- Full CRUD for all entities
- Calendar view for trainings
- Homework management system
- Leistungstest tracking
2026-03-26 13:24:57 +01:00

304 lines
15 KiB
Markdown

# 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