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.
Files changed (118) hide show
  1. tableauserverclient/bin/_version.py → _version.py +3 -3
  2. bin/__init__.py +3 -0
  3. bin/_version.py +21 -0
  4. {tableauserverclient/helpers → helpers}/strings.py +25 -1
  5. {tableauserverclient/models → models}/__init__.py +15 -1
  6. models/collection_item.py +52 -0
  7. {tableauserverclient/models → models}/connection_item.py +16 -2
  8. {tableauserverclient/models → models}/custom_view_item.py +8 -0
  9. {tableauserverclient/models → models}/data_freshness_policy_item.py +3 -3
  10. {tableauserverclient/models → models}/datasource_item.py +113 -3
  11. models/extensions_item.py +186 -0
  12. models/extract_item.py +82 -0
  13. {tableauserverclient/models → models}/favorites_item.py +21 -8
  14. {tableauserverclient/models → models}/flow_item.py +3 -3
  15. {tableauserverclient/models → models}/group_item.py +18 -1
  16. {tableauserverclient/models → models}/groupset_item.py +14 -0
  17. {tableauserverclient/models → models}/interval_item.py +42 -1
  18. models/location_item.py +53 -0
  19. models/oidc_item.py +82 -0
  20. {tableauserverclient/models → models}/permissions_item.py +2 -0
  21. {tableauserverclient/models → models}/project_item.py +141 -29
  22. {tableauserverclient/models → models}/property_decorators.py +2 -2
  23. {tableauserverclient/models → models}/reference_item.py +12 -6
  24. {tableauserverclient/models → models}/schedule_item.py +67 -1
  25. {tableauserverclient/models → models}/site_item.py +54 -0
  26. {tableauserverclient/models → models}/table_item.py +7 -3
  27. {tableauserverclient/models → models}/tableau_auth.py +13 -6
  28. {tableauserverclient/models → models}/tableau_types.py +13 -1
  29. {tableauserverclient/models → models}/user_item.py +111 -4
  30. {tableauserverclient/models → models}/view_item.py +79 -5
  31. {tableauserverclient/models → models}/workbook_item.py +153 -3
  32. {tableauserverclient/server → server}/endpoint/__init__.py +4 -0
  33. {tableauserverclient/server → server}/endpoint/databases_endpoint.py +101 -18
  34. {tableauserverclient/server → server}/endpoint/datasources_endpoint.py +155 -25
  35. {tableauserverclient/server → server}/endpoint/dqw_endpoint.py +16 -6
  36. {tableauserverclient/server → server}/endpoint/endpoint.py +39 -0
  37. server/endpoint/extensions_endpoint.py +79 -0
  38. {tableauserverclient/server → server}/endpoint/flow_task_endpoint.py +1 -1
  39. {tableauserverclient/server → server}/endpoint/flows_endpoint.py +5 -4
  40. server/endpoint/oidc_endpoint.py +157 -0
  41. {tableauserverclient/server → server}/endpoint/projects_endpoint.py +12 -0
  42. server/endpoint/schedules_endpoint.py +328 -0
  43. {tableauserverclient/server → server}/endpoint/sites_endpoint.py +18 -1
  44. {tableauserverclient/server → server}/endpoint/tables_endpoint.py +140 -17
  45. {tableauserverclient/server → server}/endpoint/users_endpoint.py +296 -10
  46. {tableauserverclient/server → server}/endpoint/views_endpoint.py +23 -0
  47. {tableauserverclient/server → server}/endpoint/workbooks_endpoint.py +124 -9
  48. {tableauserverclient/server → server}/query.py +36 -0
  49. {tableauserverclient/server → server}/request_factory.py +286 -2
  50. {tableauserverclient/server → server}/request_options.py +139 -3
  51. {tableauserverclient/server → server}/server.py +46 -0
  52. {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/METADATA +5 -26
  53. tableauserverclient-0.39.dist-info/RECORD +107 -0
  54. {tableauserverclient-0.37.dist-info → tableauserverclient-0.39.dist-info}/WHEEL +1 -1
  55. tableauserverclient-0.39.dist-info/top_level.txt +4 -0
  56. tableauserverclient/__init__.py +0 -141
  57. tableauserverclient/config.py +0 -27
  58. tableauserverclient/datetime_helpers.py +0 -45
  59. tableauserverclient/exponential_backoff.py +0 -30
  60. tableauserverclient/filesys_helpers.py +0 -63
  61. tableauserverclient/namespace.py +0 -37
  62. tableauserverclient/py.typed +0 -0
  63. tableauserverclient/server/endpoint/schedules_endpoint.py +0 -151
  64. tableauserverclient-0.37.dist-info/RECORD +0 -106
  65. tableauserverclient-0.37.dist-info/licenses/LICENSE.versioneer +0 -7
  66. tableauserverclient-0.37.dist-info/top_level.txt +0 -1
  67. {tableauserverclient/helpers → helpers}/__init__.py +0 -0
  68. {tableauserverclient/helpers → helpers}/headers.py +0 -0
  69. {tableauserverclient/helpers → helpers}/logging.py +0 -0
  70. {tableauserverclient/models → models}/column_item.py +0 -0
  71. {tableauserverclient/models → models}/connection_credentials.py +0 -0
  72. {tableauserverclient/models → models}/data_acceleration_report_item.py +0 -0
  73. {tableauserverclient/models → models}/data_alert_item.py +0 -0
  74. {tableauserverclient/models → models}/database_item.py +0 -0
  75. {tableauserverclient/models → models}/dqw_item.py +0 -0
  76. {tableauserverclient/models → models}/exceptions.py +0 -0
  77. {tableauserverclient/models → models}/fileupload_item.py +0 -0
  78. {tableauserverclient/models → models}/flow_run_item.py +0 -0
  79. {tableauserverclient/models → models}/job_item.py +0 -0
  80. {tableauserverclient/models → models}/linked_tasks_item.py +0 -0
  81. {tableauserverclient/models → models}/metric_item.py +0 -0
  82. {tableauserverclient/models → models}/pagination_item.py +0 -0
  83. {tableauserverclient/models → models}/revision_item.py +0 -0
  84. {tableauserverclient/models → models}/server_info_item.py +0 -0
  85. {tableauserverclient/models → models}/subscription_item.py +0 -0
  86. {tableauserverclient/models → models}/tag_item.py +0 -0
  87. {tableauserverclient/models → models}/target.py +0 -0
  88. {tableauserverclient/models → models}/task_item.py +0 -0
  89. {tableauserverclient/models → models}/virtual_connection_item.py +0 -0
  90. {tableauserverclient/models → models}/webhook_item.py +0 -0
  91. {tableauserverclient/server → server}/__init__.py +0 -0
  92. {tableauserverclient/server → server}/endpoint/auth_endpoint.py +0 -0
  93. {tableauserverclient/server → server}/endpoint/custom_views_endpoint.py +0 -0
  94. {tableauserverclient/server → server}/endpoint/data_acceleration_report_endpoint.py +0 -0
  95. {tableauserverclient/server → server}/endpoint/data_alert_endpoint.py +0 -0
  96. {tableauserverclient/server → server}/endpoint/default_permissions_endpoint.py +0 -0
  97. {tableauserverclient/server → server}/endpoint/exceptions.py +0 -0
  98. {tableauserverclient/server → server}/endpoint/favorites_endpoint.py +0 -0
  99. {tableauserverclient/server → server}/endpoint/fileuploads_endpoint.py +0 -0
  100. {tableauserverclient/server → server}/endpoint/flow_runs_endpoint.py +0 -0
  101. {tableauserverclient/server → server}/endpoint/groups_endpoint.py +0 -0
  102. {tableauserverclient/server → server}/endpoint/groupsets_endpoint.py +0 -0
  103. {tableauserverclient/server → server}/endpoint/jobs_endpoint.py +0 -0
  104. {tableauserverclient/server → server}/endpoint/linked_tasks_endpoint.py +0 -0
  105. {tableauserverclient/server → server}/endpoint/metadata_endpoint.py +0 -0
  106. {tableauserverclient/server → server}/endpoint/metrics_endpoint.py +0 -0
  107. {tableauserverclient/server → server}/endpoint/permissions_endpoint.py +0 -0
  108. {tableauserverclient/server → server}/endpoint/resource_tagger.py +0 -0
  109. {tableauserverclient/server → server}/endpoint/server_info_endpoint.py +0 -0
  110. {tableauserverclient/server → server}/endpoint/subscriptions_endpoint.py +0 -0
  111. {tableauserverclient/server → server}/endpoint/tasks_endpoint.py +0 -0
  112. {tableauserverclient/server → server}/endpoint/virtual_connections_endpoint.py +0 -0
  113. {tableauserverclient/server → server}/endpoint/webhooks_endpoint.py +0 -0
  114. {tableauserverclient/server → server}/exceptions.py +0 -0
  115. {tableauserverclient/server → server}/filter.py +0 -0
  116. {tableauserverclient/server → server}/pager.py +0 -0
  117. {tableauserverclient/server → server}/sort.py +0 -0
  118. {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": "2025-03-24T09:59:27-0700",
11
+ "date": "2026-02-02T11:01:51-0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "bf857041ed16dccf9c2aa494dbd0e6a6e6a62d66",
15
- "version": "0.37"
14
+ "full-revisionid": "34ac954b8edd87e367e4e1f54b4179aee54e2816",
15
+ "version": "0.39"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
bin/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ # generated during initial setup of versioneer
2
+ from . import _version
3
+ __version__ = _version.get_versions()['version']
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, dqws):
284
- self._data_quality_warnings = dqws
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: str, ns: dict) -> list["DatasourceItem"]:
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
  )