8000 Enable switch site functionality (#655) · tableau/server-client-python@ce078cb · GitHub
[go: up one dir, main page]

Skip to content

Commit ce078cb

Browse files
jorwoodsJordan Woods
and
Jordan Woods
authored
Enable switch site functionality (#655)
* Add switch_site functionality * Add test for site switch * Ignore same site error Co-authored-by: Jordan Woods <Jordan.Woods@mkcorp.com>
1 parent 4a14d39 commit ce078cb

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

tableauserverclient/server/endpoint/auth_endpoint.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from ..request_factory import RequestFactory
2-
2+
from .exceptions import ServerResponseError
33
from .endpoint import Endpoint, api
44
import xml.etree.ElementTree as ET
55
import logging
@@ -52,3 +52,24 @@ def sign_out(self):
5252
self.post_request(url, '')
5353
self.parent_srv._clear_auth()
5454
logger.info('Signed out')
55+
56+
@api(version="2.6")
57+
def switch_site(self, site_item):
58+
url = "{0}/{1}".format(self.baseurl, 'switchSite')
59+
switch_req = RequestFactory.Auth.switch_req(site_item.content_url)
60+
try:
61+
server_response = self.post_request(url, switch_req)
62+
except ServerResponseError as e:
63+
if e.code == "403070":
64+
return Auth.contextmgr(self.sign_out)
65+
else:
66+
raise e
67+
self.parent_srv._namespace.detect(server_response.content)
68+
self._check_status(server_response)
69+
parsed_response = ET.fromstring(server_response.content)
70+
site_id = parsed_response.find('.//t:site', namespaces=self.parent_srv.namespace).get('id', None)
71+
user_id = parsed_response.find('.//t:user', namespaces=self.parent_srv.namespace).get('id', None)
72+
auth_token = parsed_response.find('t:credentials', namespaces=self.parent_srv.namespace).get('token', None)
73+
self.parent_srv._set_auth(site_id, user_id, auth_token)
74+
logger.info('Signed into {0} as user with id {1}'.format(self.parent_srv.server_address, user_id))
75+
return Auth.contextmgr(self.sign_out)

tableauserverclient/server/request_factory.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ def signin_req(self, auth_item):
6767
user_element.attrib['id'] = auth_item.user_id_to_impersonate
6868
return ET.tostring(xml_request)
6969

70+
def switch_req(self, site_content_url):
71+
xml_request = ET.Element('tsRequest')
72+
73+
site_element = ET.SubElement(xml_request, 'site')
74+
site_element.attrib['contentUrl'] = site_content_url
75+
return ET.tostring(xml_request)
76+
7077

7178
class ColumnRequest(object):
7279
def update_req(self, column_item):

test/test_auth.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,19 @@ def test_sign_out(self):
9090
self.assertIsNone(self.server._auth_token)
9191
self.assertIsNone(self.server._site_id)
9292
self.assertIsNone(self.server._user_id)
93+
94+
def test_switch_site(self):
95+
self.server.version = '2.6'
96+
baseurl = self.server.auth.baseurl
97+
site_id, user_id, auth_token = list('123')
98+
self.server._set_auth(site_id, user_id, auth_token)
99+
with open(SIGN_IN_XML, 'rb') as f:
100+
response_xml = f.read().decode('utf-8')
101+
with requests_mock.mock() as m:
102+
m.post(baseurl + '/switchSite', text=response_xml)
103+
site = TSC.SiteItem('Samples', 'Samples')
104+
self.server.auth.switch_site(site)
105+
106+
self.assertEqual('eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l', self.server.auth_token)
107+
self.assertEqual('6b7179ba-b82b-4f0f-91ed-812074ac5da6', self.server.site_id)
108+
self.assertEqual('1a96d216-e9b8-497b-a82a-0b899a965e01', self.server.user_id)

0 commit comments

Comments
 (0)
0