129 lines
4.3 KiB
Python
129 lines
4.3 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
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
|
|
if instance.client:
|
|
representation['client'] = {
|
|
'id': instance.client.id,
|
|
'name': instance.client.name
|
|
}
|
|
|
|
return representation
|
|
|
|
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 = serializers.UUIDField()
|
|
name = serializers.CharField(max_length=255)
|
|
client = 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)
|
|
clien = 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)
|