from rest_framework import serializers from django.contrib.auth import get_user_model from .models import TimeEntry User = get_user_model() class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username', 'first_name', 'last_name'] class TimeEntrySerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) class Meta: model = TimeEntry fields = [ 'id', 'user', 'date', 'start_time', 'end_time', 'created_at', 'updated_at', 'duration', 'day_of_week', ] read_only_fields = [ 'id', 'user', 'created_at', 'updated_at', 'duration', 'day_of_week', ] def create(self, validated_data): validated_data['user'] = self.context['request'].user return super().create(validated_data) def update(self, instance, validated_data): validated_data.pop('user', None) return super().update(instance, validated_data) class TimeEntryCreateSerializer(serializers.ModelSerializer): user_id = serializers.PrimaryKeyRelatedField( source='user', queryset=User.objects.all(), write_only=True, required=False, ) class Meta: model = TimeEntry fields = ['user_id', 'date', 'start_time', 'end_time'] def validate(self, attrs): if not attrs.get('start_time') and not attrs.get('end_time'): raise serializers.ValidationError( 'Une heure d’entrée ou de sortie est requise.' ) if ( attrs.get('start_time') and attrs.get('end_time') and attrs['end_time'] <= attrs['start_time'] ): raise serializers.ValidationError( 'L’heure de sortie doit être après l’entrée.' ) return attrs class TimeEntryUpdateSerializer(serializers.ModelSerializer): class Meta: model = TimeEntry fields = ['start_time', 'end_time'] def validate(self, attrs): if not attrs.get('start_time') and not attrs.get('end_time'): raise serializers.ValidationError( 'Une heure d’entrée ou de sortie est requise.' ) if ( attrs.get('start_time') and attrs.get('end_time') and attrs['end_time'] <= attrs['start_time'] ): raise serializers.ValidationError( 'L’heure de sortie doit être après l’heure d’entrée.' ) return attrs class WeeklySummarySerializer(serializers.Serializer): user = serializers.CharField() username = serializers.CharField() total_hours = serializers.FloatField() entries = serializers.ListField(child=serializers.DictField())