feat(workspaces): expose role-aware membership details

This commit is contained in:
2026-04-28 10:46:15 +03:30
parent afb1a55570
commit 76f02dc259
3 changed files with 57 additions and 14 deletions

View File

@@ -4,6 +4,7 @@ from rest_framework import serializers
from apps.notifications.services import notify_workspace_membership_added
from apps.users.models import User
from apps.workspaces.services import WORKSPACE_MEMBERS_VIEW, has_workspace_capability
from core.serializers.base import BaseModelSerializer
from apps.workspaces.models import PriceUnit, Workspace, WorkspaceMembership, WorkspaceUserRate
from core.serializers.mini import UserMiniSerializer
@@ -76,22 +77,36 @@ class WorkspaceSerializer(BaseModelSerializer):
class WorkspaceMembershipSerializer(BaseModelSerializer):
class Meta:
model = WorkspaceMembership
fields = BaseModelSerializer.Meta.fields + (
"workspace",
"user",
user = serializers.SerializerMethodField()
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
def get_user(self, instance):
request = self.context.get("request")
viewer = getattr(request, "user", None)
can_view_sensitive_details = bool(
viewer
and viewer.is_authenticated
and has_workspace_capability(viewer, instance.workspace, WORKSPACE_MEMBERS_VIEW)
)
user_data = UserMiniSerializer(instance.user, context=self.context).data
if can_view_sensitive_details:
return user_data
return {
"id": user_data["id"],
"first_name": user_data.get("first_name"),
"last_name": user_data.get("last_name"),
"profile_picture": user_data.get("profile_picture"),
}
class PriceUnitSerializer(BaseModelSerializer):

View File

@@ -33,6 +33,7 @@ from apps.workspaces.models import PriceUnit, Workspace, WorkspaceMembership, Wo
from apps.workspaces.services import (
WORKSPACE_MEMBERS_VIEW,
WORKSPACE_EDIT,
WORKSPACE_VIEW,
can_assign_workspace_role,
can_change_workspace_membership,
has_workspace_capability,
@@ -102,7 +103,9 @@ class WorkspaceMembershipViewSet(ModelViewSet):
).distinct()
def get_permissions(self):
if self.action in ["list", "retrieve", "create", "update", "partial_update"]:
if self.action in ["list", "retrieve"]:
return [IsAuthenticated()]
if self.action in ["create", "update", "partial_update"]:
return [IsAuthenticated(), CanWorkspaceManageMembers()]
if self.action in ["destroy"]:
return [IsAuthenticated(), CanWorkspaceManageMembers()]
@@ -118,7 +121,7 @@ class WorkspaceMembershipViewSet(ModelViewSet):
)
workspace = get_object_or_404(Workspace, id=workspace_id, is_deleted=False)
if not has_workspace_capability(request.user, workspace, WORKSPACE_MEMBERS_VIEW):
if not has_workspace_capability(request.user, workspace, WORKSPACE_VIEW):
return Response(
{"detail": "You do not have permission to view workspace members."},
status=status.HTTP_403_FORBIDDEN,