Files
qlockify-backend-deployment/apps/projects/api/serializers.py

119 lines
4.0 KiB
Python

from rest_framework import serializers
from core.serializers.base import BaseModelSerializer
from apps.projects.models import (
Project,
ProjectMembership,
ProjectRate,
ProjectUserRate,
)
class ProjectSerializer(BaseModelSerializer):
"""
Serializer for retrieving and representing project details.
"""
class Meta:
model = Project
fields = BaseModelSerializer.Meta.fields + (
"workspace",
"name",
"client",
"description",
"is_archived",
"color",
)
read_only_fields = fields
class ProjectCreateSerializer(serializers.Serializer):
"""
Serializer for validating input data during project creation.
We use a standard Serializer here to decouple validation from the model,
keeping business logic in the service layer.
"""
workspace_id = serializers.UUIDField()
name = serializers.CharField(max_length=255)
client_id = serializers.UUIDField(required=False, allow_null=True)
description = serializers.CharField(required=False, allow_blank=True, default="")
color = serializers.CharField(max_length=7, required=False, allow_blank=True, default="")
class ProjectUpdateSerializer(serializers.Serializer):
"""
Serializer for validating input data during project updates.
"""
name = serializers.CharField(max_length=255, required=False)
client_id = serializers.UUIDField(required=False, allow_null=True)
description = serializers.CharField(required=False, allow_blank=True)
color = serializers.CharField(max_length=7, required=False, allow_blank=True)
is_archived = serializers.BooleanField(required=False)
class ProjectMembershipSerializer(BaseModelSerializer):
class Meta:
model = ProjectMembership
fields = BaseModelSerializer.Meta.fields + (
"project",
"user",
"role",
"is_active",
)
read_only_fields = fields
class ProjectMembershipCreateSerializer(serializers.Serializer):
project_id = serializers.UUIDField()
user_id = serializers.UUIDField()
role = serializers.ChoiceField(choices=ProjectMembership.Role.choices)
class ProjectMembershipUpdateSerializer(serializers.Serializer):
role = serializers.ChoiceField(choices=ProjectMembership.Role.choices, required=False)
is_active = serializers.BooleanField(required=False)
class ProjectRateSerializer(BaseModelSerializer):
class Meta:
model = ProjectRate
fields = BaseModelSerializer.Meta.fields + (
"project",
"hourly_rate",
"currency",
)
read_only_fields = fields
class ProjectRateCreateSerializer(serializers.Serializer):
project_id = serializers.UUIDField()
amount = serializers.DecimalField(max_digits=10, decimal_places=2)
currency = serializers.CharField(max_length=3, default="USD")
class ProjectRateUpdateSerializer(serializers.Serializer):
amount = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
currency = serializers.CharField(max_length=3, required=False)
class ProjectUserRateSerializer(BaseModelSerializer):
class Meta:
model = ProjectUserRate
fields = BaseModelSerializer.Meta.fields + (
"project",
"user",
"hourly_rate",
"currency",
)
read_only_fields = fields
class ProjectUserRateCreateSerializer(serializers.Serializer):
project_id = serializers.UUIDField()
user_id = serializers.UUIDField()
hourly_rate = serializers.DecimalField(max_digits=10, decimal_places=2)
currency = serializers.CharField(max_length=3, default="USD")
class ProjectUserRateUpdateSerializer(serializers.Serializer):
hourly_rate = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
currency = serializers.CharField(max_length=3, required=False)