from django.db import transaction from django.utils import timezone from plane.db.models import ProjectMember, WorkspaceMember def is_workspace_member_currently_banned(workspace_member): return bool( workspace_member and workspace_member.is_banned and (workspace_member.banned_until is None or workspace_member.banned_until > timezone.now()) ) def release_workspace_member_ban(workspace_member): project_member_ids = workspace_member.ban_project_member_ids or [] with transaction.atomic(): if project_member_ids: ProjectMember.objects.filter( id__in=project_member_ids, workspace_id=workspace_member.workspace_id, member_id=workspace_member.member_id, ).update(is_active=True, updated_at=timezone.now()) workspace_member.is_active = True workspace_member.is_banned = False workspace_member.banned_at = None workspace_member.banned_until = None workspace_member.ban_project_member_ids = [] workspace_member.save( update_fields=[ "is_active", "is_banned", "banned_at", "banned_until", "ban_project_member_ids", "updated_at", ] ) def release_expired_workspace_bans(member=None, workspace_slug=None, workspace_id=None): queryset = WorkspaceMember.objects.filter( is_banned=True, banned_until__isnull=False, banned_until__lte=timezone.now(), ) if member is not None: queryset = queryset.filter(member=member) if workspace_slug is not None: queryset = queryset.filter(workspace__slug=workspace_slug) if workspace_id is not None: queryset = queryset.filter(workspace_id=workspace_id) for workspace_member in queryset: release_workspace_member_ban(workspace_member)