From 125473eb8558226139dd9d567ad97f365930d8a9 Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Sun, 20 Apr 2025 12:00:41 -0500 Subject: [PATCH 1/3] feat: enable retrieving only owned workbooks --- .../server/endpoint/users_endpoint.py | 27 +++++++++++++++---- test/test_user.py | 17 ++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/tableauserverclient/server/endpoint/users_endpoint.py b/tableauserverclient/server/endpoint/users_endpoint.py index d81907ae9..d096fcb3b 100644 --- a/tableauserverclient/server/endpoint/users_endpoint.py +++ b/tableauserverclient/server/endpoint/users_endpoint.py @@ -381,10 +381,15 @@ def create_from_file(self, filepath: str) -> tuple[list[UserItem], list[tuple[Us # Get workbooks for user @api(version="2.0") - def populate_workbooks(self, user_item: UserItem, req_options: Optional[RequestOptions] = None) -> None: + def populate_workbooks( + self, user_item: UserItem, req_options: Optional[RequestOptions] = None, owned_only: bool = False + ) -> None: """ Returns information about the workbooks that the specified user owns - and has Read (view) permissions for. + or has Read (view) permissions for. If owned_only is set to True, + only the workbooks that the user owns are returned. If owned_only is + set to False, all workbooks that the user has Read (view) permissions + for are returned. This method retrieves the workbook information for the specified user. The REST API is designed to return only the information you ask for @@ -402,6 +407,10 @@ def populate_workbooks(self, user_item: UserItem, req_options: Optional[RequestO req_options : Optional[RequestOptions] Optional request options to filter and sort the results. + owned_only : bool, default=False + If True, only the workbooks that the user owns are returned. + If False, all workbooks that the user has Read (view) permissions + Returns ------- None @@ -422,15 +431,23 @@ def populate_workbooks(self, user_item: UserItem, req_options: Optional[RequestO error = "User item missing ID." raise MissingRequiredFieldError(error) - def wb_pager(): - return Pager(lambda options: self._get_wbs_for_user(user_item, options), req_options) + def wb_pager() -> Pager[WorkbookItem]: + def func(req_options: Optional[RequestOptions]) -> tuple[list[WorkbookItem], PaginationItem]: + return self._get_wbs_for_user(user_item, req_options, owned_only=owned_only) + + return Pager(func, req_options) user_item._set_workbooks(wb_pager) def _get_wbs_for_user( - self, user_item: UserItem, req_options: Optional[RequestOptions] = None + self, + user_item: UserItem, + req_options: Optional[RequestOptions] = None, + owned_only: bool = False, ) -> tuple[list[WorkbookItem], PaginationItem]: url = f"{self.baseurl}/{user_item.id}/workbooks" + if owned_only: + url += "?ownedBy=true" server_response = self.get_request(url, req_options) logger.info(f"Populated workbooks for user (ID: {user_item.id})") workbook_item = WorkbookItem.from_response(server_response.content, self.parent_srv.namespace) diff --git a/test/test_user.py b/test/test_user.py index a46624845..0a2953394 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -162,6 +162,23 @@ def test_populate_workbooks(self) -> None: self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", workbook_list[0].owner_id) self.assertEqual({"Safari", "Sample"}, workbook_list[0].tags) + def test_populate_owned_workbooks(self) -> None: + with open(POPULATE_WORKBOOKS_XML, "rb") as f: + response_xml = f.read().decode("utf-8") + # Query parameter ownedBy is case sensitive. + with requests_mock.mock(case_sensitive=True) as m: + m.get(self.baseurl + "/dd2239f6-ddf1-4107-981a-4cf94e415794/workbooks?ownedBy=true", text=response_xml) + single_user = TSC.UserItem("test", "Interactor") + single_user._id = "dd2239f6-ddf1-4107-981a-4cf94e415794" + self.server.users.populate_workbooks(single_user, owned_only=True) + list(single_user.workbooks) + + request_history = m.request_history[0] + + assert "ownedBy" in request_history.qs, "ownedBy not in request history" + assert "true" in request_history.qs["ownedBy"], "ownedBy not set to true in request history" + + def test_populate_workbooks_missing_id(self) -> None: single_user = TSC.UserItem("test", "Interactor") self.assertRaises(TSC.MissingRequiredFieldError, self.server.users.populate_workbooks, single_user) From 12d518591f45f4a5706339dc51326cd56c458e6e Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Sun, 20 Apr 2025 12:06:48 -0500 Subject: [PATCH 2/3] chore: suppress mypy error --- tableauserverclient/server/endpoint/users_endpoint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tableauserverclient/server/endpoint/users_endpoint.py b/tableauserverclient/server/endpoint/users_endpoint.py index d096fcb3b..75c7bd2ed 100644 --- a/tableauserverclient/server/endpoint/users_endpoint.py +++ b/tableauserverclient/server/endpoint/users_endpoint.py @@ -431,8 +431,8 @@ def populate_workbooks( error = "User item missing ID." raise MissingRequiredFieldError(error) - def wb_pager() -> Pager[WorkbookItem]: - def func(req_options: Optional[RequestOptions]) -> tuple[list[WorkbookItem], PaginationItem]: + def wb_pager(): + def func(req_options): return self._get_wbs_for_user(user_item, req_options, owned_only=owned_only) return Pager(func, req_options) From 569b335cb2a829698d98cb70b18de4fb307a33cd Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Sun, 20 Apr 2025 12:08:04 -0500 Subject: [PATCH 3/3] style: black --- test/test_user.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_user.py b/test/test_user.py index 0a2953394..645adcfd5 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -178,7 +178,6 @@ def test_populate_owned_workbooks(self) -> None: assert "ownedBy" in request_history.qs, "ownedBy not in request history" assert "true" in request_history.qs["ownedBy"], "ownedBy not set to true in request history" - def test_populate_workbooks_missing_id(self) -> None: single_user = TSC.UserItem("test", "Interactor") self.assertRaises(TSC.MissingRequiredFieldError, self.server.users.populate_workbooks, single_user)