Skip to content

Commit d4cf0e9

Browse files
committed
use asynchronous lookup of team roles in User.get_teams()
1 parent 723d480 commit d4cf0e9

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

  • validation_service_api/validation_service

validation_service_api/validation_service/auth.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ def get_identity(self):
110110
self.username = username
111111
return self._identity
112112

113+
async def _has_role(self, role, collab_name, client):
114+
roles_url = f"{settings.EBRAINS_IDM_API_URL}/teams/{collab_name}/{role}/users"
115+
headers = {"Authorization": f"Bearer {self.token.credentials}"}
116+
res = await client.get(roles_url, headers=headers,
117+
timeout=settings.AUTHENTICATION_TIMEOUT)
118+
res.raise_for_status() # do we want to raise an exception, or just log an error?
119+
# for robustness, perhaps just log
120+
for user in res.json():
121+
if self.username == user["username"]:
122+
print(collab_name)
123+
return True
124+
return False
125+
113126
async def get_teams(self):
114127
if self._teams is None:
115128
identity = self.get_identity()
@@ -129,20 +142,14 @@ async def get_teams(self):
129142
)
130143
)
131144
for role in ("administrator", "editor"):
132-
for collab_name in collab_names.copy():
133-
roles_url = f"{settings.EBRAINS_IDM_API_URL}/teams/{collab_name}/{role}/users"
134145
# todo: get groups as well and check for group membership
135146
async with AsyncClient() as client:
136-
res2 = await client.get(roles_url, headers=headers,
137-
timeout=settings.AUTHENTICATION_TIMEOUT)
138-
res2.raise_for_status() # do we want to raise an exception, or just log an error?
139-
# for robustness, perhaps just log
140-
for user in res2.json():
141-
if self.username == user["username"]:
147+
found = await asyncio.gather(*[self._has_role(role, collab_name, client) for collab_name in collab_names])
148+
for include, collab_name in zip(found, collab_names.copy()):
149+
if include:
142150
self._teams.append(f"collab-{collab_name}-{role}")
143151
collab_names.discard(collab_name)
144-
print(collab_name)
145-
break
152+
146153
# we assume user must have viewer permissions for any collab still in collab_names
147154
for collab_name in collab_names:
148155
self._teams.append(f"collab-{collab_name}-viewer")

0 commit comments

Comments
 (0)