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
191 lines
7.6 KiB
Python
191 lines
7.6 KiB
Python
from rest_framework import serializers
|
|
from .models import (
|
|
Homework, HomeworkExerciseItem, HomeworkAssignment,
|
|
HomeworkAssignmentItem, HomeworkStatus,
|
|
TrainingHomeworkAssignment, TrainingHomeworkExerciseItem
|
|
)
|
|
|
|
|
|
class HomeworkExerciseItemSerializer(serializers.ModelSerializer):
|
|
exercise_name = serializers.CharField(source='exercise.name', read_only=True)
|
|
exercise_category = serializers.CharField(source='exercise.category', read_only=True)
|
|
|
|
class Meta:
|
|
model = HomeworkExerciseItem
|
|
fields = ['id', 'exercise', 'exercise_name', 'exercise_category', 'reps', 'time_minutes', 'order']
|
|
|
|
|
|
class HomeworkSerializer(serializers.ModelSerializer):
|
|
exercise_items = HomeworkExerciseItemSerializer(many=True, read_only=True)
|
|
club_name = serializers.CharField(source='club.name', read_only=True)
|
|
exercise_count = serializers.IntegerField(source='exercise_items.count', read_only=True)
|
|
|
|
class Meta:
|
|
model = Homework
|
|
fields = ['id', 'title', 'description', 'club', 'club_name', 'due_date', 'is_active',
|
|
'exercise_items', 'exercise_count', 'created_at', 'updated_at']
|
|
|
|
|
|
class HomeworkDetailSerializer(HomeworkSerializer):
|
|
exercise_items = HomeworkExerciseItemSerializer(many=True, read_only=True)
|
|
|
|
class Meta(HomeworkSerializer.Meta):
|
|
fields = HomeworkSerializer.Meta.fields
|
|
|
|
|
|
class HomeworkAssignmentItemSerializer(serializers.ModelSerializer):
|
|
exercise_name = serializers.CharField(source='exercise.name', read_only=True)
|
|
exercise_category = serializers.CharField(source='exercise.category', read_only=True)
|
|
|
|
class Meta:
|
|
model = HomeworkAssignmentItem
|
|
fields = ['id', 'exercise', 'exercise_name', 'exercise_category', 'is_completed', 'completion_date']
|
|
|
|
|
|
class HomeworkAssignmentSerializer(serializers.ModelSerializer):
|
|
homework_title = serializers.CharField(source='homework.title', read_only=True)
|
|
club_name = serializers.CharField(source='club.name', read_only=True)
|
|
wrestler_name = serializers.SerializerMethodField()
|
|
completed_items = serializers.SerializerMethodField()
|
|
total_items = serializers.SerializerMethodField()
|
|
items = HomeworkAssignmentItemSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = HomeworkAssignment
|
|
fields = ['id', 'homework', 'homework_title', 'wrestler', 'wrestler_name', 'club', 'club_name',
|
|
'due_date', 'notes', 'is_completed', 'completion_date', 'completed_items',
|
|
'total_items', 'items', 'created_at']
|
|
|
|
def get_wrestler_name(self, obj):
|
|
return f"{obj.wrestler.first_name} {obj.wrestler.last_name}"
|
|
|
|
def get_completed_items(self, obj):
|
|
return obj.items.filter(is_completed=True).count()
|
|
|
|
def get_total_items(self, obj):
|
|
return obj.items.count()
|
|
|
|
|
|
class HomeworkAssignmentListSerializer(serializers.ModelSerializer):
|
|
homework_title = serializers.CharField(source='homework.title', read_only=True)
|
|
club_name = serializers.CharField(source='club.name', read_only=True)
|
|
wrestler_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = HomeworkAssignment
|
|
fields = ['id', 'homework', 'homework_title', 'wrestler', 'wrestler_name', 'club', 'club_name',
|
|
'due_date', 'notes', 'is_completed', 'completion_date', 'created_at']
|
|
|
|
def get_wrestler_name(self, obj):
|
|
return f"{obj.wrestler.first_name} {obj.wrestler.last_name}"
|
|
|
|
|
|
class AssignHomeworkSerializer(serializers.Serializer):
|
|
homework = serializers.IntegerField()
|
|
wrestlers = serializers.ListField(child=serializers.IntegerField())
|
|
due_date = serializers.DateField(required=False, allow_null=True)
|
|
notes = serializers.CharField(required=False, allow_blank=True, default='')
|
|
|
|
|
|
class CompleteItemSerializer(serializers.Serializer):
|
|
item_id = serializers.IntegerField()
|
|
|
|
|
|
class HomeworkStatusSerializer(serializers.ModelSerializer):
|
|
wrestler_name = serializers.CharField(source='wrestler.__str__', read_only=True)
|
|
|
|
class Meta:
|
|
model = HomeworkStatus
|
|
fields = '__all__'
|
|
|
|
|
|
# NEUES SYSTEM: Training-basierte Homework
|
|
|
|
class TrainingHomeworkExerciseItemSerializer(serializers.ModelSerializer):
|
|
exercise_name = serializers.CharField(source='exercise.name', read_only=True)
|
|
exercise_category = serializers.CharField(source='exercise.category', read_only=True)
|
|
|
|
class Meta:
|
|
model = TrainingHomeworkExerciseItem
|
|
fields = ['id', 'exercise', 'exercise_name', 'exercise_category', 'reps', 'time_minutes', 'order', 'is_completed']
|
|
|
|
|
|
class TrainingHomeworkAssignmentSerializer(serializers.ModelSerializer):
|
|
exercises = serializers.SerializerMethodField()
|
|
training_date = serializers.DateField(source='training.date', read_only=True)
|
|
training_group = serializers.CharField(source='training.group', read_only=True)
|
|
wrestler_name = serializers.SerializerMethodField()
|
|
wrestler_group = serializers.CharField(source='wrestler.group', read_only=True)
|
|
|
|
class Meta:
|
|
model = TrainingHomeworkAssignment
|
|
fields = ['id', 'training', 'training_date', 'training_group', 'wrestler', 'wrestler_name',
|
|
'wrestler_group', 'notes', 'is_completed', 'completion_date', 'exercises', 'created_at']
|
|
|
|
def get_wrestler_name(self, obj):
|
|
return f"{obj.wrestler.first_name} {obj.wrestler.last_name}"
|
|
|
|
def get_exercises(self, obj):
|
|
exercises = obj.exercises.all().order_by('order')
|
|
return TrainingHomeworkExerciseItemSerializer(exercises, many=True).data
|
|
|
|
|
|
class TrainingHomeworkAssignmentCreateSerializer(serializers.Serializer):
|
|
training = serializers.IntegerField()
|
|
wrestler = serializers.IntegerField()
|
|
exercises = serializers.ListField(
|
|
child=serializers.DictField(child=serializers.IntegerField(allow_null=True))
|
|
)
|
|
notes = serializers.CharField(required=False, allow_blank=True, default='')
|
|
|
|
def create(self, validated_data):
|
|
from utils.permissions import get_user_club
|
|
from exercises.models import Exercise
|
|
from trainings.models import Training
|
|
from wrestlers.models import Wrestler
|
|
|
|
user = self.context['request'].user
|
|
club = get_user_club(user)
|
|
|
|
training_id = validated_data['training']
|
|
wrestler_id = validated_data['wrestler']
|
|
exercises_data = validated_data['exercises']
|
|
notes = validated_data.get('notes', '')
|
|
|
|
try:
|
|
training_obj = Training.objects.get(id=training_id)
|
|
except Training.DoesNotExist:
|
|
raise serializers.ValidationError({'training': f'Training with id {training_id} does not exist'})
|
|
|
|
try:
|
|
wrestler_obj = Wrestler.objects.get(id=wrestler_id)
|
|
except Wrestler.DoesNotExist:
|
|
raise serializers.ValidationError({'wrestler': f'Wrestler with id {wrestler_id} does not exist'})
|
|
|
|
# Create assignment
|
|
assignment = TrainingHomeworkAssignment.objects.create(
|
|
training=training_obj,
|
|
wrestler=wrestler_obj,
|
|
club=club,
|
|
notes=notes
|
|
)
|
|
|
|
# Create individual exercises for this assignment
|
|
for i, ex in enumerate(exercises_data):
|
|
try:
|
|
exercise_obj = Exercise.objects.get(id=ex['exercise'])
|
|
TrainingHomeworkExerciseItem.objects.create(
|
|
assignment=assignment,
|
|
exercise=exercise_obj,
|
|
reps=ex.get('reps'),
|
|
time_minutes=ex.get('time_minutes'),
|
|
order=i
|
|
)
|
|
except Exercise.DoesNotExist:
|
|
pass
|
|
|
|
return assignment
|
|
|
|
def to_representation(self, instance):
|
|
return TrainingHomeworkAssignmentSerializer(instance, context=self.context).data
|