def handle_group_owners(project, group, owners): """ Stores group owners generated by `ProjectOwnership.get_autoassign_owners` in the `GroupOwner` model, and handles any diffing/changes of which owners we're keeping. :return: """ from sentry.models.groupowner import GroupOwner, GroupOwnerType from sentry.models.team import Team from sentry.models.user import User lock = locks.get(f"groupowner-bulk:{group.id}", duration=10) try: with metrics.timer( "post_process.handle_group_owners"), sentry_sdk.start_span( op="post_process.handle_group_owners"), lock.acquire(): current_group_owners = GroupOwner.objects.filter( group=group, type=GroupOwnerType.OWNERSHIP_RULE.value) new_owners = {(type(owner), owner.id) for owner in owners} # Owners already in the database that we'll keep keeping_owners = set() for owner in current_group_owners: lookup_key = ((Team, owner.team_id) if owner.team_id is not None else (User, owner.user_id)) if lookup_key not in new_owners: owner.delete() else: keeping_owners.add(lookup_key) new_group_owners = [] for key in new_owners: if key not in keeping_owners: owner_type, owner_id = key user_id = None team_id = None if owner_type is User: user_id = owner_id if owner_type is Team: team_id = owner_id new_group_owners.append( GroupOwner( group=group, type=GroupOwnerType.OWNERSHIP_RULE.value, user_id=user_id, team_id=team_id, project=project, organization=project.organization, )) if new_group_owners: GroupOwner.objects.bulk_create(new_group_owners) except UnableToAcquireLock: pass
def handle_group_owners(project, group, owners): """ Stores group owners generated by `ProjectOwnership.get_autoassign_owners` in the `GroupOwner` model, and handles any diffing/changes of which owners we're keeping. :return: """ from sentry.models.groupowner import GroupOwner, GroupOwnerType from sentry.models.team import Team from sentry.models.user import User current_group_owners = GroupOwner.objects.filter( group=group, type=GroupOwnerType.OWNERSHIP_RULE.value ) new_owners = {(type(owner), owner.id) for owner in owners} # Owners already in the database that we'll keep keeping_owners = set() for owner in current_group_owners: lookup_key = (Team, owner.team_id) if owner.team_id is not None else (User, owner.user_id) if lookup_key not in new_owners: owner.delete() else: keeping_owners.add(lookup_key) new_group_owners = [] for key in new_owners: if key not in keeping_owners: owner_type, owner_id = key user_id = None team_id = None if owner_type is User: user_id = owner_id if owner_type is Team: team_id = owner_id new_group_owners.append( GroupOwner( group=group, type=GroupOwnerType.OWNERSHIP_RULE.value, user_id=user_id, team_id=team_id, project=project, organization=project.organization, ) ) if new_group_owners: GroupOwner.objects.bulk_create(new_group_owners)