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
This commit is contained in:
@@ -0,0 +1,303 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user