ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: единый realtime слой Tasker

Добавлен NODE.DC realtime event stream для workspace/project/member/invite/profile событий. Обновлены frontend stores и live controller. Доработаны settings modal, member dropdown и confirm remove под NODE.DC UX.
This commit is contained in:
DCCONSTRUCTIONS
2026-05-12 17:28:40 +03:00
parent fc59481703
commit 480f85cce8
23 changed files with 993 additions and 72 deletions
@@ -9,6 +9,8 @@ from django.db.models import Min
# Module imports
from .base import BaseViewSet, BaseAPIView
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.nodedc_workspace_policy import (
is_nodedc_launcher_managed_workspace,
nodedc_launcher_managed_workspace_response,
@@ -176,6 +178,18 @@ class ProjectMemberViewSet(BaseViewSet):
],
batch_size=10,
)
for project_member in project_members:
publish_nodedc_workspace_event_on_commit(
project_member.workspace,
"project_member.created",
payload={
"project_id": str(project_member.project_id),
"member_id": str(project_member.member_id),
"role": project_member.role,
"source": "tasker",
},
extra_user_ids=[project_member.member_id],
)
# Send emails to notify the users
[
project_add_user_email.delay(
@@ -301,6 +315,17 @@ class ProjectMemberViewSet(BaseViewSet):
if serializer.is_valid():
serializer.save()
publish_nodedc_workspace_event_on_commit(
project_member.workspace,
"project_member.updated",
payload={
"project_id": str(project_member.project_id),
"member_id": str(project_member.member_id),
"role": project_member.role,
"source": "tasker",
},
extra_user_ids=[project_member.member_id],
)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@@ -336,9 +361,24 @@ class ProjectMemberViewSet(BaseViewSet):
status=status.HTTP_400_BAD_REQUEST,
)
publish_assignee_cleanup_issue_events_on_commit(
project_id=project_id,
assignee_id=project_member.member_id,
actor_id=request.user.id,
)
project_member.is_active = False
project_member.save()
IssueAssignee.objects.filter(project_id=project_id, assignee_id=project_member.member_id).delete()
publish_nodedc_workspace_event_on_commit(
project_member.workspace,
"project_member.deleted",
payload={
"project_id": str(project_member.project_id),
"member_id": str(project_member.member_id),
"source": "tasker",
},
extra_user_ids=[project_member.member_id],
)
return Response(status=status.HTTP_204_NO_CONTENT)
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
@@ -367,10 +407,25 @@ class ProjectMemberViewSet(BaseViewSet):
},
status=status.HTTP_400_BAD_REQUEST,
)
publish_assignee_cleanup_issue_events_on_commit(
project_id=project_id,
assignee_id=project_member.member_id,
actor_id=request.user.id,
)
# Deactivate the user
project_member.is_active = False
project_member.save()
IssueAssignee.objects.filter(project_id=project_id, assignee_id=project_member.member_id).delete()
publish_nodedc_workspace_event_on_commit(
project_member.workspace,
"project_member.deleted",
payload={
"project_id": str(project_member.project_id),
"member_id": str(project_member.member_id),
"source": "tasker",
},
extra_user_ids=[project_member.member_id],
)
return Response(status=status.HTTP_204_NO_CONTENT)