ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: очистка stale assignees Operational Core

This commit is contained in:
DCCONSTRUCTIONS
2026-05-09 12:33:49 +03:00
parent fa4a533d29
commit 78deab1a23
10 changed files with 110 additions and 10 deletions
@@ -570,7 +570,15 @@ class IssueViewSet(BaseViewSet):
Subquery(
IssueAssignee.objects.filter(
issue_id=OuterRef("pk"),
deleted_at__isnull=True,
assignee__is_active=True,
assignee__member_workspace__workspace_id=OuterRef("workspace_id"),
assignee__member_workspace__is_active=True,
assignee__member_workspace__is_banned=False,
assignee__member_workspace__deleted_at__isnull=True,
assignee__member_project__project_id=OuterRef("project_id"),
assignee__member_project__is_active=True,
assignee__member_project__deleted_at__isnull=True,
)
.values("issue_id")
.annotate(arr=ArrayAgg("assignee_id", distinct=True))
@@ -676,7 +684,14 @@ class IssueViewSet(BaseViewSet):
distinct=True,
filter=Q(
~Q(assignees__id__isnull=True)
& Q(assignees__is_active=True)
& Q(assignees__member_workspace__workspace_id=F("workspace_id"))
& Q(assignees__member_workspace__is_active=True)
& Q(assignees__member_workspace__is_banned=False)
& Q(assignees__member_workspace__deleted_at__isnull=True)
& Q(assignees__member_project__project_id=F("project_id"))
& Q(assignees__member_project__is_active=True)
& Q(assignees__member_project__deleted_at__isnull=True)
& Q(issue_assignee__deleted_at__isnull=True)
),
),
@@ -980,7 +995,15 @@ class IssuePaginatedViewSet(BaseViewSet):
Subquery(
IssueAssignee.objects.filter(
issue_id=OuterRef("pk"),
deleted_at__isnull=True,
assignee__is_active=True,
assignee__member_workspace__workspace_id=OuterRef("workspace_id"),
assignee__member_workspace__is_active=True,
assignee__member_workspace__is_banned=False,
assignee__member_workspace__deleted_at__isnull=True,
assignee__member_project__project_id=OuterRef("project_id"),
assignee__member_project__is_active=True,
assignee__member_project__deleted_at__isnull=True,
)
.values("issue_id")
.annotate(arr=ArrayAgg("assignee_id", distinct=True))
@@ -1315,7 +1338,14 @@ class IssueDetailIdentifierEndpoint(BaseAPIView):
distinct=True,
filter=Q(
~Q(assignees__id__isnull=True)
& Q(assignees__is_active=True)
& Q(assignees__member_workspace__workspace_id=F("workspace_id"))
& Q(assignees__member_workspace__is_active=True)
& Q(assignees__member_workspace__is_banned=False)
& Q(assignees__member_workspace__deleted_at__isnull=True)
& Q(assignees__member_project__project_id=F("project_id"))
& Q(assignees__member_project__is_active=True)
& Q(assignees__member_project__deleted_at__isnull=True)
& Q(issue_assignee__deleted_at__isnull=True)
),
),
@@ -18,7 +18,7 @@ from plane.app.serializers import (
from plane.app.permissions import WorkspaceUserPermission
from plane.db.models import Project, ProjectMember, ProjectUserProperty, WorkspaceMember
from plane.db.models import IssueAssignee, Project, ProjectMember, ProjectUserProperty, WorkspaceMember
from plane.bgtasks.project_add_user_email_task import project_add_user_email
from plane.utils.host import base_host
from plane.app.permissions.base import allow_permission, ROLE
@@ -295,6 +295,7 @@ class ProjectMemberViewSet(BaseViewSet):
project_member.is_active = False
project_member.save()
IssueAssignee.objects.filter(project_id=project_id, assignee_id=project_member.member_id).delete()
return Response(status=status.HTTP_204_NO_CONTENT)
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
@@ -323,6 +324,7 @@ class ProjectMemberViewSet(BaseViewSet):
# 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()
return Response(status=status.HTTP_204_NO_CONTENT)
@@ -21,7 +21,7 @@ from plane.app.serializers import (
WorkSpaceMemberSerializer,
)
from plane.app.views.base import BaseAPIView
from plane.db.models import Project, ProjectMember, WorkspaceMember, DraftIssue
from plane.db.models import IssueAssignee, Project, ProjectMember, WorkspaceMember, DraftIssue
from plane.utils.cache import invalidate_cache
from .. import BaseViewSet
@@ -144,6 +144,7 @@ class WorkSpaceMemberViewSet(BaseViewSet):
_ = ProjectMember.objects.filter(
workspace__slug=slug, member_id=workspace_member.member_id, is_active=True
).update(is_active=False, updated_at=timezone.now())
IssueAssignee.objects.filter(workspace__slug=slug, assignee_id=workspace_member.member_id).delete()
workspace_member.is_active = False
workspace_member.save()
@@ -198,6 +199,7 @@ class WorkSpaceMemberViewSet(BaseViewSet):
_ = ProjectMember.objects.filter(
workspace__slug=slug, member_id=workspace_member.member_id, is_active=True
).update(is_active=False, updated_at=timezone.now())
IssueAssignee.objects.filter(workspace__slug=slug, assignee_id=workspace_member.member_id).delete()
# # Deactivate the user
workspace_member.is_active = False