Skip to content

Commit 9826cbf

Browse files
authored
feat: capture site content url from sign in (#1524)
Sign in attempts will return the site's content url in the response. This change parses that as well and includes it on the server object for later reference by the user. Co-authored-by: Jordan Woods <[email protected]>
1 parent a4278e5 commit 9826cbf

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

tableauserverclient/server/endpoint/auth_endpoint.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,10 @@ def sign_in(self, auth_req: "Credentials") -> contextmgr:
8484
self._check_status(server_response, url)
8585
parsed_response = fromstring(server_response.content)
8686
site_id = parsed_response.find(".//t:site", namespaces=self.parent_srv.namespace).get("id", None)
87+
site_url = parsed_response.find(".//t:site", namespaces=self.parent_srv.namespace).get("contentUrl", None)
8788
user_id = parsed_response.find(".//t:user", namespaces=self.parent_srv.namespace).get("id", None)
8889
auth_token = parsed_response.find("t:credentials", namespaces=self.parent_srv.namespace).get("token", None)
89-
self.parent_srv._set_auth(site_id, user_id, auth_token)
90+
self.parent_srv._set_auth(site_id, user_id, auth_token, site_url)
9091
logger.info(f"Signed into {self.parent_srv.server_address} as user with id {user_id}")
9192
return Auth.contextmgr(self.sign_out)
9293

@@ -155,9 +156,10 @@ def switch_site(self, site_item: "SiteItem") -> contextmgr:
155156
self._check_status(server_response, url)
156157
parsed_response = fromstring(server_response.content)
157158
site_id = parsed_response.find(".//t:site", namespaces=self.parent_srv.namespace).get("id", None)
159+
site_url = parsed_response.find(".//t:site", namespaces=self.parent_srv.namespace).get("contentUrl", None)
158160
user_id = parsed_response.find(".//t:user", namespaces=self.parent_srv.namespace).get("id", None)
159161
auth_token = parsed_response.find("t:credentials", namespaces=self.parent_srv.namespace).get("token", None)
160-
self.parent_srv._set_auth(site_id, user_id, auth_token)
162+
self.parent_srv._set_auth(site_id, user_id, auth_token, site_url)
161163
logger.info(f"Signed into {self.parent_srv.server_address} as user with id {user_id}")
162164
return Auth.contextmgr(self.sign_out)
163165

tableauserverclient/server/server.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,14 @@ def _clear_auth(self):
207207
self._site_id = None
208208
self._user_id = None
209209
self._auth_token = None
210+
self._site_url = None
210211
self._session = self._session_factory()
211212

212-
def _set_auth(self, site_id, user_id, auth_token):
213+
def _set_auth(self, site_id, user_id, auth_token, site_url=None):
213214
self._site_id = site_id
214215
self._user_id = user_id
215216
self._auth_token = auth_token
217+
self._site_url = site_url
216218

217219
def _get_legacy_version(self):
218220
# the serverInfo call was introduced in 2.4, earlier than that we have this different call
@@ -282,6 +284,13 @@ def site_id(self):
282284
raise NotSignedInError(error)
283285
return self._site_id
284286

287+
@property
288+
def site_url(self):
289+
if self._site_url is None:
290+
error = "Missing site URL. You must sign in first."
291+
raise NotSignedInError(error)
292+
return self._site_url
293+
285294
@property
286295
def user_id(self):
287296
if self._user_id is None:

test/test_auth.py

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def test_sign_in(self):
2727

2828
self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
2929
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
30+
self.assertEqual("Samples", self.server.site_url)
3031
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)
3132

3233
def test_sign_in_with_personal_access_tokens(self):
@@ -41,6 +42,7 @@ def test_sign_in_with_personal_access_tokens(self):
4142

4243
self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
4344
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
45+
self.assertEqual("Samples", self.server.site_url)
4446
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)
4547

4648
def test_sign_in_impersonate(self):
@@ -93,6 +95,7 @@ def test_sign_out(self):
9395

9496
self.assertIsNone(self.server._auth_token)
9597
self.assertIsNone(self.server._site_id)
98+
self.assertIsNone(self.server._site_url)
9699
self.assertIsNone(self.server._user_id)
97100

98101
def test_switch_site(self):
@@ -109,6 +112,7 @@ def test_switch_site(self):
109112

110113
self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
111114
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
115+
self.assertEqual("Samples", self.server.site_url)
112116
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)
113117

114118
def test_revoke_all_server_admin_tokens(self):
@@ -125,4 +129,5 @@ def test_revoke_all_server_admin_tokens(self):
125129

126130
self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
127131
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
132+
self.assertEqual("Samples", self.server.site_url)
128133
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)

0 commit comments

Comments
 (0)