UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: корректный flow уведомлений Tasker

This commit is contained in:
DCCONSTRUCTIONS
2026-05-12 15:11:17 +03:00
parent 6737138ab7
commit fc59481703
17 changed files with 717 additions and 164 deletions
@@ -37,7 +37,7 @@ from plane.app.serializers import (
from plane.app.views.base import BaseAPIView
from plane.bgtasks.event_tracking_task import track_event
from plane.bgtasks.workspace_invitation_task import workspace_invitation
from plane.db.models import User, Workspace, WorkspaceMember, WorkspaceMemberInvite
from plane.db.models import Notification, User, Workspace, WorkspaceMember, WorkspaceMemberInvite
from plane.utils.cache import invalidate_cache, invalidate_cache_directly
from plane.utils.host import base_host
from plane.utils.analytics_events import USER_JOINED_WORKSPACE, USER_INVITED_TO_WORKSPACE
@@ -314,6 +314,31 @@ class WorkspaceJoinEndpoint(BaseAPIView):
"joined_at": str(timezone.now()),
},
)
if workspace_invite.created_by_id and workspace_invite.created_by_id != user.id:
Notification.objects.create(
workspace=workspace_invite.workspace,
sender="in_app:nodedc:workspace_invite_accepted",
triggered_by=user,
receiver_id=workspace_invite.created_by_id,
entity_identifier=workspace_invite.workspace_id,
entity_name="workspace_invite_accepted",
title=f"{user.display_name or user.email} принял приглашение",
message=(
f"{user.display_name or user.email} присоединился к workspace "
f"{workspace_invite.workspace.name}."
),
message_stripped=(
f"{user.display_name or user.email} присоединился к workspace "
f"{workspace_invite.workspace.name}."
),
data={
"notification_type": "workspace_invite_accepted",
"target_url": f"/{workspace_invite.workspace.slug}/settings/members",
"workspace_slug": workspace_invite.workspace.slug,
"workspace_name": workspace_invite.workspace.name,
"invitee_email": user.email,
},
)
# Delete the invitation
workspace_invite.delete()
@@ -358,6 +383,7 @@ class UserWorkspaceInvitationsViewSet(BaseViewSet):
).order_by("-created_at")
# If the user is already a member of workspace and was deactivated then activate the user
accepted_notifications = []
for invitation in workspace_invitations:
workspace_member = WorkspaceMember.objects.filter(
workspace_id=invitation.workspace_id, member=request.user
@@ -394,6 +420,33 @@ class UserWorkspaceInvitationsViewSet(BaseViewSet):
"joined_at": str(timezone.now()),
},
)
if invitation.created_by_id and invitation.created_by_id != request.user.id:
accepted_notifications.append(
Notification(
workspace=invitation.workspace,
sender="in_app:nodedc:workspace_invite_accepted",
triggered_by=request.user,
receiver_id=invitation.created_by_id,
entity_identifier=invitation.workspace_id,
entity_name="workspace_invite_accepted",
title=f"{request.user.display_name or request.user.email} принял приглашение",
message=(
f"{request.user.display_name or request.user.email} присоединился к workspace "
f"{invitation.workspace.name}."
),
message_stripped=(
f"{request.user.display_name or request.user.email} присоединился к workspace "
f"{invitation.workspace.name}."
),
data={
"notification_type": "workspace_invite_accepted",
"target_url": f"/{invitation.workspace.slug}/settings/members",
"workspace_slug": invitation.workspace.slug,
"workspace_name": invitation.workspace.name,
"invitee_email": request.user.email,
},
)
)
# Bulk create the user for all the workspaces
WorkspaceMember.objects.bulk_create(
@@ -408,6 +461,7 @@ class UserWorkspaceInvitationsViewSet(BaseViewSet):
],
ignore_conflicts=True,
)
Notification.objects.bulk_create(accepted_notifications, batch_size=10)
# Delete joined workspace invites
workspace_invitations.delete()