示例#1
0
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
示例#2
0
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)