- 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
15 KiB
Homework System Redesign - Spezifikation
Überblick
Komplette Neugestaltung des Homework-Systems ohne Vorlagen. Homework wird direkt von der Training-Seite aus Assignees zugewiesen.
Konzept
Workflow:
- Trainer ist auf Training-Detail-Seite
- Bei jedem Teilnehmer gibt es einen Homework-Button (Icon)
- Klick öffnet Modal: Exercises auswählen (mit reps/time)
- Homework wird dem Wrestler für dieses Training zugewiesen
- 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
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:
BookOpenvon Lucide
Technische Umsetzung
Backend
-
Neue Models in
backend/homework/models.py:TrainingHomeworkTrainingHomeworkExercise(Junction)TrainingHomeworkAssignment
-
Serializers in
backend/homework/serializers.py:TrainingHomeworkSerializerTrainingHomeworkExerciseSerializerTrainingHomeworkAssignmentSerializer
-
Views in
backend/homework/views.py:TrainingHomeworkAssignmentViewSetmit/training-assignments/endpointcompleteunduncompleteactions
-
URLs in
backend/homework/urls.py:training-assignments/routes
-
Admin in
backend/homework/admin.py:- Neue Models registrieren
Frontend
-
Types in
frontend/src/lib/api.ts:ITrainingHomeworkITrainingHomeworkExerciseITrainingHomeworkAssignment
-
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
-
Homework Page
frontend/src/app/(dashboard)/homework/page.tsx:- Komplett neu schreiben
- Gruppiert nach Training
- Status-Filter
- Erledigt/Undone togglen
-
Dashboard
frontend/src/app/(dashboard)/dashboard/page.tsx:- Homework-Count hinzufügen
Zu löschende alte Components
- Alte
Homework,HomeworkExerciseItem,HomeworkAssignment,HomeworkAssignmentItem,HomeworkStatusModels optional behalten (für Migration) aber nicht mehr nutzen - Alte Frontend-Homework-Logik entfernen