REALTIME - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: обновление доступов workspace

This commit is contained in:
DCCONSTRUCTIONS
2026-05-12 22:26:48 +03:00
parent 5e7c9e08a0
commit 268ab2c9b9
5 changed files with 119 additions and 3 deletions
@@ -30,6 +30,7 @@ from plane.app.permissions import (
WorkSpaceBasePermission,
WorkspaceEntityPermission,
)
from plane.app.realtime.nodedc_events import publish_nodedc_event_to_users_on_commit
# Module imports
from plane.app.serializers import WorkSpaceSerializer, WorkspaceThemeSerializer
@@ -197,6 +198,14 @@ class WorkSpaceViewSet(BaseViewSet):
def destroy(self, request, *args, **kwargs):
# Get the workspace
workspace = self.get_object()
workspace_member_ids = list(
WorkspaceMember.objects.filter(
workspace_id=workspace.id,
is_active=True,
member__is_bot=False,
deleted_at__isnull=True,
).values_list("member_id", flat=True)
)
self.remove_last_workspace_ids_from_user_settings(workspace.id)
track_event.delay(
user_id=request.user.id,
@@ -211,7 +220,16 @@ class WorkSpaceViewSet(BaseViewSet):
"deleted_at": str(timezone.now().isoformat()),
},
)
return super().destroy(request, *args, **kwargs)
response = super().destroy(request, *args, **kwargs)
publish_nodedc_event_to_users_on_commit(
"workspace.deleted",
workspace_member_ids,
{
"workspace_id": str(workspace.id),
"workspace_slug": workspace.slug,
},
)
return response
class UserWorkSpacesEndpoint(BaseAPIView):
@@ -13,6 +13,8 @@ from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from plane.app.realtime.issue_events import publish_assignee_cleanup_issue_events_on_commit
from plane.app.realtime.nodedc_events import publish_nodedc_workspace_event_on_commit
from plane.authentication.utils.host import user_ip
from plane.db.models import ExternalIdentityLink, IssueAssignee, ProjectMember, Session, User, WorkspaceMember
@@ -240,10 +242,57 @@ def delete_queryset(queryset):
def revoke_user_tasker_access(user):
workspace_memberships = list(
WorkspaceMember.objects.filter(member=user)
.select_related("workspace")
.only("id", "workspace_id", "workspace__id", "workspace__slug")
)
project_memberships = list(
ProjectMember.objects.filter(member=user)
.select_related("workspace", "project")
.only("id", "workspace_id", "project_id", "workspace__id", "workspace__slug")
)
workspace_by_id = {}
project_ids_by_workspace_id = {}
for membership in workspace_memberships:
workspace_by_id[membership.workspace_id] = membership.workspace
project_ids_by_workspace_id.setdefault(membership.workspace_id, set())
for membership in project_memberships:
workspace_by_id[membership.workspace_id] = membership.workspace
project_ids_by_workspace_id.setdefault(membership.workspace_id, set()).add(membership.project_id)
publish_assignee_cleanup_issue_events_on_commit(project_id=membership.project_id, assignee_id=user.id)
deleted_issue_assignees = delete_queryset(IssueAssignee.objects.filter(assignee=user))
deleted_project_memberships = delete_queryset(ProjectMember.objects.filter(member=user))
deleted_workspace_memberships = delete_queryset(WorkspaceMember.objects.filter(member=user))
for workspace_id, workspace in workspace_by_id.items():
project_ids = [str(project_id) for project_id in project_ids_by_workspace_id.get(workspace_id, set())]
publish_nodedc_workspace_event_on_commit(
workspace,
"workspace_member.deleted",
payload={
"member_id": str(user.id),
"project_ids": project_ids,
"source": "launcher",
},
extra_user_ids=[user.id],
)
for membership in project_memberships:
publish_nodedc_workspace_event_on_commit(
membership.workspace,
"project_member.deleted",
payload={
"project_id": str(membership.project_id),
"member_id": str(user.id),
"source": "launcher",
},
extra_user_ids=[user.id],
)
return {
"workspaceMemberships": deleted_workspace_memberships,
"projectMemberships": deleted_project_memberships,