from django.contrib.auth import get_user_model from rest_framework import serializers from users.serializers import UserSerializer from .models import TimeEntry from .services import save_period, validate_period class TimeEntrySerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) class Meta: model = TimeEntry fields = [ 'id', 'user', 'group_id', 'start_date', 'start_time', 'end_date', 'end_time', 'created_at', 'updated_at', 'duration', 'day_of_week', 'is_complete', 'is_incomplete', ] read_only_fields = fields class TimeEntryCreateSerializer(serializers.Serializer): user_id = serializers.PrimaryKeyRelatedField( source='user', queryset=get_user_model().objects.all(), required=False, write_only=True, ) start_date = serializers.DateField() start_time = serializers.TimeField() end_date = serializers.DateField(required=False) end_time = serializers.TimeField(required=False, allow_null=True) def validate(self, attrs): validate_period(attrs) return attrs def create(self, validated_data): user = validated_data.pop('user', self.context['request'].user) return save_period(user, validated_data) class TimeEntryUpdateSerializer(serializers.Serializer): start_date = serializers.DateField() start_time = serializers.TimeField() end_date = serializers.DateField() end_time = serializers.TimeField(allow_null=True) def validate(self, attrs): entries = self.context.get('entries', [self.instance]) first, last = entries[0], entries[-1] values = dict( start_date=first.start_date, start_time=first.start_time, end_date=last.end_date, end_time=last.end_time, ) values.update(attrs) validate_period(values) return values def update(self, instance, validated_data): return save_period( instance.user, validated_data, self.context.get('entries', [instance]), ) class WeeklySummarySerializer(serializers.Serializer): user = serializers.CharField() username = serializers.CharField() total_hours = serializers.FloatField() entries = serializers.ListField(child=serializers.DictField())