diff --git a/tableauserverclient/models/user_item.py b/tableauserverclient/models/user_item.py index 9be38210f..b5a05b0d1 100644 --- a/tableauserverclient/models/user_item.py +++ b/tableauserverclient/models/user_item.py @@ -43,6 +43,7 @@ def __init__(self, name=None, site_role=None, auth_setting=None): self._last_login = None self._workbooks = None self._favorites = None + self._groups = None self.email = None self.fullname = None self.name = name @@ -107,12 +108,22 @@ def favorites(self): raise UnpopulatedPropertyError(error) return self._favorites + @property + def groups(self): + if self._groups is None: + error = "User item must be populated with groups first." + raise UnpopulatedPropertyError(error) + return self._groups() + def to_reference(self): return ResourceReference(id_=self.id, tag_name=self.tag_name) def _set_workbooks(self, workbooks): self._workbooks = workbooks + def _set_groups(self, groups): + self._groups = groups + def _parse_common_tags(self, user_xml, ns): if not isinstance(user_xml, ET.Element): user_xml = ET.fromstring(user_xml).find('.//t:user', namespaces=ns) diff --git a/tableauserverclient/server/endpoint/users_endpoint.py b/tableauserverclient/server/endpoint/users_endpoint.py index 5d3c69b26..17e12a8b1 100644 --- a/tableauserverclient/server/endpoint/users_endpoint.py +++ b/tableauserverclient/server/endpoint/users_endpoint.py @@ -1,6 +1,6 @@ from .endpoint import QuerysetEndpoint, api from .exceptions import MissingRequiredFieldError -from .. import RequestFactory, RequestOptions, UserItem, WorkbookItem, PaginationItem +from .. import RequestFactory, RequestOptions, UserItem, WorkbookItem, PaginationItem, GroupItem from ..pager import Pager import copy @@ -96,3 +96,23 @@ def _get_wbs_for_user(self, user_item, req_options=None): def populate_favorites(self, user_item): self.parent_srv.favorites.get(user_item) + + # Get groups for user + @api(version="3.7") + def populate_groups(self, user_item, req_options=None): + if not user_item.id: + error = "User item missing ID." + raise MissingRequiredFieldError(error) + + def groups_for_user_pager(): + return Pager(lambda options: self._get_groups_for_user(user_item, options), req_options) + + user_item._set_groups(groups_for_user_pager) + + def _get_groups_for_user(self, user_item, req_options=None): + url = "{0}/{1}/groups".format(self.baseurl, user_item.id) + server_response = self.get_request(url, req_options) + logger.info('Populated groups for user (ID: {0})'.format(user_item.id)) + group_item = GroupItem.from_response(server_response.content, self.parent_srv.namespace) + pagination_item = PaginationItem.from_response(server_response.content, self.parent_srv.namespace) + return group_item, pagination_item diff --git a/test/assets/user_populate_groups.xml b/test/assets/user_populate_groups.xml new file mode 100644 index 000000000..567f1dbf8 --- /dev/null +++ b/test/assets/user_populate_groups.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/test_user.py b/test/test_user.py index db0f829f7..e4d1d6717 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -13,6 +13,7 @@ ADD_XML = os.path.join(TEST_ASSET_DIR, 'user_add.xml') POPULATE_WORKBOOKS_XML = os.path.join(TEST_ASSET_DIR, 'user_populate_workbooks.xml') GET_FAVORITES_XML = os.path.join(TEST_ASSET_DIR, 'favorites_get.xml') +POPULATE_GROUPS_XML = os.path.join(TEST_ASSET_DIR, 'user_populate_groups.xml') class UserTests(unittest.TestCase): @@ -175,3 +176,29 @@ def test_populate_favorites(self): self.assertEqual(view.id, 'd79634e1-6063-4ec9-95ff-50acbf609ff5') self.assertEqual(datasource.id, 'e76a1461-3b1d-4588-bf1b-17551a879ad9') self.assertEqual(project.id, '1d0304cd-3796-429f-b815-7258370b9b74') + + def test_populate_groups(self): + self.server.version = '3.7' + with open(POPULATE_GROUPS_XML, 'rb') as f: + response_xml = f.read().decode('utf-8') + with requests_mock.mock() as m: + m.get(self.server.users.baseurl + '/dd2239f6-ddf1-4107-981a-4cf94e415794/groups', + text=response_xml) + single_user = TSC.UserItem('test', 'Interactor') + single_user._id = 'dd2239f6-ddf1-4107-981a-4cf94e415794' + self.server.users.populate_groups(single_user) + + group_list = list(single_user.groups) + + self.assertEqual(3, len(group_list)) + self.assertEqual('ef8b19c0-43b6-11e6-af50-63f5805dbe3c', group_list[0].id) + self.assertEqual('All Users', group_list[0].name) + self.assertEqual('local', group_list[0].domain_name) + + self.assertEqual('e7833b48-c6f7-47b5-a2a7-36e7dd232758', group_list[1].id) + self.assertEqual('Another group', group_list[1].name) + self.assertEqual('local', group_list[1].domain_name) + + self.assertEqual('86a66d40-f289-472a-83d0-927b0f954dc8', group_list[2].id) + self.assertEqual('TableauExample', group_list[2].name) + self.assertEqual('local', group_list[2].domain_name)