Skip to content

Instantly share code, notes, and snippets.

@jasonleibowitz
Last active December 13, 2023 18:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jasonleibowitz/b893d33e5e0484e25225d06d9c566527 to your computer and use it in GitHub Desktop.
Save jasonleibowitz/b893d33e5e0484e25225d06d9c566527 to your computer and use it in GitHub Desktop.
[ISD-8220] Delete Outstanding Tasks for Removed User
from scripts.utils import ScriptRunner
from carta_identity.filters.user import EmailFilter as PrimaryEmailFilter, IsActiveFilter
from fund_admin.identity import get_carta_identity_client
from fund_admin.express.task_management.services import WorkflowService
from fund_admin.express.task_management.constants import WorkflowTemplateName
from fund_admin.approvers.models import DesignatedApprover
from fund_admin.fund_admin.models import Firm, Fund, FundFamily
from django.db.models import Q
class RemoveDesignatedApprover(ScriptRunner):
"""
Deletes a designated approver from a firm, and cancels any outstanding tasks for the user.
"""
def __init__(self, parser):
parser.add_argument("user_email", type=str, help="Email of the user to be removed")
parser.add_argument("carta_firm_id", type="str', help="Carta Firm ID for the firm the user is to be removed from")
def pre_run_check(self, **kwargs):
pass
def _get_user_by_email(self, email: str):
return get_carta_identity_client().users.get_many(
PrimaryEmailFilter(value=email),
IsActiveFilter(value=True),
)
def run(self, user_email: str):
firm = Firm.objects.get(carta_id=carta_firm_id)
fund_ids = Fund.objects.filter(firm_id=firm.id).values_list("id", flat=True)
fund_family_ids = FundFamily.objects.filter(firm_id=firm_id).values_list("id", flat=True)
users = self._get_user_by_email(user_email)
user_ids = [user.id for user in users]
workflows = WorkflowService().list_workflows_for_object(
object_type="reporting.FinancialPackageReport",
object_id=<add_package_id>, # TODO
template_name=WorkflowTemplateName.PUBLISH_FINANCIAL_PACKAGE.value,
)
for task in workflow.tasks.by_assignees(user_ids=user_ids):
# Cancel Task
task.cancel()
approvers = DesignatedApprover.objects.filter(
Q(fund_id__in=fund_ids) | Q(fund_family_id__in=fund_family_ids) | Q(firm_id=firm.id),
Q(user_id__in=user_ids)
)
print(f"Approvers Count: {approvers.count()}")
for a in approvers:
pprint(f"About to delete {a.__dict__}")
approvers.delete()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment