From 6e75e4fa8d1257c127c8de7eba5278241aeac66c Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 12:57:15 -0700 Subject: [PATCH 1/7] Cleaning up the base endpoint object to reduce duplication --- .../server/endpoint/endpoint.py | 77 +++++++++---------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index fd8cb3ac7..6e5e2de8b 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -12,60 +12,55 @@ def __init__(self): self.parent_srv = None @staticmethod - def _check_status(server_response): - if server_response.status_code not in Success_codes: - raise ServerResponseError.from_response(server_response.content) + def _make_headers(token, content_type): + retval = {} + if token is not None: + retval['x-tableau-auth'] = token + if content_type is not None: + retval['content-type'] = content_type - def get_unauthenticated_request(self, url, request_object=None): + def _make_request(self, method, url, content=None, request_object=None, token=None, content_type =None): if request_object is not None: url = request_object.apply_query_params(url) - server_response = self.parent_srv.session.get(url, **self.parent_srv.http_options) + parameters = { } + parameters.update(self.parent_srv.http_options) + parameters['headers'] = Endpoint._make_headers(token, content_type) + + if content is not None: + parameters['data'] = content + + server_response = method(url, **parameters) self._check_status(server_response) if server_response.encoding: logger.debug(u'Server response from {0}:\n\t{1}'.format( url, server_response.content.decode(server_response.encoding))) return server_response + @staticmethod + def _check_status(server_response): + if server_response.status_code not in Success_codes: + raise ServerResponseError.from_response(server_response.content) + + def get_unauthenticated_request(self, url, request_object=None): + return self._make_request(self.parent_srv.session.get, url, request_object=request_object) + def get_request(self, url, request_object=None): - if request_object is not None: - url = request_object.apply_query_params(url) - auth_token = self.parent_srv.auth_token - server_response = self.parent_srv.session.get(url, - headers={'x-tableau-auth': auth_token}, - **self.parent_srv.http_options) - self._check_status(server_response) - if server_response.encoding: - logger.debug(u'Server response from {0}: \n\t{1}'.format( - url, server_response.content.decode(server_response.encoding))) - return server_response + return self._make_request(self.parent_srv.session.get, url, token=self.parent_srv.auth_token, + request_object=request_object) def delete_request(self, url): - auth_token = self.parent_srv.auth_token - server_response = self.parent_srv.session.delete(url, - headers={'x-tableau-auth': auth_token}, - **self.parent_srv.http_options) - self._check_status(server_response) + # We don't return anything for a delete + self._make_request(self.parent_srv.session.delete, url, token=self.parent_srv.auth_token) def put_request(self, url, xml_request, content_type='text/xml'): - auth_token = self.parent_srv.auth_token - server_response = self.parent_srv.session.put(url, data=xml_request, - headers={'x-tableau-auth': auth_token, - 'content-type': content_type}, - **self.parent_srv.http_options) - self._check_status(server_response) - if server_response.encoding: - logger.debug(u'Server response from {0}: \n\t{1}'.format( - url, server_response.content.decode(server_response.encoding))) - return server_response + return self._make_request(self.parent_srv.session.put, url, + content=xml_request, + token=self.parent_srv.auth_token, + content_type = content_type) + def post_request(self, url, xml_request, content_type='text/xml'): - auth_token = self.parent_srv.auth_token - server_response = self.parent_srv.session.post(url, data=xml_request, - headers={'x-tableau-auth': auth_token, - 'content-type': content_type}, - **self.parent_srv.http_options) - self._check_status(server_response) - if server_response.encoding: - logger.debug(u'Server response from {0}: \n\t{1}'.format( - url, server_response.content.decode(server_response.encoding))) - return server_response + return self._make_request(self.parent_srv.session.post, url, + content=xml_request, + token=self.parent_srv.auth_token, + content_type = content_type) From ce600ed3e08eb8172c4528ff8f852a3f57cf9c4c Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 13:00:25 -0700 Subject: [PATCH 2/7] Deduping the ctors for Endpoints --- tableauserverclient/server/endpoint/auth_endpoint.py | 3 +++ tableauserverclient/server/endpoint/datasources_endpoint.py | 4 ---- tableauserverclient/server/endpoint/endpoint.py | 4 ++-- tableauserverclient/server/endpoint/fileuploads_endpoint.py | 3 +-- tableauserverclient/server/endpoint/groups_endpoint.py | 4 ---- tableauserverclient/server/endpoint/projects_endpoint.py | 4 ---- tableauserverclient/server/endpoint/schedules_endpoint.py | 4 ---- tableauserverclient/server/endpoint/server_info_endpoint.py | 4 ---- tableauserverclient/server/endpoint/sites_endpoint.py | 4 ---- tableauserverclient/server/endpoint/users_endpoint.py | 4 ---- tableauserverclient/server/endpoint/views_endpoint.py | 4 ---- tableauserverclient/server/endpoint/workbooks_endpoint.py | 4 ---- 12 files changed, 6 insertions(+), 40 deletions(-) diff --git a/tableauserverclient/server/endpoint/auth_endpoint.py b/tableauserverclient/server/endpoint/auth_endpoint.py index 9e316d042..43c873237 100644 --- a/tableauserverclient/server/endpoint/auth_endpoint.py +++ b/tableauserverclient/server/endpoint/auth_endpoint.py @@ -7,6 +7,9 @@ class Auth(Endpoint): + def __init__(self): + super(Auth, self).__init__(None) + class contextmgr(object): def __init__(self, callback): self._callback = callback diff --git a/tableauserverclient/server/endpoint/datasources_endpoint.py b/tableauserverclient/server/endpoint/datasources_endpoint.py index ecb66724c..e8e4e4bf6 100644 --- a/tableauserverclient/server/endpoint/datasources_endpoint.py +++ b/tableauserverclient/server/endpoint/datasources_endpoint.py @@ -16,10 +16,6 @@ class Datasources(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}/datasources".format(self.parent_srv.baseurl, self.parent_srv.site_id) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index 6e5e2de8b..2a9f5d90e 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -8,8 +8,8 @@ class Endpoint(object): - def __init__(self): - self.parent_srv = None + def __init__(self, parent_srv): + self.parent_srv = parent_srv @staticmethod def _make_headers(token, content_type): diff --git a/tableauserverclient/server/endpoint/fileuploads_endpoint.py b/tableauserverclient/server/endpoint/fileuploads_endpoint.py index 65a3b2526..df26d3db5 100644 --- a/tableauserverclient/server/endpoint/fileuploads_endpoint.py +++ b/tableauserverclient/server/endpoint/fileuploads_endpoint.py @@ -13,8 +13,7 @@ class Fileuploads(Endpoint): def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv + super(Fileuploads, self).__init__(parent_srv) self.upload_id = '' @property diff --git a/tableauserverclient/server/endpoint/groups_endpoint.py b/tableauserverclient/server/endpoint/groups_endpoint.py index a21888695..e1eb2ecfc 100644 --- a/tableauserverclient/server/endpoint/groups_endpoint.py +++ b/tableauserverclient/server/endpoint/groups_endpoint.py @@ -8,10 +8,6 @@ class Groups(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}/groups".format(self.parent_srv.baseurl, self.parent_srv.site_id) diff --git a/tableauserverclient/server/endpoint/projects_endpoint.py b/tableauserverclient/server/endpoint/projects_endpoint.py index 484ee2aff..b146d4418 100644 --- a/tableauserverclient/server/endpoint/projects_endpoint.py +++ b/tableauserverclient/server/endpoint/projects_endpoint.py @@ -8,10 +8,6 @@ class Projects(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}/projects".format(self.parent_srv.baseurl, self.parent_srv.site_id) diff --git a/tableauserverclient/server/endpoint/schedules_endpoint.py b/tableauserverclient/server/endpoint/schedules_endpoint.py index 9b4721941..705f9577b 100644 --- a/tableauserverclient/server/endpoint/schedules_endpoint.py +++ b/tableauserverclient/server/endpoint/schedules_endpoint.py @@ -8,10 +8,6 @@ class Schedules(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/schedules".format(self.parent_srv.baseurl) diff --git a/tableauserverclient/server/endpoint/server_info_endpoint.py b/tableauserverclient/server/endpoint/server_info_endpoint.py index 901778c58..1fb17f26f 100644 --- a/tableauserverclient/server/endpoint/server_info_endpoint.py +++ b/tableauserverclient/server/endpoint/server_info_endpoint.py @@ -6,10 +6,6 @@ class ServerInfo(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/serverInfo".format(self.parent_srv.baseurl) diff --git a/tableauserverclient/server/endpoint/sites_endpoint.py b/tableauserverclient/server/endpoint/sites_endpoint.py index 51736ffc7..3977ad0f2 100644 --- a/tableauserverclient/server/endpoint/sites_endpoint.py +++ b/tableauserverclient/server/endpoint/sites_endpoint.py @@ -8,10 +8,6 @@ class Sites(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites".format(self.parent_srv.baseurl) diff --git a/tableauserverclient/server/endpoint/users_endpoint.py b/tableauserverclient/server/endpoint/users_endpoint.py index 1bc32d50e..d5b5155fa 100644 --- a/tableauserverclient/server/endpoint/users_endpoint.py +++ b/tableauserverclient/server/endpoint/users_endpoint.py @@ -8,10 +8,6 @@ class Users(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}/users".format(self.parent_srv.baseurl, self.parent_srv.site_id) diff --git a/tableauserverclient/server/endpoint/views_endpoint.py b/tableauserverclient/server/endpoint/views_endpoint.py index 1ccc418f4..2b5f0e5dd 100644 --- a/tableauserverclient/server/endpoint/views_endpoint.py +++ b/tableauserverclient/server/endpoint/views_endpoint.py @@ -7,10 +7,6 @@ class Views(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}".format(self.parent_srv.baseurl, self.parent_srv.site_id) diff --git a/tableauserverclient/server/endpoint/workbooks_endpoint.py b/tableauserverclient/server/endpoint/workbooks_endpoint.py index 46ec3c5ee..6aabc6029 100644 --- a/tableauserverclient/server/endpoint/workbooks_endpoint.py +++ b/tableauserverclient/server/endpoint/workbooks_endpoint.py @@ -17,10 +17,6 @@ class Workbooks(Endpoint): - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/sites/{1}/workbooks".format(self.parent_srv.baseurl, self.parent_srv.site_id) From aa2e122071c68ab8a5893ef103486072c5a658a9 Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 13:01:37 -0700 Subject: [PATCH 3/7] Adding comment to clarify the condition on server_response.encoding --- tableauserverclient/server/endpoint/endpoint.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index 2a9f5d90e..91404363c 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -31,6 +31,9 @@ def _make_request(self, method, url, content=None, request_object=None, token=No server_response = method(url, **parameters) self._check_status(server_response) + + # This check is to determine if the response is a text response (xml or otherwise) + # so that we do not attempt to log bytes and other binary data. if server_response.encoding: logger.debug(u'Server response from {0}:\n\t{1}'.format( url, server_response.content.decode(server_response.encoding))) From 9ab57ea646a36aceae094da1770533fa687a6d4a Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 13:18:02 -0700 Subject: [PATCH 4/7] fixing pep8 problems --- tableauserverclient/server/endpoint/endpoint.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index 91404363c..25c874f8f 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -19,10 +19,10 @@ def _make_headers(token, content_type): if content_type is not None: retval['content-type'] = content_type - def _make_request(self, method, url, content=None, request_object=None, token=None, content_type =None): + def _make_request(self, method, url, content=None, request_object=None, token=None, content_type=None): if request_object is not None: url = request_object.apply_query_params(url) - parameters = { } + parameters = {} parameters.update(self.parent_srv.http_options) parameters['headers'] = Endpoint._make_headers(token, content_type) @@ -59,11 +59,10 @@ def put_request(self, url, xml_request, content_type='text/xml'): return self._make_request(self.parent_srv.session.put, url, content=xml_request, token=self.parent_srv.auth_token, - content_type = content_type) - + content_type=content_type) def post_request(self, url, xml_request, content_type='text/xml'): return self._make_request(self.parent_srv.session.post, url, content=xml_request, token=self.parent_srv.auth_token, - content_type = content_type) + content_type=content_type) From 602811ec8f1a6e476481a7661b4ca5c505341cc2 Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 13:52:51 -0700 Subject: [PATCH 5/7] Auth Endpoint had two __init__, getting rid of both of them because they aren't needed --- tableauserverclient/server/endpoint/auth_endpoint.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tableauserverclient/server/endpoint/auth_endpoint.py b/tableauserverclient/server/endpoint/auth_endpoint.py index 43c873237..ed42d32e6 100644 --- a/tableauserverclient/server/endpoint/auth_endpoint.py +++ b/tableauserverclient/server/endpoint/auth_endpoint.py @@ -7,9 +7,6 @@ class Auth(Endpoint): - def __init__(self): - super(Auth, self).__init__(None) - class contextmgr(object): def __init__(self, callback): self._callback = callback @@ -20,10 +17,6 @@ def __enter__(self): def __exit__(self, exc_type, exc_val, exc_tb): self._callback() - def __init__(self, parent_srv): - super(Endpoint, self).__init__() - self.parent_srv = parent_srv - @property def baseurl(self): return "{0}/auth".format(self.parent_srv.baseurl) From a6c3bcee82293efd45742c986ae0a62cd8e0bf7b Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 14:05:28 -0700 Subject: [PATCH 6/7] make_headers -> make_common_headers --- tableauserverclient/server/endpoint/endpoint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index 25c874f8f..e654119a0 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -12,7 +12,7 @@ def __init__(self, parent_srv): self.parent_srv = parent_srv @staticmethod - def _make_headers(token, content_type): + def _make_common_headers(token, content_type): retval = {} if token is not None: retval['x-tableau-auth'] = token @@ -24,7 +24,7 @@ def _make_request(self, method, url, content=None, request_object=None, token=No url = request_object.apply_query_params(url) parameters = {} parameters.update(self.parent_srv.http_options) - parameters['headers'] = Endpoint._make_headers(token, content_type) + parameters['headers'] = Endpoint._make_common_headers(token, content_type) if content is not None: parameters['data'] = content From 0dc909016d160a587eb96b86eafca86850096002 Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Fri, 28 Oct 2016 14:22:37 -0700 Subject: [PATCH 7/7] token -> auth_token --- .../server/endpoint/endpoint.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tableauserverclient/server/endpoint/endpoint.py b/tableauserverclient/server/endpoint/endpoint.py index e654119a0..b532abfcb 100644 --- a/tableauserverclient/server/endpoint/endpoint.py +++ b/tableauserverclient/server/endpoint/endpoint.py @@ -12,19 +12,19 @@ def __init__(self, parent_srv): self.parent_srv = parent_srv @staticmethod - def _make_common_headers(token, content_type): + def _make_common_headers(auth_token, content_type): retval = {} - if token is not None: - retval['x-tableau-auth'] = token + if auth_token is not None: + retval['x-tableau-auth'] = auth_token if content_type is not None: retval['content-type'] = content_type - def _make_request(self, method, url, content=None, request_object=None, token=None, content_type=None): + def _make_request(self, method, url, content=None, request_object=None, auth_token=None, content_type=None): if request_object is not None: url = request_object.apply_query_params(url) parameters = {} parameters.update(self.parent_srv.http_options) - parameters['headers'] = Endpoint._make_common_headers(token, content_type) + parameters['headers'] = Endpoint._make_common_headers(auth_token, content_type) if content is not None: parameters['data'] = content @@ -48,21 +48,21 @@ def get_unauthenticated_request(self, url, request_object=None): return self._make_request(self.parent_srv.session.get, url, request_object=request_object) def get_request(self, url, request_object=None): - return self._make_request(self.parent_srv.session.get, url, token=self.parent_srv.auth_token, + return self._make_request(self.parent_srv.session.get, url, auth_token=self.parent_srv.auth_token, request_object=request_object) def delete_request(self, url): # We don't return anything for a delete - self._make_request(self.parent_srv.session.delete, url, token=self.parent_srv.auth_token) + self._make_request(self.parent_srv.session.delete, url, auth_token=self.parent_srv.auth_token) def put_request(self, url, xml_request, content_type='text/xml'): return self._make_request(self.parent_srv.session.put, url, content=xml_request, - token=self.parent_srv.auth_token, + auth_token=self.parent_srv.auth_token, content_type=content_type) def post_request(self, url, xml_request, content_type='text/xml'): return self._make_request(self.parent_srv.session.post, url, content=xml_request, - token=self.parent_srv.auth_token, + auth_token=self.parent_srv.auth_token, content_type=content_type)