Add organization collaborators API endpoint
Adds an API endpoint, `/v1/organization/<orgname>/collaborators`, that lists an organization's "outside collaborators", i.e. users that have direct permissions on one or more repositories belonging to the organization, but who aren't members of any teams in the organization.
This commit is contained in:
parent
32a473d23c
commit
e8429f9194
3 changed files with 76 additions and 1 deletions
|
@ -262,6 +262,55 @@ class OrgPrivateRepositories(ApiResource):
|
|||
raise Unauthorized()
|
||||
|
||||
|
||||
@resource('/v1/organization/<orgname>/collaborators')
|
||||
@path_param('orgname', 'The name of the organization')
|
||||
class OrganizationCollaboratorList(ApiResource):
|
||||
""" Resource for listing outside collaborators of an organization.
|
||||
|
||||
Collaborators are users that do not belong to any team in the
|
||||
organiztion, but who have direct permissions on one or more
|
||||
repositories belonging to the organization.
|
||||
"""
|
||||
|
||||
@require_scope(scopes.ORG_ADMIN)
|
||||
@nickname('getOrganizationCollaborators')
|
||||
def get(self, orgname):
|
||||
""" List outside collaborators of the specified organization. """
|
||||
permission = AdministerOrganizationPermission(orgname)
|
||||
if not permission.can():
|
||||
raise Unauthorized()
|
||||
|
||||
try:
|
||||
org = model.organization.get_organization(orgname)
|
||||
except model.InvalidOrganizationException:
|
||||
raise NotFound()
|
||||
|
||||
all_perms = model.permission.list_organization_member_permissions(org)
|
||||
membership = model.team.list_organization_members_by_teams(org)
|
||||
|
||||
org_members = set(m.user.username for m in membership)
|
||||
|
||||
collaborators = {}
|
||||
for perm in all_perms:
|
||||
username = perm.user.username
|
||||
|
||||
# Only interested in non-member permissions.
|
||||
if username in org_members:
|
||||
continue
|
||||
|
||||
if username not in collaborators:
|
||||
collaborators[username] = {
|
||||
'kind': 'user',
|
||||
'name': username,
|
||||
'avatar': avatar.get_data_for_user(perm.user),
|
||||
'repositories': [],
|
||||
}
|
||||
|
||||
collaborators[username]['repositories'].append(perm.repository.name)
|
||||
|
||||
return {'collaborators': collaborators.values()}
|
||||
|
||||
|
||||
@resource('/v1/organization/<orgname>/members')
|
||||
@path_param('orgname', 'The name of the organization')
|
||||
class OrganizationMemberList(ApiResource):
|
||||
|
|
Reference in a new issue