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

76 lines
2.4 KiB
Python

from rest_framework import serializers
from core.serializers.base import BaseModelSerializer
from apps.workspaces.models import Workspace, WorkspaceMembership
from core.serializers.mini import UserMiniSerializer
class WorkspaceMemberInputSerializer(serializers.Serializer):
user_id = serializers.UUIDField()
role = serializers.ChoiceField(choices=WorkspaceMembership.Role.choices, default=WorkspaceMembership.Role.MEMBER)
class WorkspaceSerializer(BaseModelSerializer):
members = WorkspaceMemberInputSerializer(many=True, write_only=True, required=False)
my_role = serializers.SerializerMethodField()
class Meta:
model = Workspace
fields = BaseModelSerializer.Meta.fields + (
"name",
"description",
"owner",
"my_role",
"members",
)
read_only_fields = BaseModelSerializer.Meta.fields + (
"owner",
)
def get_my_role(self, obj):
membership = WorkspaceMembership.objects.filter(
workspace=obj,
user=self.context["request"].user,
).first()
return getattr(membership, "role", None)
def create(self, validated_data):
members_data = validated_data.pop('members', [])
workspace = super().create(validated_data)
memberships_to_create = []
for member in members_data:
memberships_to_create.append(
WorkspaceMembership(
workspace=workspace,
user_id=member['user_id'],
role=member['role'],
is_active=True
)
)
if memberships_to_create:
WorkspaceMembership.objects.bulk_create(memberships_to_create)
return workspace
class WorkspaceMembershipSerializer(BaseModelSerializer):
class Meta:
model = WorkspaceMembership
fields = BaseModelSerializer.Meta.fields + (
"workspace",
"user",
"role",
"is_active",
)
def to_representation(self, instance):
data = super().to_representation(instance)
data["user"] = UserMiniSerializer(
instance.user,
context=self.context
).data
return data