From 0d736411f5a990c90706e34e7e46a188c4947b4f Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Wed, 19 Feb 2020 18:05:06 -0600 Subject: [PATCH 1/7] Add flexibility for wkbk/ds id or item in endpoint --- tableauserverclient/server/endpoint/datasources_endpoint.py | 3 ++- tableauserverclient/server/endpoint/jobs_endpoint.py | 3 ++- tableauserverclient/server/endpoint/workbooks_endpoint.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tableauserverclient/server/endpoint/datasources_endpoint.py b/tableauserverclient/server/endpoint/datasources_endpoint.py index eef88d09e..5d79921e9 100644 --- a/tableauserverclient/server/endpoint/datasources_endpoint.py +++ b/tableauserverclient/server/endpoint/datasources_endpoint.py @@ -145,7 +145,8 @@ def update_connection(self, datasource_item, connection_item): return connection def refresh(self, datasource_item): - url = "{0}/{1}/refresh".format(self.baseurl, datasource_item.id) + id_ = getattr(datasource_item, 'id', datasource_item) + url = "{0}/{1}/refresh".format(self.baseurl, id_) empty_req = RequestFactory.Empty.empty_req() server_response = self.post_request(url, empty_req) new_job = JobItem.from_response(server_response.content, self.parent_srv.namespace)[0] diff --git a/tableauserverclient/server/endpoint/jobs_endpoint.py b/tableauserverclient/server/endpoint/jobs_endpoint.py index 92285c3db..e70c9c313 100644 --- a/tableauserverclient/server/endpoint/jobs_endpoint.py +++ b/tableauserverclient/server/endpoint/jobs_endpoint.py @@ -35,7 +35,8 @@ def get(self, job_id=None, req_options=None): @api(version='3.1') def cancel(self, job_id): - url = '{0}/{1}'.format(self.baseurl, job_id) + id_ = getattr(job_id, 'id', job_id) + url = '{0}/{1}'.format(self.baseurl, id_) return self.put_request(url) @api(version='2.6') diff --git a/tableauserverclient/server/endpoint/workbooks_endpoint.py b/tableauserverclient/server/endpoint/workbooks_endpoint.py index a6a49fedf..1559bc41b 100644 --- a/tableauserverclient/server/endpoint/workbooks_endpoint.py +++ b/tableauserverclient/server/endpoint/workbooks_endpoint.py @@ -56,7 +56,8 @@ def get_by_id(self, workbook_id): @api(version="2.8") def refresh(self, workbook_id): - url = "{0}/{1}/refresh".format(self.baseurl, workbook_id) + id_ = getattr(workbook_id, 'id', workbook_id) + url = "{0}/{1}/refresh".format(self.baseurl, id_) empty_req = RequestFactory.Empty.empty_req() server_response = self.post_request(url, empty_req) new_job = JobItem.from_response(server_response.content, self.parent_srv.namespace)[0] From 13dd0839abb1bdf5226d5a838fbbda388d482b23 Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Thu, 20 Feb 2020 13:09:26 -0600 Subject: [PATCH 2/7] Add API version number decorator --- tableauserverclient/server/endpoint/datasources_endpoint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tableauserverclient/server/endpoint/datasources_endpoint.py b/tableauserverclient/server/endpoint/datasources_endpoint.py index 5d79921e9..44dea28df 100644 --- a/tableauserverclient/server/endpoint/datasources_endpoint.py +++ b/tableauserverclient/server/endpoint/datasources_endpoint.py @@ -144,6 +144,7 @@ def update_connection(self, datasource_item, connection_item): connection_item.id)) return connection + @api(version="2.8") def refresh(self, datasource_item): id_ = getattr(datasource_item, 'id', datasource_item) url = "{0}/{1}/refresh".format(self.baseurl, id_) From a1f54536e614279efae9ebae21f6085d64edec2f Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Thu, 5 Mar 2020 22:15:27 -0600 Subject: [PATCH 3/7] Write tests for workbook refresh --- test/assets/workbook_refresh.xml | 7 +++++++ test/test_workbook.py | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 test/assets/workbook_refresh.xml diff --git a/test/assets/workbook_refresh.xml b/test/assets/workbook_refresh.xml new file mode 100644 index 000000000..1e9ba6563 --- /dev/null +++ b/test/assets/workbook_refresh.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/test/test_workbook.py b/test/test_workbook.py index fac6c49a1..98f4c4a5c 100644 --- a/test/test_workbook.py +++ b/test/test_workbook.py @@ -27,6 +27,7 @@ POPULATE_VIEWS_USAGE_XML = os.path.join(TEST_ASSET_DIR, 'workbook_populate_views_usage.xml') PUBLISH_XML = os.path.join(TEST_ASSET_DIR, 'workbook_publish.xml') PUBLISH_ASYNC_XML = os.path.join(TEST_ASSET_DIR, 'workbook_publish_async.xml') +REFRESH_XML = os.path.join(TEST_ASSET_DIR, 'workbook_refresh.xml') UPDATE_XML = os.path.join(TEST_ASSET_DIR, 'workbook_update.xml') UPDATE_PERMISSIONS = os.path.join(TEST_ASSET_DIR, 'workbook_update_permissions.xml') @@ -114,6 +115,29 @@ def test_get_by_id(self): def test_get_by_id_missing_id(self): self.assertRaises(ValueError, self.server.workbooks.get_by_id, '') + def test_refresh_id(self): + self.server.version = '2.8' + self.baseurl = self.server.workbooks.baseurl + with open(REFRESH_XML, 'rb') as f: + response_xml = f.read().decode('utf-8') + with requests_mock.mock() as m: + m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', + status_code=202, text=response_xml) + self.server.workbooks.refresh('3cc6cd06-89ce-4fdc-b935-5294135d6d42') + + def test_refresh_object(self): + self.server.version = '2.8' + self.baseurl = self.server.workbooks.baseurl + workbook = TSC.WorkbookItem('') + workbook._id = '3cc6cd06-89ce-4fdc-b935-5294135d6d42' + with open(REFRESH_XML, 'rb') as f: + response_xml = f.read().decode('utf-8') + with requests_mock.mock() as m: + m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', + status_code=202, text=response_xml) + self.server.workbooks.refresh(workbook) + + def test_delete(self): with requests_mock.mock() as m: m.delete(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42', status_code=204) @@ -504,3 +528,4 @@ def test_synchronous_publish_timeout_error(self): self.assertRaisesRegex(InternalServerError, 'Please use asynchronous publishing to avoid timeouts', self.server.workbooks.publish, new_workbook, asset('SampleWB.twbx'), publish_mode) + From 74797fb29285ef12e87731142d9944c4f473ef1e Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Thu, 5 Mar 2020 22:26:34 -0600 Subject: [PATCH 4/7] Correct refresh XML --- test/assets/workbook_refresh.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/assets/workbook_refresh.xml b/test/assets/workbook_refresh.xml index 1e9ba6563..6f5da8283 100644 --- a/test/assets/workbook_refresh.xml +++ b/test/assets/workbook_refresh.xml @@ -1,7 +1,8 @@ - + + \ No newline at end of file From 83787610b3facf9f6367e4c946d70bfa1f46002a Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Thu, 5 Mar 2020 22:34:13 -0600 Subject: [PATCH 5/7] Correct code style --- test/test_workbook.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/test_workbook.py b/test/test_workbook.py index 98f4c4a5c..dabf49a6d 100644 --- a/test/test_workbook.py +++ b/test/test_workbook.py @@ -121,10 +121,10 @@ def test_refresh_id(self): with open(REFRESH_XML, 'rb') as f: response_xml = f.read().decode('utf-8') with requests_mock.mock() as m: - m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', + m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', status_code=202, text=response_xml) self.server.workbooks.refresh('3cc6cd06-89ce-4fdc-b935-5294135d6d42') - + def test_refresh_object(self): self.server.version = '2.8' self.baseurl = self.server.workbooks.baseurl @@ -133,10 +133,9 @@ def test_refresh_object(self): with open(REFRESH_XML, 'rb') as f: response_xml = f.read().decode('utf-8') with requests_mock.mock() as m: - m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', + m.post(self.baseurl + '/3cc6cd06-89ce-4fdc-b935-5294135d6d42/refresh', status_code=202, text=response_xml) self.server.workbooks.refresh(workbook) - def test_delete(self): with requests_mock.mock() as m: @@ -528,4 +527,3 @@ def test_synchronous_publish_timeout_error(self): self.assertRaisesRegex(InternalServerError, 'Please use asynchronous publishing to avoid timeouts', self.server.workbooks.publish, new_workbook, asset('SampleWB.twbx'), publish_mode) - From c460f6e183a13a1254529c4494ace64860011910 Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Fri, 6 Mar 2020 06:30:27 -0600 Subject: [PATCH 6/7] Create tests for datasource refresh --- test/assets/datasource_refresh.xml | 8 ++++++++ test/test_datasource.py | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 test/assets/datasource_refresh.xml diff --git a/test/assets/datasource_refresh.xml b/test/assets/datasource_refresh.xml new file mode 100644 index 000000000..61b4b7601 --- /dev/null +++ b/test/assets/datasource_refresh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/test_datasource.py b/test/test_datasource.py index c90cf4601..2b7cc623c 100644 --- a/test/test_datasource.py +++ b/test/test_datasource.py @@ -16,6 +16,7 @@ POPULATE_PERMISSIONS_XML = 'datasource_populate_permissions.xml' PUBLISH_XML = 'datasource_publish.xml' PUBLISH_XML_ASYNC = 'datasource_publish_async.xml' +REFRESH_XML = 'datasource_refresh.xml' UPDATE_XML = 'datasource_update.xml' UPDATE_CONNECTION_XML = 'datasource_connection_update.xml' @@ -249,6 +250,26 @@ def test_publish_async(self): self.assertEqual('2018-06-30T00:54:54Z', format_datetime(new_job.created_at)) self.assertEqual('1', new_job.finish_code) + def test_refresh_id(self): + self.server.version = '2.8' + self.baseurl = self.server.datasources.baseurl + response_xml = read_xml_asset(REFRESH_XML) + with requests_mock.mock() as m: + m.post(self.baseurl + '/9dbd2263-16b5-46e1-9c43-a76bb8ab65fb/refresh', + status_code=202, text=response_xml) + self.server.datasources.refresh('9dbd2263-16b5-46e1-9c43-a76bb8ab65fb') + + def test_refresh_object(self): + self.server.version = '2.8' + self.baseurl = self.server.datasources.baseurl + datasource = TSC.DatasourceItem('') + datasource._id = '9dbd2263-16b5-46e1-9c43-a76bb8ab65fb' + response_xml = read_xml_asset(REFRESH_XML) + with requests_mock.mock() as m: + m.post(self.baseurl + '/9dbd2263-16b5-46e1-9c43-a76bb8ab65fb/refresh', + status_code=202, text=response_xml) + self.server.datasources.refresh(datasource) + def test_delete(self): with requests_mock.mock() as m: m.delete(self.baseurl + '/9dbd2263-16b5-46e1-9c43-a76bb8ab65fb', status_code=204) From c22f9d66d4750e7f1b78a99050c05aaf013817ae Mon Sep 17 00:00:00 2001 From: Jordan Woods Date: Fri, 6 Mar 2020 06:43:48 -0600 Subject: [PATCH 7/7] Test job cancel on item --- test/test_job.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/test_job.py b/test/test_job.py index ee8316168..ee80450ca 100644 --- a/test/test_job.py +++ b/test/test_job.py @@ -45,7 +45,16 @@ def test_get_before_signin(self): self.server._auth_token = None self.assertRaises(TSC.NotSignedInError, self.server.jobs.get) - def test_cancel(self): + def test_cancel_id(self): with requests_mock.mock() as m: m.put(self.baseurl + '/ee8c6e70-43b6-11e6-af4f-f7b0d8e20760', status_code=204) self.server.jobs.cancel('ee8c6e70-43b6-11e6-af4f-f7b0d8e20760') + + def test_cancel_item(self): + created_at = datetime(2018, 5, 22, 13, 0, 29, tzinfo=utc) + started_at = datetime(2018, 5, 22, 13, 0, 37, tzinfo=utc) + job = TSC.JobItem('ee8c6e70-43b6-11e6-af4f-f7b0d8e20760', 'backgroundJob', + 0, created_at, started_at, None, 0) + with requests_mock.mock() as m: + m.put(self.baseurl + '/ee8c6e70-43b6-11e6-af4f-f7b0d8e20760', status_code=204) + self.server.jobs.cancel(job)