Skip to content

Commit 01f41e7

Browse files
committed
Add Connection Credentials
Allow users to add connection credentials to Datasources and workbook publish requests. Should work for smaller requests and chunked requests
1 parent f140f8a commit 01f41e7

File tree

6 files changed

+35
-17
lines changed

6 files changed

+35
-17
lines changed

tableauserverclient/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .namespace import NAMESPACE
2-
from .models import ConnectionItem, DatasourceItem,\
2+
from .models import ConnectionCredentials, ConnectionItem, DatasourceItem,\
33
GroupItem, PaginationItem, ProjectItem, \
44
SiteItem, TableauAuth, UserItem, ViewItem, WorkbookItem, UnpopulatedPropertyError
55
from .server import RequestOptions, Filter, Sort, Server, ServerResponseError,\

tableauserverclient/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from .connection_credentials import ConnectionCredentials
12
from .connection_item import ConnectionItem
23
from .datasource_item import DatasourceItem
34
from .exceptions import UnpopulatedPropertyError
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ConnectionCredentials(object):
2+
def __init__(self, name, password, embed=True):
3+
self.password = password
4+
self.embed = embed
5+
self.name = name

tableauserverclient/server/endpoint/datasources_endpoint.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def update(self, datasource_item):
9494
return updated_datasource._parse_common_tags(server_response.content)
9595

9696
# Publish datasource
97-
def publish(self, datasource_item, file_path, mode):
97+
def publish(self, datasource_item, file_path, mode, connection_credentials=None):
9898
if not os.path.isfile(file_path):
9999
error = "File path does not lead to an existing file."
100100
raise IOError(error)
@@ -122,14 +122,15 @@ def publish(self, datasource_item, file_path, mode):
122122
logger.info('Publishing {0} to server with chunking method (datasource over 64MB)'.format(filename))
123123
upload_session_id = Fileuploads.upload_chunks(self.parent_srv, file_path)
124124
url = "{0}&uploadSessionId={1}".format(url, upload_session_id)
125-
xml_request, content_type = RequestFactory.Datasource.publish_req_chunked(datasource_item)
125+
xml_request, content_type = RequestFactory.Datasource.publish_req_chunked(datasource_item, connection_credentials)
126126
else:
127127
logger.info('Publishing {0} to server'.format(filename))
128128
with open(file_path, 'rb') as f:
129129
file_contents = f.read()
130130
xml_request, content_type = RequestFactory.Datasource.publish_req(datasource_item,
131131
filename,
132-
file_contents)
132+
file_contents,
133+
connection_credentials)
133134
server_response = self.post_request(url, xml_request, content_type)
134135
new_datasource = DatasourceItem.from_response(server_response.content)[0]
135136
logger.info('Published {0} (ID: {1})'.format(filename, new_datasource.id))

tableauserverclient/server/endpoint/workbooks_endpoint.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def populate_preview_image(self, workbook_item):
140140
logger.info('Populated preview image for workbook (ID: {0})'.format(workbook_item.id))
141141

142142
# Publishes workbook. Chunking method if file over 64MB
143-
def publish(self, workbook_item, file_path, mode):
143+
def publish(self, workbook_item, file_path, mode, connection_credentials=None):
144144
if not os.path.isfile(file_path):
145145
error = "File path does not lead to an existing file."
146146
raise IOError(error)
@@ -171,14 +171,15 @@ def publish(self, workbook_item, file_path, mode):
171171
logger.info('Publishing {0} to server with chunking method (workbook over 64MB)'.format(filename))
172172
upload_session_id = Fileuploads.upload_chunks(self.parent_srv, file_path)
173173
url = "{0}&uploadSessionId={1}".format(url, upload_session_id)
174-
xml_request, content_type = RequestFactory.Workbook.publish_req_chunked(workbook_item)
174+
xml_request, content_type = RequestFactory.Workbook.publish_req_chunked(workbook_item, connection_credentials)
175175
else:
176176
logger.info('Publishing {0} to server'.format(filename))
177177
with open(file_path, 'rb') as f:
178178
file_contents = f.read()
179179
xml_request, content_type = RequestFactory.Workbook.publish_req(workbook_item,
180180
filename,
181-
file_contents)
181+
file_contents,
182+
connection_credentials)
182183
server_response = self.post_request(url, xml_request, content_type)
183184
new_workbook = WorkbookItem.from_response(server_response.content)[0]
184185
logger.info('Published {0} (ID: {1})'.format(filename, new_workbook.id))

tableauserverclient/server/request_factory.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ def signin_req(self, auth_item):
3030

3131

3232
class DatasourceRequest(object):
33-
def _generate_xml(self, datasource_item):
33+
def _generate_xml(self, datasource_item, connection_credentials=None):
3434
xml_request = ET.Element('tsRequest')
3535
datasource_element = ET.SubElement(xml_request, 'datasource')
3636
datasource_element.attrib['name'] = datasource_item.name
3737
project_element = ET.SubElement(datasource_element, 'project')
3838
project_element.attrib['id'] = datasource_item.project_id
39+
if connection_credentials:
40+
credentials_element = ET.SubElement(datasource_element,'connectionCredentials')
41+
credentials_element.attrib['name'] = connection_credentials.name
42+
credentials_element.attrib['password'] = connection_credentials.password
43+
credentials_element.attrib['embed'] = str(connection_credentials.embed).lower()
3944
return ET.tostring(xml_request)
4045

4146
def update_req(self, datasource_item):
@@ -49,15 +54,15 @@ def update_req(self, datasource_item):
4954
owner_element.attrib['id'] = datasource_item.owner_id
5055
return ET.tostring(xml_request)
5156

52-
def publish_req(self, datasource_item, filename, file_contents):
53-
xml_request = self._generate_xml(datasource_item)
57+
def publish_req(self, datasource_item, filename, file_contents, connection_credentials=None):
58+
xml_request = self._generate_xml(datasource_item, connection_credentials)
5459

5560
parts = {'request_payload': ('', xml_request, 'text/xml'),
5661
'tableau_datasource': (filename, file_contents, 'application/octet-stream')}
5762
return _add_multipart(parts)
5863

59-
def publish_req_chunked(self, datasource_item):
60-
xml_request = self._generate_xml(datasource_item)
64+
def publish_req_chunked(self, datasource_item, connection_credentials=None):
65+
xml_request = self._generate_xml(datasource_item, connection_credentials)
6166

6267
parts = {'request_payload': ('', xml_request, 'text/xml')}
6368
return _add_multipart(parts)
@@ -205,14 +210,19 @@ def add_req(self, user_item):
205210

206211

207212
class WorkbookRequest(object):
208-
def _generate_xml(self, workbook_item):
213+
def _generate_xml(self, workbook_item,connection_credentials=None):
209214
xml_request = ET.Element('tsRequest')
210215
workbook_element = ET.SubElement(xml_request, 'workbook')
211216
workbook_element.attrib['name'] = workbook_item.name
212217
if workbook_item.show_tabs:
213218
workbook_element.attrib['showTabs'] = str(workbook_item.show_tabs).lower()
214219
project_element = ET.SubElement(workbook_element, 'project')
215220
project_element.attrib['id'] = workbook_item.project_id
221+
if connection_credentials:
222+
credentials_element = ET.SubElement(workbook_element,'connectionCredentials')
223+
credentials_element.attrib['name'] = connection_credentials.name
224+
credentials_element.attrib['password'] = connection_credentials.password
225+
credentials_element.attrib['embed'] = str(connection_credentials.embed).lower()
216226
return ET.tostring(xml_request)
217227

218228
def update_req(self, workbook_item):
@@ -228,15 +238,15 @@ def update_req(self, workbook_item):
228238
owner_element.attrib['id'] = workbook_item.owner_id
229239
return ET.tostring(xml_request)
230240

231-
def publish_req(self, workbook_item, filename, file_contents):
232-
xml_request = self._generate_xml(workbook_item)
241+
def publish_req(self, workbook_item, filename, file_contents, connection_credentials=None):
242+
xml_request = self._generate_xml(workbook_item, connection_credentials)
233243

234244
parts = {'request_payload': ('', xml_request, 'text/xml'),
235245
'tableau_workbook': (filename, file_contents, 'application/octet-stream')}
236246
return _add_multipart(parts)
237247

238-
def publish_req_chunked(self, workbook_item):
239-
xml_request = self._generate_xml(workbook_item)
248+
def publish_req_chunked(self, workbook_item, connection_credentials=None):
249+
xml_request = self._generate_xml(workbook_item, connection_credentials)
240250

241251
parts = {'request_payload': ('', xml_request, 'text/xml')}
242252
return _add_multipart(parts)

0 commit comments

Comments
 (0)