Skip to content

Commit a0b402b

Browse files
Replace get_organization_members with GraphQL implementation
1 parent dfd506b commit a0b402b

File tree

1 file changed

+30
-20
lines changed

1 file changed

+30
-20
lines changed

main.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -699,29 +699,39 @@ def get_organization(self, org: str) -> Organization:
699699
)
700700

701701
def get_organization_members(self, org: str) -> Iterable[OrganizationMember]:
702-
# Collect the members into a list first, so we can show an accurate
703-
# progress meter later.
704-
members = list(self._http_get_json_paginated(f"/orgs/{org}/members"))
705-
for i, member in enumerate(members):
706-
username: str = member["login"]
707-
print_status_stderr(
708-
f"[{i + 1} / {len(members)}] Retrieving membership: {username}",
709-
)
710-
membership: Dict[str, Any] = self._http_get_json(
711-
f"/orgs/{org}/memberships/{username}"
712-
)
702+
query = """
703+
query($org: String!) {
704+
organization(login: $org) {
705+
membersWithRole(first:100) {
706+
edges {
707+
node {
708+
login
709+
databaseId
710+
}
711+
role
712+
}
713+
pageInfo {
714+
hasNextPage
715+
}
716+
}
717+
}
718+
}
719+
"""
720+
variables = { "org": org }
721+
response = self._http_graphql(query, variables)
722+
723+
members_with_role = response['organization']['membersWithRole']
724+
# TODO: Support more than 100 team members
725+
assert(members_with_role['pageInfo']['hasNextPage'] == False)
726+
727+
for edge in members_with_role['edges']:
728+
node = edge['node']
713729
yield OrganizationMember(
714-
user_name=username,
715-
user_id=member["id"],
716-
role=OrganizationRole(membership["role"]),
730+
user_name=node['login'],
731+
user_id=node['databaseId'],
732+
role=OrganizationRole(edge['role'].lower()),
717733
)
718734

719-
# After the final status update, clear the line again, so the final
720-
# output is not mixed with status updates. (They go separately to stdout
721-
# and stderr anyway, but in a terminal you don’t want interleaved
722-
# output.)
723-
print_status_stderr("")
724-
725735
def get_organization_teams(self, org: str) -> Iterable[Team]:
726736
teams = self._http_get_json_paginated(f"/orgs/{org}/teams")
727737
for team in teams:

0 commit comments

Comments
 (0)