tableauserverclient 0.37__py3-none-any.whl → 0.39__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tableauserverclient/bin/_version.py → _version.py +3 -3
- bin/__init__.py +3 -0
- bin/_version.py +21 -0
- {tableauserverclient/helpers → helpers}/strings.py +25 -1
- {tableauserverclient/models → models}/__init__.py +15 -1
- models/collection_item.py +52 -0
- {tableauserverclient/models → models}/connection_item.py +16 -2
- {tableauserverclient/models → models}/custom_view_item.py +8 -0
- {tableauserverclient/models → models}/data_freshness_policy_item.py +3 -3
- {tableauserverclient/models → models}/datasource_item.py +113 -3
- models/extensions_item.py +186 -0
- models/extract_item.py +82 -0
- {tableauserverclient/models → models}/favorites_item.py +21 -8
- {tableauserverclient/models → models}/flow_item.py +3 -3
- {tableauserverclient/models → models}/group_item.py +18 -1
- {tableauserverclient/models → models}/groupset_item.py +14 -0
- {tableauserverclient/models → models}/interval_item.py +42 -1
- models/location_item.py +53 -0
- models/oidc_item.py +82 -0
- {tableauserverclient/models → models}/permissions_item.py +2 -0
- {tableauserverclient/models → models}/project_item.py +141 -29
- {tableauserverclient/models → models}/property_decorators.py +2 -2
- {tableauserverclient/models → models}/reference_item.py +12 -6
- {tableauserverclient/models → models}/schedule_item.py +67 -1
- {tableauserverclient/models → models}/site_item.py +54 -0
- {tableauserverclient/models → models}/table_item.py +7 -3
- {tableauserverclient/models → models}/tableau_auth.py +13 -6
- {tableauserverclient/models → models}/tableau_types.py +13 -1
- {tableauserverclient/models → models}/user_item.py +111 -4
- {tableauserverclient/models → models}/view_item.py +79 -5
- {tableauserverclient/models → models}/workbook_item.py +153 -3
- {tableauserverclient/server → server}/endpoint/__init__.py +4 -0
- {tableauserverclient/server → server}/endpoint/databases_endpoint.py +101 -18
- {tableauserverclient/server → server}/endpoint/datasources_endpoint.py +155 -25
- {tableauserverclient/server → server}/endpoint/dqw_endpoint.py +16 -6
- {tableauserverclient/server → server}/endpoint/endpoint.py +39 -0
- server/endpoint/extensions_endpoint.py +79 -0
- {tableauserverclient/server → server}/endpoint/flow_task_endpoint.py +1 -1
- {tableauserverclient/server → server}/endpoint/flows_endpoint.py +5 -4
- server/endpoint/oidc_endpoint.py +157 -0
- {tableauserverclient/server → server}/endpoint/projects_endpoint.py +12 -0
- server/endpoint/schedules_endpoint.py +328 -0
- {tableauserverclient/server → server}/endpoint/sites_endpoint.py +18 -1
- {tableauserverclient/server → server}/endpoint/tables_endpoint.py +140 -17
- {tableauserverclient/server → server}/endpoint/users_endpoint.py +296 -10
- {tableauserverclient/server → server}/endpoint/views_endpoint.py +23 -0
- {tableauserverclient/server → server}/endpoint/workbooks_endpoint.py +124 -9
- {tableauserverclient/server → server}/query.py +36 -0
- {tableauserverclient/server → server}/request_factory.py +286 -2
- {tableauserverclient/server → server}/request_options.py +139 -3
- {tableauserverclient/server → server}/server.py +46 -0
- {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/METADATA +5 -26
- tableauserverclient-0.39.dist-info/RECORD +107 -0
- {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/WHEEL +1 -1
- tableauserverclient-0.39.dist-info/top_level.txt +4 -0
- tableauserverclient/__init__.py +0 -141
- tableauserverclient/config.py +0 -27
- tableauserverclient/datetime_helpers.py +0 -45
- tableauserverclient/exponential_backoff.py +0 -30
- tableauserverclient/filesys_helpers.py +0 -63
- tableauserverclient/namespace.py +0 -37
- tableauserverclient/py.typed +0 -0
- tableauserverclient/server/endpoint/schedules_endpoint.py +0 -151
- tableauserverclient-0.37.dist-info/RECORD +0 -106
- tableauserverclient-0.37.dist-info/licenses/LICENSE.versioneer +0 -7
- tableauserverclient-0.37.dist-info/top_level.txt +0 -1
- {tableauserverclient/helpers → helpers}/__init__.py +0 -0
- {tableauserverclient/helpers → helpers}/headers.py +0 -0
- {tableauserverclient/helpers → helpers}/logging.py +0 -0
- {tableauserverclient/models → models}/column_item.py +0 -0
- {tableauserverclient/models → models}/connection_credentials.py +0 -0
- {tableauserverclient/models → models}/data_acceleration_report_item.py +0 -0
- {tableauserverclient/models → models}/data_alert_item.py +0 -0
- {tableauserverclient/models → models}/database_item.py +0 -0
- {tableauserverclient/models → models}/dqw_item.py +0 -0
- {tableauserverclient/models → models}/exceptions.py +0 -0
- {tableauserverclient/models → models}/fileupload_item.py +0 -0
- {tableauserverclient/models → models}/flow_run_item.py +0 -0
- {tableauserverclient/models → models}/job_item.py +0 -0
- {tableauserverclient/models → models}/linked_tasks_item.py +0 -0
- {tableauserverclient/models → models}/metric_item.py +0 -0
- {tableauserverclient/models → models}/pagination_item.py +0 -0
- {tableauserverclient/models → models}/revision_item.py +0 -0
- {tableauserverclient/models → models}/server_info_item.py +0 -0
- {tableauserverclient/models → models}/subscription_item.py +0 -0
- {tableauserverclient/models → models}/tag_item.py +0 -0
- {tableauserverclient/models → models}/target.py +0 -0
- {tableauserverclient/models → models}/task_item.py +0 -0
- {tableauserverclient/models → models}/virtual_connection_item.py +0 -0
- {tableauserverclient/models → models}/webhook_item.py +0 -0
- {tableauserverclient/server → server}/__init__.py +0 -0
- {tableauserverclient/server → server}/endpoint/auth_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/custom_views_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/data_acceleration_report_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/data_alert_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/default_permissions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/exceptions.py +0 -0
- {tableauserverclient/server → server}/endpoint/favorites_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/fileuploads_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/flow_runs_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/groups_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/groupsets_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/jobs_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/linked_tasks_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/metadata_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/metrics_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/permissions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/resource_tagger.py +0 -0
- {tableauserverclient/server → server}/endpoint/server_info_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/subscriptions_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/tasks_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/virtual_connections_endpoint.py +0 -0
- {tableauserverclient/server → server}/endpoint/webhooks_endpoint.py +0 -0
- {tableauserverclient/server → server}/exceptions.py +0 -0
- {tableauserverclient/server → server}/filter.py +0 -0
- {tableauserverclient/server → server}/pager.py +0 -0
- {tableauserverclient/server → server}/sort.py +0 -0
- {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/licenses/LICENSE +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "
|
|
11
|
+
"date": "2026-02-02T11:01:51-0800",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "0.
|
|
14
|
+
"full-revisionid": "34ac954b8edd87e367e4e1f54b4179aee54e2816",
|
|
15
|
+
"version": "0.39"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
bin/__init__.py
ADDED
bin/_version.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
# This file was generated by 'versioneer.py' (0.29) from
|
|
3
|
+
# revision-control system data, or from the parent directory name of an
|
|
4
|
+
# unpacked source archive. Distribution tarballs contain a pre-generated copy
|
|
5
|
+
# of this file.
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
|
|
9
|
+
version_json = '''
|
|
10
|
+
{
|
|
11
|
+
"date": "2026-02-02T11:01:51-0800",
|
|
12
|
+
"dirty": false,
|
|
13
|
+
"error": null,
|
|
14
|
+
"full-revisionid": "34ac954b8edd87e367e4e1f54b4179aee54e2816",
|
|
15
|
+
"version": "0.39"
|
|
16
|
+
}
|
|
17
|
+
''' # END VERSION_JSON
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_versions():
|
|
21
|
+
return json.loads(version_json)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from defusedxml.ElementTree import fromstring, tostring
|
|
2
2
|
from functools import singledispatch
|
|
3
|
-
from typing import TypeVar
|
|
3
|
+
from typing import TypeVar, overload
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
# the redact method can handle either strings or bytes, but it can't mix them.
|
|
@@ -41,3 +41,27 @@ def _(xml: str) -> str:
|
|
|
41
41
|
@redact_xml.register # type: ignore[no-redef]
|
|
42
42
|
def _(xml: bytes) -> bytes:
|
|
43
43
|
return _redact_any_type(bytearray(xml), b"password", b"..[redacted]")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@overload
|
|
47
|
+
def nullable_str_to_int(value: None) -> None: ...
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@overload
|
|
51
|
+
def nullable_str_to_int(value: str) -> int: ...
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def nullable_str_to_int(value):
|
|
55
|
+
return int(value) if value is not None else None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@overload
|
|
59
|
+
def nullable_str_to_bool(value: None) -> None: ...
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@overload
|
|
63
|
+
def nullable_str_to_bool(value: str) -> bool: ...
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def nullable_str_to_bool(value):
|
|
67
|
+
return str(value).lower() == "true" if value is not None else None
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from tableauserverclient.models.collection_item import CollectionItem
|
|
1
2
|
from tableauserverclient.models.column_item import ColumnItem
|
|
2
3
|
from tableauserverclient.models.connection_credentials import ConnectionCredentials
|
|
3
4
|
from tableauserverclient.models.connection_item import ConnectionItem
|
|
@@ -9,6 +10,7 @@ from tableauserverclient.models.data_freshness_policy_item import DataFreshnessP
|
|
|
9
10
|
from tableauserverclient.models.datasource_item import DatasourceItem
|
|
10
11
|
from tableauserverclient.models.dqw_item import DQWItem
|
|
11
12
|
from tableauserverclient.models.exceptions import UnpopulatedPropertyError
|
|
13
|
+
from tableauserverclient.models.extensions_item import ExtensionsServer, ExtensionsSiteSettings, SafeExtension
|
|
12
14
|
from tableauserverclient.models.favorites_item import FavoriteItem
|
|
13
15
|
from tableauserverclient.models.fileupload_item import FileuploadItem
|
|
14
16
|
from tableauserverclient.models.flow_item import FlowItem
|
|
@@ -28,14 +30,16 @@ from tableauserverclient.models.linked_tasks_item import (
|
|
|
28
30
|
LinkedTaskStepItem,
|
|
29
31
|
LinkedTaskFlowRunItem,
|
|
30
32
|
)
|
|
33
|
+
from tableauserverclient.models.location_item import LocationItem
|
|
31
34
|
from tableauserverclient.models.metric_item import MetricItem
|
|
35
|
+
from tableauserverclient.models.oidc_item import SiteOIDCConfiguration
|
|
32
36
|
from tableauserverclient.models.pagination_item import PaginationItem
|
|
33
37
|
from tableauserverclient.models.permissions_item import PermissionsRule, Permission
|
|
34
38
|
from tableauserverclient.models.project_item import ProjectItem
|
|
35
39
|
from tableauserverclient.models.revision_item import RevisionItem
|
|
36
40
|
from tableauserverclient.models.schedule_item import ScheduleItem
|
|
37
41
|
from tableauserverclient.models.server_info_item import ServerInfoItem
|
|
38
|
-
from tableauserverclient.models.site_item import SiteItem
|
|
42
|
+
from tableauserverclient.models.site_item import SiteItem, SiteAuthConfiguration
|
|
39
43
|
from tableauserverclient.models.subscription_item import SubscriptionItem
|
|
40
44
|
from tableauserverclient.models.table_item import TableItem
|
|
41
45
|
from tableauserverclient.models.tableau_auth import Credentials, TableauAuth, PersonalAccessTokenAuth, JWTAuth
|
|
@@ -48,8 +52,10 @@ from tableauserverclient.models.view_item import ViewItem
|
|
|
48
52
|
from tableauserverclient.models.virtual_connection_item import VirtualConnectionItem
|
|
49
53
|
from tableauserverclient.models.webhook_item import WebhookItem
|
|
50
54
|
from tableauserverclient.models.workbook_item import WorkbookItem
|
|
55
|
+
from tableauserverclient.models.extract_item import ExtractItem
|
|
51
56
|
|
|
52
57
|
__all__ = [
|
|
58
|
+
"CollectionItem",
|
|
53
59
|
"ColumnItem",
|
|
54
60
|
"ConnectionCredentials",
|
|
55
61
|
"ConnectionItem",
|
|
@@ -75,7 +81,9 @@ __all__ = [
|
|
|
75
81
|
"MonthlyInterval",
|
|
76
82
|
"HourlyInterval",
|
|
77
83
|
"BackgroundJobItem",
|
|
84
|
+
"LocationItem",
|
|
78
85
|
"MetricItem",
|
|
86
|
+
"SiteOIDCConfiguration",
|
|
79
87
|
"PaginationItem",
|
|
80
88
|
"Permission",
|
|
81
89
|
"PermissionsRule",
|
|
@@ -83,7 +91,9 @@ __all__ = [
|
|
|
83
91
|
"RevisionItem",
|
|
84
92
|
"ScheduleItem",
|
|
85
93
|
"ServerInfoItem",
|
|
94
|
+
"SiteAuthConfiguration",
|
|
86
95
|
"SiteItem",
|
|
96
|
+
"SiteOIDCConfiguration",
|
|
87
97
|
"SubscriptionItem",
|
|
88
98
|
"TableItem",
|
|
89
99
|
"TableauAuth",
|
|
@@ -103,4 +113,8 @@ __all__ = [
|
|
|
103
113
|
"LinkedTaskItem",
|
|
104
114
|
"LinkedTaskStepItem",
|
|
105
115
|
"LinkedTaskFlowRunItem",
|
|
116
|
+
"ExtractItem",
|
|
117
|
+
"ExtensionsServer",
|
|
118
|
+
"ExtensionsSiteSettings",
|
|
119
|
+
"SafeExtension",
|
|
106
120
|
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from xml.etree.ElementTree import Element
|
|
4
|
+
|
|
5
|
+
from defusedxml.ElementTree import fromstring
|
|
6
|
+
from typing_extensions import Self
|
|
7
|
+
|
|
8
|
+
from tableauserverclient.datetime_helpers import parse_datetime
|
|
9
|
+
from tableauserverclient.models.user_item import UserItem
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CollectionItem:
|
|
13
|
+
def __init__(self) -> None:
|
|
14
|
+
self.id: Optional[str] = None
|
|
15
|
+
self.name: Optional[str] = None
|
|
16
|
+
self.description: Optional[str] = None
|
|
17
|
+
self.created_at: Optional[datetime] = None
|
|
18
|
+
self.updated_at: Optional[datetime] = None
|
|
19
|
+
self.owner: Optional[UserItem] = None
|
|
20
|
+
self.total_item_count: Optional[int] = None
|
|
21
|
+
self.permissioned_item_count: Optional[int] = None
|
|
22
|
+
self.visibility: Optional[str] = None # Assuming visibility is a string, adjust as necessary
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def from_response(cls, response: bytes, ns) -> list[Self]:
|
|
26
|
+
parsed_response = fromstring(response)
|
|
27
|
+
|
|
28
|
+
collection_elements = parsed_response.findall(".//t:collection", namespaces=ns)
|
|
29
|
+
if not collection_elements:
|
|
30
|
+
raise ValueError("No collection element found in the response")
|
|
31
|
+
|
|
32
|
+
collections = [cls.from_xml(c, ns) for c in collection_elements]
|
|
33
|
+
return collections
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def from_xml(cls, xml: Element, ns) -> Self:
|
|
37
|
+
collection_item = cls()
|
|
38
|
+
collection_item.id = xml.get("id")
|
|
39
|
+
collection_item.name = xml.get("name")
|
|
40
|
+
collection_item.description = xml.get("description")
|
|
41
|
+
collection_item.created_at = parse_datetime(xml.get("createdAt"))
|
|
42
|
+
collection_item.updated_at = parse_datetime(xml.get("updatedAt"))
|
|
43
|
+
owner_element = xml.find(".//t:owner", namespaces=ns)
|
|
44
|
+
if owner_element is not None:
|
|
45
|
+
collection_item.owner = UserItem.from_xml(owner_element, ns)
|
|
46
|
+
else:
|
|
47
|
+
collection_item.owner = None
|
|
48
|
+
collection_item.total_item_count = int(xml.get("totalItemCount", 0))
|
|
49
|
+
collection_item.permissioned_item_count = int(xml.get("permissionedItemCount", 0))
|
|
50
|
+
collection_item.visibility = xml.get("visibility")
|
|
51
|
+
|
|
52
|
+
return collection_item
|
|
@@ -41,6 +41,9 @@ class ConnectionItem:
|
|
|
41
41
|
server_port: str
|
|
42
42
|
The port used for the connection.
|
|
43
43
|
|
|
44
|
+
auth_type: str
|
|
45
|
+
Specifies the type of authentication used by the connection.
|
|
46
|
+
|
|
44
47
|
connection_credentials: ConnectionCredentials
|
|
45
48
|
The Connection Credentials object containing authentication details for
|
|
46
49
|
the connection. Replaces username/password/embed_password when
|
|
@@ -59,6 +62,7 @@ class ConnectionItem:
|
|
|
59
62
|
self.username: Optional[str] = None
|
|
60
63
|
self.connection_credentials: Optional[ConnectionCredentials] = None
|
|
61
64
|
self._query_tagging: Optional[bool] = None
|
|
65
|
+
self._auth_type: Optional[str] = None
|
|
62
66
|
|
|
63
67
|
@property
|
|
64
68
|
def datasource_id(self) -> Optional[str]:
|
|
@@ -91,8 +95,16 @@ class ConnectionItem:
|
|
|
91
95
|
return
|
|
92
96
|
self._query_tagging = value
|
|
93
97
|
|
|
98
|
+
@property
|
|
99
|
+
def auth_type(self) -> Optional[str]:
|
|
100
|
+
return self._auth_type
|
|
101
|
+
|
|
102
|
+
@auth_type.setter
|
|
103
|
+
def auth_type(self, value: Optional[str]):
|
|
104
|
+
self._auth_type = value
|
|
105
|
+
|
|
94
106
|
def __repr__(self):
|
|
95
|
-
return "<ConnectionItem#{_id} embed={embed_password} type={_connection_type} username={username}>".format(
|
|
107
|
+
return "<ConnectionItem#{_id} embed={embed_password} type={_connection_type} auth={_auth_type} username={username}>".format(
|
|
96
108
|
**self.__dict__
|
|
97
109
|
)
|
|
98
110
|
|
|
@@ -108,10 +120,11 @@ class ConnectionItem:
|
|
|
108
120
|
connection_item.embed_password = string_to_bool(connection_xml.get("embedPassword", ""))
|
|
109
121
|
connection_item.server_address = connection_xml.get("serverAddress", connection_xml.get("server", None))
|
|
110
122
|
connection_item.server_port = connection_xml.get("serverPort", connection_xml.get("port", None))
|
|
111
|
-
connection_item.username = connection_xml.get("userName", None)
|
|
123
|
+
connection_item.username = connection_xml.get("userName", connection_xml.get("username", None))
|
|
112
124
|
connection_item._query_tagging = (
|
|
113
125
|
string_to_bool(s) if (s := connection_xml.get("queryTagging", None)) else None
|
|
114
126
|
)
|
|
127
|
+
connection_item._auth_type = connection_xml.get("authenticationType", None)
|
|
115
128
|
datasource_elem = connection_xml.find(".//t:datasource", namespaces=ns)
|
|
116
129
|
if datasource_elem is not None:
|
|
117
130
|
connection_item._datasource_id = datasource_elem.get("id", None)
|
|
@@ -139,6 +152,7 @@ class ConnectionItem:
|
|
|
139
152
|
|
|
140
153
|
connection_item.server_address = connection_xml.get("serverAddress", None)
|
|
141
154
|
connection_item.server_port = connection_xml.get("serverPort", None)
|
|
155
|
+
connection_item._auth_type = connection_xml.get("authenticationType", None)
|
|
142
156
|
|
|
143
157
|
connection_credentials = connection_xml.find(".//t:connectionCredentials", namespaces=ns)
|
|
144
158
|
|
|
@@ -158,10 +158,18 @@ class CustomViewItem:
|
|
|
158
158
|
def workbook(self) -> Optional[WorkbookItem]:
|
|
159
159
|
return self._workbook
|
|
160
160
|
|
|
161
|
+
@workbook.setter
|
|
162
|
+
def workbook(self, value: WorkbookItem) -> None:
|
|
163
|
+
self._workbook = value
|
|
164
|
+
|
|
161
165
|
@property
|
|
162
166
|
def view(self) -> Optional[ViewItem]:
|
|
163
167
|
return self._view
|
|
164
168
|
|
|
169
|
+
@view.setter
|
|
170
|
+
def view(self, value: ViewItem) -> None:
|
|
171
|
+
self._view = value
|
|
172
|
+
|
|
165
173
|
@classmethod
|
|
166
174
|
def from_response(cls, resp, ns, workbook_id="") -> Optional["CustomViewItem"]:
|
|
167
175
|
item = cls.list_from_response(resp, ns, workbook_id)
|
|
@@ -66,7 +66,7 @@ class DataFreshnessPolicyItem:
|
|
|
66
66
|
return self._interval_item
|
|
67
67
|
|
|
68
68
|
@interval_item.setter
|
|
69
|
-
def interval_item(self, value: list[str]):
|
|
69
|
+
def interval_item(self, value: Optional[list[str]]):
|
|
70
70
|
self._interval_item = value
|
|
71
71
|
|
|
72
72
|
@property
|
|
@@ -127,7 +127,7 @@ class DataFreshnessPolicyItem:
|
|
|
127
127
|
return self._fresh_every_schedule
|
|
128
128
|
|
|
129
129
|
@fresh_every_schedule.setter
|
|
130
|
-
def fresh_every_schedule(self, value: FreshEvery):
|
|
130
|
+
def fresh_every_schedule(self, value: Optional[FreshEvery]):
|
|
131
131
|
self._fresh_every_schedule = value
|
|
132
132
|
|
|
133
133
|
@property
|
|
@@ -135,7 +135,7 @@ class DataFreshnessPolicyItem:
|
|
|
135
135
|
return self._fresh_at_schedule
|
|
136
136
|
|
|
137
137
|
@fresh_at_schedule.setter
|
|
138
|
-
def fresh_at_schedule(self, value: FreshAt):
|
|
138
|
+
def fresh_at_schedule(self, value: Optional[FreshAt]):
|
|
139
139
|
self._fresh_at_schedule = value
|
|
140
140
|
|
|
141
141
|
@classmethod
|
|
@@ -6,9 +6,11 @@ from typing import Optional
|
|
|
6
6
|
from defusedxml.ElementTree import fromstring
|
|
7
7
|
|
|
8
8
|
from tableauserverclient.datetime_helpers import parse_datetime
|
|
9
|
+
from tableauserverclient.helpers.strings import nullable_str_to_bool, nullable_str_to_int
|
|
9
10
|
from tableauserverclient.models.connection_item import ConnectionItem
|
|
10
11
|
from tableauserverclient.models.exceptions import UnpopulatedPropertyError
|
|
11
12
|
from tableauserverclient.models.permissions_item import PermissionsRule
|
|
13
|
+
from tableauserverclient.models.project_item import ProjectItem
|
|
12
14
|
from tableauserverclient.models.property_decorators import (
|
|
13
15
|
property_not_nullable,
|
|
14
16
|
property_is_boolean,
|
|
@@ -16,6 +18,7 @@ from tableauserverclient.models.property_decorators import (
|
|
|
16
18
|
)
|
|
17
19
|
from tableauserverclient.models.revision_item import RevisionItem
|
|
18
20
|
from tableauserverclient.models.tag_item import TagItem
|
|
21
|
+
from tableauserverclient.models.user_item import UserItem
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
class DatasourceItem:
|
|
@@ -40,6 +43,9 @@ class DatasourceItem:
|
|
|
40
43
|
specified, it will default to SiteDefault. See REST API Publish
|
|
41
44
|
Datasource for more information about ask_data_enablement.
|
|
42
45
|
|
|
46
|
+
connected_workbooks_count : Optional[int]
|
|
47
|
+
The number of workbooks connected to the datasource.
|
|
48
|
+
|
|
43
49
|
connections : list[ConnectionItem]
|
|
44
50
|
The list of data connections (ConnectionItem) for the specified data
|
|
45
51
|
source. You must first call the populate_connections method to access
|
|
@@ -67,6 +73,12 @@ class DatasourceItem:
|
|
|
67
73
|
A Boolean value to determine if a datasource should be encrypted or not.
|
|
68
74
|
See Extract and Encryption Methods for more information.
|
|
69
75
|
|
|
76
|
+
favorites_total : Optional[int]
|
|
77
|
+
The number of users who have marked the data source as a favorite.
|
|
78
|
+
|
|
79
|
+
has_alert : Optional[bool]
|
|
80
|
+
A Boolean value that indicates whether the data source has an alert.
|
|
81
|
+
|
|
70
82
|
has_extracts : Optional[bool]
|
|
71
83
|
A Boolean value that indicates whether the datasource has extracts.
|
|
72
84
|
|
|
@@ -75,13 +87,22 @@ class DatasourceItem:
|
|
|
75
87
|
specific data source or to delete a data source with the get_by_id and
|
|
76
88
|
delete methods.
|
|
77
89
|
|
|
90
|
+
is_published : Optional[bool]
|
|
91
|
+
A Boolean value that indicates whether the data source is published.
|
|
92
|
+
|
|
78
93
|
name : Optional[str]
|
|
79
94
|
The name of the data source. If not specified, the name of the published
|
|
80
95
|
data source file is used.
|
|
81
96
|
|
|
97
|
+
owner: Optional[UserItem]
|
|
98
|
+
The owner of the data source.
|
|
99
|
+
|
|
82
100
|
owner_id : Optional[str]
|
|
83
101
|
The identifier of the owner of the data source.
|
|
84
102
|
|
|
103
|
+
project : Optional[ProjectItem]
|
|
104
|
+
The project that the data source belongs to.
|
|
105
|
+
|
|
85
106
|
project_id : Optional[str]
|
|
86
107
|
The identifier of the project associated with the data source. You must
|
|
87
108
|
provide this identifier when you create an instance of a DatasourceItem.
|
|
@@ -89,6 +110,9 @@ class DatasourceItem:
|
|
|
89
110
|
project_name : Optional[str]
|
|
90
111
|
The name of the project associated with the data source.
|
|
91
112
|
|
|
113
|
+
server_name : Optional[str]
|
|
114
|
+
The name of the server where the data source is published.
|
|
115
|
+
|
|
92
116
|
tags : Optional[set[str]]
|
|
93
117
|
The tags (list of strings) that have been added to the data source.
|
|
94
118
|
|
|
@@ -143,6 +167,13 @@ class DatasourceItem:
|
|
|
143
167
|
self.owner_id: Optional[str] = None
|
|
144
168
|
self.project_id: Optional[str] = project_id
|
|
145
169
|
self.tags: set[str] = set()
|
|
170
|
+
self._connected_workbooks_count: Optional[int] = None
|
|
171
|
+
self._favorites_total: Optional[int] = None
|
|
172
|
+
self._has_alert: Optional[bool] = None
|
|
173
|
+
self._is_published: Optional[bool] = None
|
|
174
|
+
self._server_name: Optional[str] = None
|
|
175
|
+
self._project: Optional[ProjectItem] = None
|
|
176
|
+
self._owner: Optional[UserItem] = None
|
|
146
177
|
|
|
147
178
|
self._permissions = None
|
|
148
179
|
self._data_quality_warnings = None
|
|
@@ -274,14 +305,42 @@ class DatasourceItem:
|
|
|
274
305
|
def size(self) -> Optional[int]:
|
|
275
306
|
return self._size
|
|
276
307
|
|
|
308
|
+
@property
|
|
309
|
+
def connected_workbooks_count(self) -> Optional[int]:
|
|
310
|
+
return self._connected_workbooks_count
|
|
311
|
+
|
|
312
|
+
@property
|
|
313
|
+
def favorites_total(self) -> Optional[int]:
|
|
314
|
+
return self._favorites_total
|
|
315
|
+
|
|
316
|
+
@property
|
|
317
|
+
def has_alert(self) -> Optional[bool]:
|
|
318
|
+
return self._has_alert
|
|
319
|
+
|
|
320
|
+
@property
|
|
321
|
+
def is_published(self) -> Optional[bool]:
|
|
322
|
+
return self._is_published
|
|
323
|
+
|
|
324
|
+
@property
|
|
325
|
+
def server_name(self) -> Optional[str]:
|
|
326
|
+
return self._server_name
|
|
327
|
+
|
|
328
|
+
@property
|
|
329
|
+
def project(self) -> Optional[ProjectItem]:
|
|
330
|
+
return self._project
|
|
331
|
+
|
|
332
|
+
@property
|
|
333
|
+
def owner(self) -> Optional[UserItem]:
|
|
334
|
+
return self._owner
|
|
335
|
+
|
|
277
336
|
def _set_connections(self, connections) -> None:
|
|
278
337
|
self._connections = connections
|
|
279
338
|
|
|
280
339
|
def _set_permissions(self, permissions):
|
|
281
340
|
self._permissions = permissions
|
|
282
341
|
|
|
283
|
-
def _set_data_quality_warnings(self,
|
|
284
|
-
self._data_quality_warnings =
|
|
342
|
+
def _set_data_quality_warnings(self, dqw):
|
|
343
|
+
self._data_quality_warnings = dqw
|
|
285
344
|
|
|
286
345
|
def _set_revisions(self, revisions):
|
|
287
346
|
self._revisions = revisions
|
|
@@ -310,6 +369,13 @@ class DatasourceItem:
|
|
|
310
369
|
use_remote_query_agent,
|
|
311
370
|
webpage_url,
|
|
312
371
|
size,
|
|
372
|
+
connected_workbooks_count,
|
|
373
|
+
favorites_total,
|
|
374
|
+
has_alert,
|
|
375
|
+
is_published,
|
|
376
|
+
server_name,
|
|
377
|
+
project,
|
|
378
|
+
owner,
|
|
313
379
|
) = self._parse_element(datasource_xml, ns)
|
|
314
380
|
self._set_values(
|
|
315
381
|
ask_data_enablement,
|
|
@@ -331,6 +397,13 @@ class DatasourceItem:
|
|
|
331
397
|
use_remote_query_agent,
|
|
332
398
|
webpage_url,
|
|
333
399
|
size,
|
|
400
|
+
connected_workbooks_count,
|
|
401
|
+
favorites_total,
|
|
402
|
+
has_alert,
|
|
403
|
+
is_published,
|
|
404
|
+
server_name,
|
|
405
|
+
project,
|
|
406
|
+
owner,
|
|
334
407
|
)
|
|
335
408
|
return self
|
|
336
409
|
|
|
@@ -355,6 +428,13 @@ class DatasourceItem:
|
|
|
355
428
|
use_remote_query_agent,
|
|
356
429
|
webpage_url,
|
|
357
430
|
size,
|
|
431
|
+
connected_workbooks_count,
|
|
432
|
+
favorites_total,
|
|
433
|
+
has_alert,
|
|
434
|
+
is_published,
|
|
435
|
+
server_name,
|
|
436
|
+
project,
|
|
437
|
+
owner,
|
|
358
438
|
):
|
|
359
439
|
if ask_data_enablement is not None:
|
|
360
440
|
self._ask_data_enablement = ask_data_enablement
|
|
@@ -394,9 +474,23 @@ class DatasourceItem:
|
|
|
394
474
|
self._webpage_url = webpage_url
|
|
395
475
|
if size is not None:
|
|
396
476
|
self._size = int(size)
|
|
477
|
+
if connected_workbooks_count is not None:
|
|
478
|
+
self._connected_workbooks_count = connected_workbooks_count
|
|
479
|
+
if favorites_total is not None:
|
|
480
|
+
self._favorites_total = favorites_total
|
|
481
|
+
if has_alert is not None:
|
|
482
|
+
self._has_alert = has_alert
|
|
483
|
+
if is_published is not None:
|
|
484
|
+
self._is_published = is_published
|
|
485
|
+
if server_name is not None:
|
|
486
|
+
self._server_name = server_name
|
|
487
|
+
if project is not None:
|
|
488
|
+
self._project = project
|
|
489
|
+
if owner is not None:
|
|
490
|
+
self._owner = owner
|
|
397
491
|
|
|
398
492
|
@classmethod
|
|
399
|
-
def from_response(cls, resp:
|
|
493
|
+
def from_response(cls, resp: bytes, ns: dict) -> list["DatasourceItem"]:
|
|
400
494
|
all_datasource_items = list()
|
|
401
495
|
parsed_response = fromstring(resp)
|
|
402
496
|
all_datasource_xml = parsed_response.findall(".//t:datasource", namespaces=ns)
|
|
@@ -428,6 +522,11 @@ class DatasourceItem:
|
|
|
428
522
|
use_remote_query_agent = datasource_xml.get("useRemoteQueryAgent", None)
|
|
429
523
|
webpage_url = datasource_xml.get("webpageUrl", None)
|
|
430
524
|
size = datasource_xml.get("size", None)
|
|
525
|
+
connected_workbooks_count = nullable_str_to_int(datasource_xml.get("connectedWorkbooksCount", None))
|
|
526
|
+
favorites_total = nullable_str_to_int(datasource_xml.get("favoritesTotal", None))
|
|
527
|
+
has_alert = nullable_str_to_bool(datasource_xml.get("hasAlert", None))
|
|
528
|
+
is_published = nullable_str_to_bool(datasource_xml.get("isPublished", None))
|
|
529
|
+
server_name = datasource_xml.get("serverName", None)
|
|
431
530
|
|
|
432
531
|
tags = None
|
|
433
532
|
tags_elem = datasource_xml.find(".//t:tags", namespaces=ns)
|
|
@@ -436,14 +535,18 @@ class DatasourceItem:
|
|
|
436
535
|
|
|
437
536
|
project_id = None
|
|
438
537
|
project_name = None
|
|
538
|
+
project = None
|
|
439
539
|
project_elem = datasource_xml.find(".//t:project", namespaces=ns)
|
|
440
540
|
if project_elem is not None:
|
|
541
|
+
project = ProjectItem.from_xml(project_elem, ns)
|
|
441
542
|
project_id = project_elem.get("id", None)
|
|
442
543
|
project_name = project_elem.get("name", None)
|
|
443
544
|
|
|
444
545
|
owner_id = None
|
|
546
|
+
owner = None
|
|
445
547
|
owner_elem = datasource_xml.find(".//t:owner", namespaces=ns)
|
|
446
548
|
if owner_elem is not None:
|
|
549
|
+
owner = UserItem.from_xml(owner_elem, ns)
|
|
447
550
|
owner_id = owner_elem.get("id", None)
|
|
448
551
|
|
|
449
552
|
ask_data_enablement = None
|
|
@@ -471,4 +574,11 @@ class DatasourceItem:
|
|
|
471
574
|
use_remote_query_agent,
|
|
472
575
|
webpage_url,
|
|
473
576
|
size,
|
|
577
|
+
connected_workbooks_count,
|
|
578
|
+
favorites_total,
|
|
579
|
+
has_alert,
|
|
580
|
+
is_published,
|
|
581
|
+
server_name,
|
|
582
|
+
project,
|
|
583
|
+
owner,
|
|
474
584
|
)
|