Skip to content

Commit d4b7a1e

Browse files
author
Charles Larivier
committed
feat: add PermissionMembership
1 parent 6d7c511 commit d4b7a1e

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from __future__ import annotations
2+
3+
from typing import List
4+
5+
from requests import HTTPError
6+
7+
from resource import CreateResource, DeleteResource, GetResource, ListResource, UpdateResource
8+
9+
10+
class PermissionMembership(ListResource, CreateResource, DeleteResource):
11+
ENDPOINT = "/api/permissions/membership"
12+
PRIMARY_KEY = "membership_id"
13+
14+
membership_id: int
15+
group_id: int
16+
user_id: int
17+
18+
# TODO: allow for bulk updates through /api/permissions/membership/graph
19+
20+
@classmethod
21+
def list(cls) -> List[PermissionMembership]:
22+
response = cls.connection().get(cls.ENDPOINT)
23+
all_memberships = [item for sublist in response.json().values() for item in sublist]
24+
records = [cls(**record) for record in all_memberships]
25+
return records
26+
27+
@classmethod
28+
def create(cls, group_id: int, user_id: int, **kwargs) -> PermissionMembership:
29+
response = cls.connection().post(cls.ENDPOINT, json={"group_id": group_id, "user_id": user_id})
30+
31+
if response.status_code != 200:
32+
raise HTTPError(response.content.decode())
33+
34+
# metabase returns a list of all memberships for the given group_id
35+
membership = next(filter(lambda x: x["user_id"] == user_id, response.json()))
36+
37+
return cls(**membership)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from exceptions import NotFoundError
2+
from metabase import PermissionGroup, PermissionMembership
3+
4+
from tests.helpers import IntegrationTestCase
5+
6+
7+
class PermissionMembershipTests(IntegrationTestCase):
8+
def tearDown(self) -> None:
9+
memberships = PermissionMembership.list()
10+
for membership in memberships:
11+
if membership.membership_id not in (1, 2):
12+
# can't delete default memberships
13+
membership.delete()
14+
15+
groups = PermissionGroup.list()
16+
for group in groups:
17+
if group.id not in (1, 2):
18+
# can't delete default groups
19+
group.delete()
20+
21+
def test_list(self):
22+
"""Ensure PermissionMembership.list returns a list of PermissionMembership instances."""
23+
memberships = PermissionMembership.list()
24+
25+
self.assertIsInstance(memberships, list)
26+
self.assertEqual(2, len(memberships)) # there are 2 default groups in Metabase
27+
self.assertTrue(all([isinstance(m, PermissionMembership) for m in memberships]))
28+
29+
def test_create(self):
30+
"""Ensure PermissionMembership.create creates a Metric in Metabase and returns a PermissionMembership instance."""
31+
group = PermissionGroup.create(name="My Group")
32+
membership = PermissionMembership.create(
33+
group_id=group.id, user_id=1
34+
)
35+
36+
self.assertIsInstance(membership, PermissionMembership)
37+
self.assertEqual(1, membership.user_id)
38+
39+
def test_delete(self):
40+
"""Ensure PermissionMembership.delete deletes a PermissionMembership in Metabase."""
41+
# fixture
42+
group = PermissionGroup.create(name="My Group")
43+
membership = PermissionMembership.create(
44+
group_id=group.id, user_id=1
45+
)
46+
self.assertIsInstance(membership, PermissionMembership)
47+
self.assertTrue(membership.membership_id in [m.membership_id for m in PermissionMembership.list()])
48+
49+
membership.delete()
50+
51+
self.assertFalse(membership.membership_id in [m.membership_id for m in PermissionMembership.list()])

0 commit comments

Comments
 (0)