Skip to content

Commit 8f498f0

Browse files
author
Charles Lariviere
committed
feat: add support for parameters in User.list()
1 parent 9d20578 commit 8f498f0

File tree

2 files changed

+76
-4
lines changed

2 files changed

+76
-4
lines changed

src/metabase/resources/user.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,39 @@ class User(ListResource, CreateResource, GetResource, UpdateResource, DeleteReso
3838
updated_at: datetime
3939

4040
@classmethod
41-
def list(cls, using: Metabase) -> List[User]:
41+
def list(
42+
cls,
43+
using: Metabase,
44+
status: str = None,
45+
query: str = None,
46+
group_id: int = None,
47+
include_deactivated: bool = None,
48+
limit: int = None,
49+
offset: int = None,
50+
) -> List[User]:
4251
"""
4352
Fetch a list of Users. By default returns every active user but only active users.
4453
45-
If status is deactivated, include deactivated users only. If status is all, include all users (active and inactive). Also supports include_deactivated, which if true, is equivalent to status=all. status and included_deactivated requires superuser permissions.
54+
If status is deactivated, include deactivated users only. If status is all, include all users (active and
55+
inactive). Also supports include_deactivated, which if true, is equivalent to status=all. status and
56+
included_deactivated requires superuser permissions.
4657
4758
For users with segmented permissions, return only themselves.
4859
49-
Takes limit, offset for pagination. Takes query for filtering on first name, last name, email. Also takes group_id, which filters on group id.
60+
Takes limit, offset for pagination. Takes query for filtering on first name, last name, email. Also takes
61+
group_id, which filters on group id.
5062
"""
51-
response = using.get(cls.ENDPOINT)
63+
response = using.get(
64+
cls.ENDPOINT,
65+
params={
66+
"status": status,
67+
"query": query,
68+
"group_id": group_id,
69+
"include_deactivated": include_deactivated,
70+
"limit": limit,
71+
"offset": offset,
72+
},
73+
)
5274
records = [
5375
cls(_using=using, **user) for user in response.json().get("data", [])
5476
]

tests/resources/test_user.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from random import randint
22

3+
from metabase import PermissionGroup
34
from metabase.exceptions import NotFoundError
45
from metabase.resources.user import User
56
from tests.helpers import IntegrationTestCase
@@ -12,12 +13,61 @@ def tearDown(self) -> None:
1213
if user.id != 1:
1314
user.delete()
1415

16+
groups = PermissionGroup.list(using=self.metabase)
17+
for group in groups:
18+
if group.id > 2:
19+
group.delete()
20+
1521
def test_import(self):
1622
"""Ensure User can be imported from Metabase."""
1723
from metabase import User
1824

1925
self.assertIsNotNone(User(_using=None))
2026

27+
def test_list(self):
28+
"""Ensure User.list() returns a list of Users, and supports filter parameters."""
29+
users = User.list(using=self.metabase)
30+
self.assertIsInstance(users, list)
31+
self.assertEqual(1, len(users))
32+
33+
user1 = User.create(
34+
first_name="Test",
35+
last_name="Test",
36+
email=f"{randint(2, 10000)}@example.com",
37+
password="example123",
38+
using=self.metabase,
39+
)
40+
group = PermissionGroup.create(using=self.metabase, name="foo")
41+
user2 = User.create(
42+
first_name="Test",
43+
last_name="Test",
44+
email=f"{randint(2, 10000)}@example.com",
45+
password="example123",
46+
group_ids=[1, group.id],
47+
using=self.metabase,
48+
)
49+
50+
users = User.list(using=self.metabase)
51+
self.assertEqual(3, len(users))
52+
53+
users = User.list(using=self.metabase, query=user1.email)
54+
self.assertEqual(1, len(users))
55+
self.assertEqual(users[0].id, user1.id)
56+
57+
users = User.list(using=self.metabase, group_id=group.id)
58+
self.assertEqual(1, len(users))
59+
self.assertEqual(users[0].id, user2.id)
60+
61+
user1.delete()
62+
users = User.list(using=self.metabase, include_deactivated=True)
63+
self.assertTrue(user1.id in map(lambda u: u.id, users))
64+
65+
users = User.list(using=self.metabase, limit=1)
66+
self.assertEqual(1, len(users))
67+
68+
users = User.list(using=self.metabase, limit=2)
69+
self.assertEqual(2, len(users))
70+
2171
def test_get(self):
2272
"""
2373
Ensure User.get() returns a User instance for a given ID, or

0 commit comments

Comments
 (0)