Skip to content

Commit 4570c49

Browse files
committed
Added multi role filter for list role assignments
1 parent 187d80c commit 4570c49

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

permit/api/role_assignments.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Optional
1+
from typing import List, Optional, Union
22

33
from ..utils.pydantic_version import PYDANTIC_VERSION
44

@@ -44,7 +44,7 @@ def __role_assignments(self) -> SimpleHttpClient:
4444
async def list(
4545
self,
4646
user_key: Optional[str] = None,
47-
role_key: Optional[str] = None,
47+
role_key: Optional[Union[str, List[str]]] = None,
4848
tenant_key: Optional[str] = None,
4949
resource_instance_key: Optional[str] = None,
5050
page: int = 1,
@@ -68,15 +68,19 @@ async def list(
6868
PermitApiError: If the API returns an error HTTP status code.
6969
PermitContextError: If the configured ApiContext does not match the required endpoint context.
7070
"""
71-
params = pagination_params(page, per_page)
71+
params = list(pagination_params(page, per_page).items())
7272
if user_key is not None:
73-
params.update(dict(user=user_key))
73+
params.append(("user", user_key))
7474
if role_key is not None:
75-
params.update(dict(role=role_key))
75+
if isinstance(role_key, list):
76+
for role in role_key:
77+
params.append(("role", role))
78+
else:
79+
params.append(("role", role_key))
7680
if tenant_key is not None:
77-
params.update(dict(tenant=tenant_key))
81+
params.append(("tenant", tenant_key))
7882
if resource_instance_key is not None:
79-
params.update(dict(resource_instance=resource_instance_key))
83+
params.append(("resource_instance", resource_instance_key))
8084
return await self.__role_assignments.get(
8185
"",
8286
model=List[RoleAssignmentRead],
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from contextlib import contextmanager
2+
3+
from permit import Permit, PermitApiError, RoleAssignmentCreate, RoleCreate, UserCreate
4+
5+
6+
@contextmanager
7+
def suppress_409():
8+
try:
9+
yield
10+
except PermitApiError as e:
11+
if e.status_code != 409:
12+
raise e
13+
14+
15+
async def create_role_assignments(permit: Permit, role_key: str, user_count: int = 10):
16+
with suppress_409():
17+
await permit.api.roles.create(RoleCreate(key=role_key, name=role_key))
18+
with suppress_409():
19+
await permit.api.users.bulk_create(
20+
[UserCreate(key=f"user-{index}") for index in range(user_count)]
21+
)
22+
with suppress_409():
23+
await permit.api.role_assignments.bulk_assign(
24+
[
25+
RoleAssignmentCreate(
26+
role=role_key, user=f"user-{index}", tenant="default"
27+
)
28+
for index in range(user_count)
29+
]
30+
)
31+
32+
33+
async def test_list_filter_by_role(permit: Permit):
34+
await create_role_assignments(permit, "role-1")
35+
await create_role_assignments(permit, "role-2")
36+
role_assignments = await permit.api.role_assignments.list(role_key="role-1")
37+
assert len(role_assignments) == 10
38+
assert {ra.role for ra in role_assignments} == {"role-1"}
39+
40+
41+
async def test_list_filter_by_role_multiple(permit: Permit):
42+
await create_role_assignments(permit, "role-1")
43+
await create_role_assignments(permit, "role-2")
44+
await create_role_assignments(permit, "role-3")
45+
role_assignments = await permit.api.role_assignments.list(
46+
role_key=["role-1", "role-2"]
47+
)
48+
assert len(role_assignments) == 20
49+
assert {ra.role for ra in role_assignments} == {"role-1", "role-2"}

0 commit comments

Comments
 (0)