feat(notifications): notify membership access changes

This commit is contained in:
2026-04-25 11:51:45 +03:30
parent 0ca3255270
commit 48bf4f5c19
5 changed files with 819 additions and 78 deletions

View File

@@ -1,8 +1,10 @@
from rest_framework import serializers
from core.serializers.base import BaseModelSerializer
from apps.workspaces.models import Workspace, WorkspaceMembership
from core.serializers.mini import UserMiniSerializer
from rest_framework import serializers
from apps.notifications.membership_events import notify_workspace_membership_added
from apps.users.models import User
from core.serializers.base import BaseModelSerializer
from apps.workspaces.models import Workspace, WorkspaceMembership
from core.serializers.mini import UserMiniSerializer
class WorkspaceMemberInputSerializer(serializers.Serializer):
@@ -34,26 +36,41 @@ class WorkspaceSerializer(BaseModelSerializer):
).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(
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
)
if memberships_to_create:
WorkspaceMembership.objects.bulk_create(memberships_to_create)
request = self.context.get("request")
actor = getattr(request, "user", None)
if actor and actor.is_authenticated:
users_by_id = User.objects.in_bulk(
[member["user_id"] for member in members_data]
)
for member in members_data:
recipient = users_by_id.get(member["user_id"])
if recipient:
notify_workspace_membership_added(
actor=actor,
recipient=recipient,
workspace=workspace,
role=member["role"],
)
return workspace
class WorkspaceMembershipSerializer(BaseModelSerializer):