diff --git a/tableauserverclient/models/__init__.py b/tableauserverclient/models/__init__.py index 172877060..b5b50fe59 100644 --- a/tableauserverclient/models/__init__.py +++ b/tableauserverclient/models/__init__.py @@ -1,6 +1,7 @@ from .connection_credentials import ConnectionCredentials from .connection_item import ConnectionItem from .column_item import ColumnItem +from .data_acceleration_report_item import DataAccelerationReportItem from .datasource_item import DatasourceItem from .database_item import DatabaseItem from .exceptions import UnpopulatedPropertyError diff --git a/tableauserverclient/models/data_acceleration_report_item.py b/tableauserverclient/models/data_acceleration_report_item.py new file mode 100644 index 000000000..2f056d0c4 --- /dev/null +++ b/tableauserverclient/models/data_acceleration_report_item.py @@ -0,0 +1,75 @@ +import xml.etree.ElementTree as ET + + +class DataAccelerationReportItem(object): + class ComparisonRecord(object): + def __init__(self, site, sheet_uri, unaccelerated_session_count, + avg_non_accelerated_plt, accelerated_session_count, + avg_accelerated_plt): + self._site = site + self._sheet_uri = sheet_uri + self._unaccelerated_session_count = unaccelerated_session_count + self._avg_non_accelerated_plt = avg_non_accelerated_plt + self._accelerated_session_count = accelerated_session_count + self._avg_accelerated_plt = avg_accelerated_plt + + @property + def site(self): + return self._site + + @property + def sheet_uri(self): + return self._sheet_uri + + @property + def site(self): + return self._site + + @property + def unaccelerated_session_count(self): + return self._unaccelerated_session_count + + @property + def accelerated_session_count(self): + return self._accelerated_session_count + + @property + def avg_accelerated_plt(self): + return self._avg_accelerated_plt + + @property + def avg_non_accelerated_plt(self): + return self._avg_non_accelerated_plt + + def __init__(self, comparison_records): + self._comparison_records = comparison_records + + @property + def comparison_records(self): + return self._comparison_records + + @staticmethod + def _parse_element(comparison_record_xml, ns): + site = comparison_record_xml.get('site', None) + sheet_uri = comparison_record_xml.get('sheetURI', None) + unaccelerated_session_count = comparison_record_xml.get('unacceleratedSessionCount', None) + avg_non_accelerated_plt = comparison_record_xml.get('averageNonAcceleratedPLT', None) + accelerated_session_count = comparison_record_xml.get('acceleratedSessionCount', None) + avg_accelerated_plt = comparison_record_xml.get('averageAcceleratedPLT', None) + return site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt, \ + accelerated_session_count, avg_accelerated_plt + + @classmethod + def from_response(cls, resp, ns): + comparison_records = list() + parsed_response = ET.fromstring(resp) + all_comparison_records_xml = parsed_response.findall('.//t:comparisonRecord', namespaces=ns) + for comparison_record_xml in all_comparison_records_xml: + (site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt, + accelerated_session_count, avg_accelerated_plt) = cls._parse_element(comparison_record_xml, ns) + + comparison_record = DataAccelerationReportItem.ComparisonRecord( + site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt, + accelerated_session_count, avg_accelerated_plt) + comparison_records.append(comparison_record) + return cls(comparison_records) diff --git a/tableauserverclient/server/endpoint/__init__.py b/tableauserverclient/server/endpoint/__init__.py index 34c45a89a..fce86f98d 100644 --- a/tableauserverclient/server/endpoint/__init__.py +++ b/tableauserverclient/server/endpoint/__init__.py @@ -1,4 +1,5 @@ from .auth_endpoint import Auth +from .data_acceleration_report_endpoint import DataAccelerationReport from .datasources_endpoint import Datasources from .databases_endpoint import Databases from .endpoint import Endpoint diff --git a/tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py b/tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py new file mode 100644 index 000000000..b84a38643 --- /dev/null +++ b/tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py @@ -0,0 +1,30 @@ +from .endpoint import api, Endpoint +from .permissions_endpoint import _PermissionsEndpoint +from .default_permissions_endpoint import _DefaultPermissionsEndpoint + +from ...models.data_acceleration_report_item import DataAccelerationReportItem + +import logging + +logger = logging.getLogger('tableau.endpoint.data_acceleration_report') + + +class DataAccelerationReport(Endpoint): + def __init__(self, parent_srv): + super(DataAccelerationReport, self).__init__(parent_srv) + + self._permissions = _PermissionsEndpoint(parent_srv, lambda: self.baseurl) + self._default_permissions = _DefaultPermissionsEndpoint(parent_srv, lambda: self.baseurl) + + @property + def baseurl(self): + return "{0}/sites/{1}/dataAccelerationReport".format(self.parent_srv.baseurl, self.parent_srv.site_id) + + @api(version="3.8") + def get(self, req_options=None): + logger.info("Querying data acceleration report") + url = self.baseurl + server_response = self.get_request(url, req_options) + data_acceleration_report = DataAccelerationReportItem.from_response( + server_response.content, self.parent_srv.namespace) + return data_acceleration_report diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 6c36482fd..42accf722 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -4,7 +4,7 @@ from ..namespace import Namespace from .endpoint import Sites, Views, Users, Groups, Workbooks, Datasources, Projects, Auth, \ Schedules, ServerInfo, Tasks, ServerInfoEndpointNotFoundError, Subscriptions, Jobs, Metadata,\ - Databases, Tables, Flows, Webhooks + Databases, Tables, Flows, Webhooks, DataAccelerationReport from .endpoint.exceptions import EndpointUnavailableError, ServerInfoEndpointNotFoundError import requests @@ -56,6 +56,7 @@ def __init__(self, server_address, use_server_version=False): self.databases = Databases(self) self.tables = Tables(self) self.webhooks = Webhooks(self) + self.data_acceleration_report = DataAccelerationReport(self) self._namespace = Namespace() if use_server_version: diff --git a/test/assets/data_acceleration_report.xml b/test/assets/data_acceleration_report.xml new file mode 100644 index 000000000..51b86a691 --- /dev/null +++ b/test/assets/data_acceleration_report.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/test/test_data_acceleration_report.py b/test/test_data_acceleration_report.py new file mode 100644 index 000000000..7722bf230 --- /dev/null +++ b/test/test_data_acceleration_report.py @@ -0,0 +1,42 @@ +import unittest +import os +import requests_mock +import xml.etree.ElementTree as ET +import tableauserverclient as TSC +from ._utils import read_xml_asset, read_xml_assets, asset + +GET_XML = 'data_acceleration_report.xml' + + +class DataAccelerationReportTests(unittest.TestCase): + def setUp(self): + self.server = TSC.Server('http://test') + + # Fake signin + self.server._site_id = 'dad65087-b08b-4603-af4e-2887b8aafc67' + self.server._auth_token = 'j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM' + self.server.version = "3.8" + + self.baseurl = self.server.data_acceleration_report.baseurl + + def test_get(self): + response_xml = read_xml_asset(GET_XML) + with requests_mock.mock() as m: + m.get(self.baseurl, text=response_xml) + data_acceleration_report = self.server.data_acceleration_report.get() + + self.assertEqual(2, len(data_acceleration_report.comparison_records)) + + self.assertEqual("site-1", data_acceleration_report.comparison_records[0].site) + self.assertEqual("sheet-1", data_acceleration_report.comparison_records[0].sheet_uri) + self.assertEqual("0", data_acceleration_report.comparison_records[0].unaccelerated_session_count) + self.assertEqual("0.0", data_acceleration_report.comparison_records[0].avg_non_accelerated_plt) + self.assertEqual("1", data_acceleration_report.comparison_records[0].accelerated_session_count) + self.assertEqual("0.166", data_acceleration_report.comparison_records[0].avg_accelerated_plt) + + self.assertEqual("site-2", data_acceleration_report.comparison_records[1].site) + self.assertEqual("sheet-2", data_acceleration_report.comparison_records[1].sheet_uri) + self.assertEqual("2", data_acceleration_report.comparison_records[1].unaccelerated_session_count) + self.assertEqual("1.29", data_acceleration_report.comparison_records[1].avg_non_accelerated_plt) + self.assertEqual("3", data_acceleration_report.comparison_records[1].accelerated_session_count) + self.assertEqual("0.372", data_acceleration_report.comparison_records[1].avg_accelerated_plt)