10000 Adding DataAccelerationReport end point and item (#596) · rferraton/server-client-python@5812dc9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5812dc9

Browse files
authored
Adding DataAccelerationReport end point and item (tableau#596)
* fixing a bug due to bool(time(0,0)) is false * replace materialized views with data acceleration * made changes in tests * fixed a unit test * restore deleted lines by mistake * replace materialize_workbooks.py with accelerate_workbooks.py * undo a fix to test_sort.py * format changes * another format change * format change * remove accelerate_workbooks.py * adding additional fields to data_acceleration_config * add acceleration report endpoint * adding unit test * fixed over-indentation Co-authored-by: dguo <dguo@tableau.com>
1 parent 2552c26 commit 5812dc9

File tree

7 files changed

+171
-1
lines changed

7 files changed

+171
-1
lines changed

tableauserverclient/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .connection_credentials import ConnectionCredentials
22
from .connection_item import ConnectionItem
33
from .column_item import ColumnItem
4+
from .data_acceleration_report_item import DataAccelerationReportItem
45
from .datasource_item import DatasourceItem
56
from .database_item import DatabaseItem
67
from .exceptions import UnpopulatedPropertyError
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import xml.etree.ElementTree as ET
2+
3+
4+
class DataAccelerationReportItem(object):
5+
class ComparisonRecord(object):
6+
def __init__(self, site, sheet_uri, unaccelerated_session_count,
7+
avg_non_accelerated_plt, accelerated_session_count,
8+
avg_accelerated_plt):
9+
self._site = site
10+
self._sheet_uri = sheet_uri
11+
self._unaccelerated_session_count = unaccelerated_session_count
12+
self._avg_non_accelerated_plt = avg_non_accelerated_plt
13+
self._accelerated_session_count = accelerated_session_count
14+
self._avg_accelerated_plt = avg_accelerated_plt
15+
16+
@property
17+
def site(self):
18+
return self._site
19+
20+
@property
21+
def sheet_uri(self):
22+
return self._sheet_uri
23+
24+
@property
25+
def site(self):
26+
return self._site
27+
28+
@property
29+
def unaccelerated_session_count(self):
30+
return self._unaccelerated_session_count
31+
32+
@property
33+
def accelerated_session_count(self):
34+
return self._accelerated_session_count
35+
36+
@property
37+
def avg_accelerated_plt(self):
38+
return self._avg_accelerated_plt
39+
40+
@property
41+
def avg_non_accelerated_plt(self):
42+
return self._avg_non_accelerated_plt
43+
44+
def __init__(self, comparison_records):
45+
self._comparison_records = comparison_records
46+
47+
@property
48+
def comparison_records(self):
49+
return self._comparison_records
50+
51+
@staticmethod
52+
def _parse_element(comparison_record_xml, ns):
53+
site = comparison_record_xml.get('site', None)
54+
sheet_uri = comparison_record_xml.get('sheetURI', None)
55+
unaccelerated_session_count = comparison_record_xml.get('unacceleratedSessionCount', None)
56+
avg_non_accelerated_plt = comparison_record_xml.get('averageNonAcceleratedPLT', None)
57+
accelerated_session_count = comparison_record_xml.get('acceleratedSessionCount', None)
58+
avg_accelerated_plt = comparison_record_xml.get('averageAcceleratedPLT', None)
59+
return site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt, \
60+
accelerated_session_count, avg_accelerated_plt
61+
62+
@classmethod
63+
def from_response(cls, resp, ns):
64+
comparison_records = list()
65+
parsed_response = ET.fromstring(resp)
66+
all_comparison_records_xml = parsed_response.findall('.//t:comparisonRecord', namespaces=ns)
67+
for comparison_record_xml in all_comparison_records_xml:
68+
(site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt,
69+
accelerated_session_count, avg_accelerated_plt) = cls._parse_element(comparison_record_xml, ns)
70+
71+
comparison_record = DataAccelerationReportItem.ComparisonRecord(
72+
site, sheet_uri, unaccelerated_session_count, avg_non_accelerated_plt,
73+
accelerated_session_count, avg_accelerated_plt)
74+
comparison_records.append(comparison_record)
75+
return cls(comparison_records)

tableauserverclient/server/endpoint/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .auth_endpoint import Auth
2+
from .data_acceleration_report_endpoint import DataAccelerationReport
23
from .datasources_endpoint import Datasources
34
from .databases_endpoint import Databases
45
from .endpoint import Endpoint
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from .endpoint import api, Endpoint
2+
from .permissions_endpoint import _PermissionsEndpoint
3+
from .default_permissions_endpoint import _DefaultPermissionsEndpoint
4+
5+
from ...models.data_acceleration_report_item import DataAccelerationReportItem
6+
7+
import logging
8+
9+
logger = logging.getLogger('tableau.endpoint.data_acceleration_report')
10+
11+
12+
class DataAccelerationReport(Endpoint):
13+
def __init__(self, parent_srv):
14+
super(DataAccelerationReport, self).__init__(parent_srv)
15+
16+
self._permissions = _PermissionsEndpoint(parent_srv, lambda: self.baseurl)
17+
self._default_permissions = _DefaultPermissionsEndpoint(parent_srv, lambda: self.baseurl)
18+
19+
@property
20+
def baseurl(self):
21+
return "{0}/sites/{1}/dataAccelerationReport".format(self.parent_srv.baseurl, self.parent_srv.site_id)
22+
23+
@api(version="3.8")
24+
def get(self, req_options=None):
25+
logger.info("Querying data acceleration report")
26+
url = self.baseurl
27+
server_response = self.get_request(url, req_options)
28+
data_acceleration_report = DataAccelerationReportItem.from_response(
29+
server_response.content, self.parent_srv.namespace)
30+
return data_acceleration_report

tableauserverclient/server/server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ..namespace import Namespace
55
from .endpoint import Sites, Views, Users, Groups, Workbooks, Datasources, Projects, Auth, \
66
Schedules, ServerInfo, Tasks, ServerInfoEndpointNotFoundError, Subscriptions, Jobs, Metadata,\
7-
Databases, Tables, Flows, Webhooks
7+
Databases, Tables, Flows, Webhooks, DataAccelerationReport
88
from .endpoint.exceptions import EndpointUnavailableError, ServerInfoEndpointNotFoundError
99

1010
import requests
@@ -56,6 +56,7 @@ def __init__(self, server_address, use_server_version=False):
5656
self.databases = Databases(self)
5757
self.tables = Tables(self)
5858
self.webhooks = Webhooks(self)
59+
self.data_acceleration_report = DataAccelerationReport(self)
5960
self._namespace = Namespace()
6061

6162
if use_server_version:
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<tsResponse
3+
xmlns="http://tableau.com/api"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-3.8.xsd">
6+
<dataAccelerationReport>
7+
<comparisonRecord site="site-1"
8+
sheetURI="sheet-1"
9+
unacceleratedSessionCount="0"
10+
averageNonAcceleratedPLT="0.0"
11+
acceleratedSessionCount="1"
12+
averageAcceleratedPLT="0.166"/>
13+
<comparisonRecord site="site-2"
14+
sheetURI="sheet-2"
15+
unacceleratedSessionCount="2"
16+
averageNonAcceleratedPLT="1.29"
17+
acceleratedSessionCount="3"
18+
averageAcceleratedPLT="0.372"/>
19+
</dataAccelerationReport>
20+
</tsResponse>
< F438 div class="pt-3">

test/test_data_acceleration_report.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import unittest
2+
import os
3+
import requests_mock
4+
import xml.etree.ElementTree as ET
5+
import tableauserverclient as TSC
6+
from ._utils import read_xml_asset, read_xml_assets, asset
7+
8+
GET_XML = 'data_acceleration_report.xml'
9+
10+
11+
class DataAccelerationReportTests(unittest.TestCase):
12+
def setUp(self):
13+
self.server = TSC.Server('http://test')
14+
15+
# Fake signin
16+
self.server._site_id = 'dad65087-b08b-4603-af4e-2887b8aafc67'
17+
self.server._auth_token = 'j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM'
18+
self.server.version = "3.8"
19+
20+
self.baseurl = self.server.data_acceleration_report.baseurl
21+
22+
def test_get(self):
23+
response_xml = read_xml_asset(GET_XML)
24+
with requests_mock.mock() as m:
25+
m.get(self.baseurl, text=response_xml)
26+
data_acceleration_report = self.server.data_acceleration_report.get()
27+
28+
self.assertEqual(2, len(data_acceleration_report.comparison_records))
29+
30+
self.assertEqual("site-1", data_acceleration_report.comparison_records[0].site)
31+
self.assertEqual("sheet-1", data_acceleration_report.comparison_records[0].sheet_uri)
32+
self.assertEqual("0", data_acceleration_report.comparison_records[0].unaccelerated_session_count)
33+
self.assertEqual("0.0", data_acceleration_report.comparison_records[0].avg_non_accelerated_plt)
34+
self.assertEqual("1", data_acceleration_report.comparison_records[0].accelerated_session_count)
35+
self.assertEqual("0.166", data_acceleration_report.comparison_records[0].avg_accelerated_plt)
36+
37+
self.assertEqual("site-2", data_acceleration_report.comparison_records[1].site)
38+
self.assertEqual("sheet-2", data_acceleration_report.comparison_records[1].sheet_uri)
39+
self.assertEqual("2", data_acceleration_report.comparison_records[1].unaccelerated_session_count)
40+
self.assertEqual("1.29", data_acceleration_report.comparison_records[1].avg_non_accelerated_plt)
41+
self.assertEqual("3", data_acceleration_report.comparison_records[1].accelerated_session_count)
42+
self.assertEqual("0.372", data_acceleration_report.comparison_records[1].avg_accelerated_plt)

0 commit comments

Comments
 (0)
0