8000 Add support for getting groups that a user belongs to (#799) · jorwoods/server-client-python@9179637 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9179637

Browse files
authored
Add support for getting groups that a user belongs to (tableau#799)
* Add support for getting groups that a user belongs to * Use more descriptive name for pager function
1 parent fe992ee commit 9179637

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

tableauserverclient/models/user_item.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def __init__(self, name=None, site_role=None, auth_setting=None):
4343
self._last_login = None
4444
self._workbooks = None
4545
self._favorites = None
46+
self._groups = None
4647
self.email = None
4748
self.fullname = None
4849
self.name = name
@@ -107,12 +108,22 @@ def favorites(self):
107108
raise UnpopulatedPropertyError(error)
108109
return self._favorites
109110

111+
@property
112+
def groups(self):
113+
if self._groups is None:
114+
error = "User item must be populated with groups first."
115+
raise UnpopulatedPropertyError(error)
116+
return self._groups()
117+
110118
def to_reference(self):
111119
return ResourceReference(id_=self.id, tag_name=self.tag_name)
112120

113121
def _set_workbooks(self, workbooks):
114122
self._workbooks = workbooks
115123

124+
def _set_groups(self, groups):
125+
self._groups = groups
126+
116127
def _parse_common_tags(self, user_xml, ns):
117128
if not isinstance(user_xml, ET.Element):
118129
user_xml = ET.fromstring(user_xml).find('.//t:user', namespaces=ns)

tableauserverclient/server/endpoint/users_endpoint.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .endpoint import QuerysetEndpoint, api
22
from .exceptions import MissingRequiredFieldError
3-
from .. import RequestFactory, RequestOptions, UserItem, WorkbookItem, PaginationItem
3+
from .. import RequestFactory, RequestOptions, UserItem, WorkbookItem, PaginationItem, GroupItem
44
from ..pager import Pager
55

66
import copy
@@ -96,3 +96,23 @@ def _get_wbs_for_user(self, user_item, req_options=None):
9696

9797
def populate_favorites(self, user_item):
9898
self.parent_srv.favorites.get(user_item)
99+
100+
# Get groups for user
101+
@api(version="3.7")
102+
def populate_groups(self, user_item, req_options=None):
103+
if not user_item.id:
104+
error = "User item missing ID."
105+
raise MissingRequiredFieldError(error)
106+
107+
def groups_for_user_pager():
108+
return Pager(lambda options: self._get_groups_for_user(user_item, options), req_options)
109+
110+
user_item._set_groups(groups_for_user_pager)
111+
112+
def _get_groups_for_user(self, user_item, req_options=None):
113+
url = "{0}/{1}/groups".format(self.baseurl, user_item.id)
114+
server_response = self.get_request(url, req_options)
115+
logger.info('Populated groups for user (ID: {0})'.format(user_item.id))
116+
group_item = GroupItem.from_response(server_response.content, self.parent_srv.namespace)
117+
pagination_item = PaginationItem.from_response(server_response.content, self.parent_srv.namespace)
118+
return group_item, pagination_item

test/assets/user_populate_groups.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-3.7.xsd">
3+
<pagination pageNumber="1" pageSize="100" totalAvailable="3" />
4+
<groups>
5+
<group id="ef8b19c0-43b6-11e6-af50-63f5805dbe3c" name="All Users">
6+
<domain name="local" />
7+
</group>
8+
<group id="e7833b48-c6f7-47b5-a2a7-36e7dd232758" name="Another group">
9+
<domain name="local" />
10+
</group>
11+
<group id="86a66d40-f289-472a-83d0-927b0f954dc8" name="TableauExample">
12+
<domain name="local" />
13+
</group>
14+
</groups>
15+
</tsResponse>

test/test_user.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
ADD_XML = os.path.join(TEST_ASSET_DIR, 'user_add.xml')
1414
POPULATE_WORKBOOKS_XML = os.path.join(TEST_ASSET_DIR, 'user_populate_workbooks.xml')
1515
GET_FAVORITES_XML = os.path.join(TEST_ASSET_DIR, 'favorites_get.xml')
16+
POPULATE_GROUPS_XML = os.path.join(TEST_ASSET_DIR, 'user_populate_groups.xml')
1617

1718

1819
class UserTests(unittest.TestCase):
@@ -175,3 +176,29 @@ def test_populate_favorites(self):
175176
self.assertEqual(view.id, 'd79634e1-6063-4ec9-95ff-50acbf609ff5')
176177
self.assertEqual(datasource.id, 'e76a1461-3b1d-4588-bf1b-17551a879ad9')
177178
self.assertEqual(project.id, '1d0304cd-3796-429f-b815-7258370b9b74')
179+
180+
def test_populate_groups(self):
181+
self.server.version = '3.7'
182+
with open(POPULATE_GROUPS_XML, 'rb') as f:
183+
response_xml = f.read().decode('utf-8')
184+
with requests_mock.mock() as m:
185+
m.get(self.server.users.baseurl + '/dd2239f6-ddf1-4107-981a-4cf94e415794/groups',
186+
text=response_xml)
187+
single_user = TSC.UserItem('test', 'Interactor')
188+
single_user._id = 'dd2239f6-ddf1-4107-981a-4cf94e415794'
189+
self.server.users.populate_groups(single_user)
190+
191+
group_list = list(single_user.groups)
192+
193+
self.assertEqual(3, len(group_list))
194+
self.assertEqual('ef8b19c0-43b6-11e6-af50-63f5805dbe3c', group_list[0].id)
195+
self.assertEqual('All Users', group_list[0].name)
196+
self.assertEqual('local', group_list[0].domain_name)
197+
198+
self.assertEqual('e7833b48-c6f7-47b5-a2a7-36e7dd232758', group_list[1].id)
199+
self.assertEqual('Another group', group_list[1].name)
200+
self.assertEqual('local', group_list[1].domain_name)
201+
202+
self.assertEqual('86a66d40-f289-472a-83d0-927b0f954dc8', group_list[2].id)
203+
self.assertEqual('TableauExample', group_list[2].name)
204+
self.assertEqual('local', group_list[2].domain_name)

0 commit comments

Comments
 (0)
0