diff --git a/apps/projects/api/serializers.py b/apps/projects/api/serializers.py index 829fd0f..d718b3b 100644 --- a/apps/projects/api/serializers.py +++ b/apps/projects/api/serializers.py @@ -24,6 +24,16 @@ class ProjectSerializer(BaseModelSerializer): ) 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): """ @@ -31,9 +41,9 @@ class ProjectCreateSerializer(serializers.Serializer): We use a standard Serializer here to decouple validation from the model, keeping business logic in the service layer. """ - workspace_id = serializers.UUIDField() + workspace = serializers.UUIDField() name = serializers.CharField(max_length=255) - client_id = serializers.UUIDField(required=False, allow_null=True) + 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="") @@ -43,7 +53,7 @@ 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) + 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) diff --git a/apps/projects/api/views.py b/apps/projects/api/views.py index 5486873..8194518 100644 --- a/apps/projects/api/views.py +++ b/apps/projects/api/views.py @@ -11,6 +11,8 @@ from django_filters.rest_framework import DjangoFilterBackend from core.paginations.limit_offset import CustomLimitOffsetPagination +from apps.workspaces.models import Workspace +from apps.clients.models import Client from apps.projects.models import ( Project, ProjectMembership, @@ -94,11 +96,13 @@ class ProjectViewSet(ModelViewSet): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) + workspace = get_object_or_404(Workspace, id=serializer.validated_data["workspace"], is_deleted=False) + client = get_object_or_404(Client, id=serializer.validated_data.get("client"), is_deleted=False) project = create_project( user=request.user, - workspace_id=serializer.validated_data["workspace_id"], + workspace=workspace, name=serializer.validated_data["name"], - client_id=serializer.validated_data.get("client_id"), + client=client, description=serializer.validated_data.get("description", ""), color=serializer.validated_data.get("color", "") )