from rest_framework import serializers from core.serializers.base import BaseModelSerializer from apps.time_entries.models import TimeEntry from apps.projects.models import Project from apps.tags.models import Tag class TimeEntrySerializer(BaseModelSerializer): """ Output serializer for TimeEntry. """ start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", allow_null=True) class Meta: model = TimeEntry fields = BaseModelSerializer.Meta.fields + ( "workspace", "user", "project", "description", "start_time", "end_time", "duration", "tags", "is_billable", "hourly_rate", "currency", ) read_only_fields = fields class TimeEntryCreateSerializer(serializers.Serializer): """ Validates input data for creating/starting a time entry. """ workspace_id = serializers.UUIDField() project_id = serializers.PrimaryKeyRelatedField( queryset=Project.objects.filter(is_deleted=False), required=False, allow_null=True, source='project' ) start_time = serializers.DateTimeField() end_time = serializers.DateTimeField(required=False, allow_null=True) description = serializers.CharField(required=False, allow_blank=True, default="") tags = serializers.PrimaryKeyRelatedField( queryset=Tag.objects.filter(is_deleted=False), many=True, required=False ) is_billable = serializers.BooleanField(default=False) class TimeEntryUpdateSerializer(serializers.Serializer): """ Validates input data for updating an existing time entry. """ project_id = serializers.PrimaryKeyRelatedField( queryset=Project.objects.filter(is_deleted=False), required=False, allow_null=True, source='project' ) start_time = serializers.DateTimeField(required=False) end_time = serializers.DateTimeField(required=False, allow_null=True) description = serializers.CharField(required=False, allow_blank=True) tags = serializers.PrimaryKeyRelatedField( queryset=Tag.objects.filter(is_deleted=False), many=True, required=False ) is_billable = serializers.BooleanField(required=False) class TimeEntryStopSerializer(serializers.Serializer): """ Optional specific serializer for stopping a timer manually. """ end_time = serializers.DateTimeField(required=False, allow_null=True)