ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: единый 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:
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user