3fefc550fe
- 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
304 lines
15 KiB
Markdown
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
|