tableauserverclient 0.30.post0.dev1__py3-none-any.whl → 0.32__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 (37) hide show
  1. tableauserverclient/__init__.py +64 -4
  2. tableauserverclient/_version.py +3 -3
  3. tableauserverclient/models/__init__.py +88 -37
  4. tableauserverclient/models/datasource_item.py +18 -6
  5. tableauserverclient/models/favorites_item.py +7 -7
  6. tableauserverclient/models/permissions_item.py +46 -1
  7. tableauserverclient/models/project_item.py +4 -3
  8. tableauserverclient/models/reference_item.py +5 -0
  9. tableauserverclient/models/tableau_auth.py +22 -23
  10. tableauserverclient/server/__init__.py +83 -8
  11. tableauserverclient/server/endpoint/__init__.py +61 -28
  12. tableauserverclient/server/endpoint/custom_views_endpoint.py +1 -1
  13. tableauserverclient/server/endpoint/databases_endpoint.py +0 -11
  14. tableauserverclient/server/endpoint/datasources_endpoint.py +12 -28
  15. tableauserverclient/server/endpoint/endpoint.py +23 -8
  16. tableauserverclient/server/endpoint/favorites_endpoint.py +1 -1
  17. tableauserverclient/server/endpoint/flow_runs_endpoint.py +1 -1
  18. tableauserverclient/server/endpoint/flows_endpoint.py +1 -11
  19. tableauserverclient/server/endpoint/groups_endpoint.py +3 -17
  20. tableauserverclient/server/endpoint/jobs_endpoint.py +1 -1
  21. tableauserverclient/server/endpoint/metadata_endpoint.py +3 -3
  22. tableauserverclient/server/endpoint/metrics_endpoint.py +1 -1
  23. tableauserverclient/server/endpoint/projects_endpoint.py +7 -18
  24. tableauserverclient/server/endpoint/tables_endpoint.py +0 -10
  25. tableauserverclient/server/endpoint/users_endpoint.py +1 -1
  26. tableauserverclient/server/endpoint/views_endpoint.py +4 -2
  27. tableauserverclient/server/endpoint/workbooks_endpoint.py +7 -36
  28. tableauserverclient/server/pager.py +47 -46
  29. tableauserverclient/server/query.py +61 -33
  30. tableauserverclient/server/request_factory.py +14 -42
  31. tableauserverclient/server/server.py +5 -6
  32. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/METADATA +3 -4
  33. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/RECORD +37 -37
  34. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/WHEEL +1 -1
  35. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE +0 -0
  36. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/LICENSE.versioneer +0 -0
  37. {tableauserverclient-0.30.post0.dev1.dist-info → tableauserverclient-0.32.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- from ._version import get_versions
2
- from .namespace import NEW_NAMESPACE as DEFAULT_NAMESPACE
3
- from .models import (
1
+ from tableauserverclient._version import get_versions
2
+ from tableauserverclient.namespace import NEW_NAMESPACE as DEFAULT_NAMESPACE
3
+ from tableauserverclient.models import (
4
4
  BackgroundJobItem,
5
5
  ColumnItem,
6
6
  ConnectionCredentials,
@@ -43,7 +43,8 @@ from .models import (
43
43
  WeeklyInterval,
44
44
  WorkbookItem,
45
45
  )
46
- from .server import (
46
+
47
+ from tableauserverclient.server import (
47
48
  CSVRequestOptions,
48
49
  ExcelRequestOptions,
49
50
  ImageRequestOptions,
@@ -57,3 +58,62 @@ from .server import (
57
58
  Server,
58
59
  Sort,
59
60
  )
61
+
62
+ __all__ = [
63
+ "get_versions",
64
+ "DEFAULT_NAMESPACE",
65
+ "BackgroundJobItem",
66
+ "BackgroundJobItem",
67
+ "ColumnItem",
68
+ "ConnectionCredentials",
69
+ "ConnectionItem",
70
+ "CustomViewItem",
71
+ "DQWItem",
72
+ "DailyInterval",
73
+ "DataAlertItem",
74
+ "DatabaseItem",
75
+ "DataFreshnessPolicyItem",
76
+ "DatasourceItem",
77
+ "FavoriteItem",
78
+ "FlowItem",
79
+ "FlowRunItem",
80
+ "FileuploadItem",
81
+ "GroupItem",
82
+ "HourlyInterval",
83
+ "IntervalItem",
84
+ "JobItem",
85
+ "JWTAuth",
86
+ "MetricItem",
87
+ "MonthlyInterval",
88
+ "PaginationItem",
89
+ "Permission",
90
+ "PermissionsRule",
91
+ "PersonalAccessTokenAuth",
92
+ "ProjectItem",
93
+ "RevisionItem",
94
+ "ScheduleItem",
95
+ "SiteItem",
96
+ "ServerInfoItem",
97
+ "SubscriptionItem",
98
+ "TableItem",
99
+ "TableauAuth",
100
+ "Target",
101
+ "TaskItem",
102
+ "UserItem",
103
+ "ViewItem",
104
+ "WebhookItem",
105
+ "WeeklyInterval",
106
+ "WorkbookItem",
107
+ "CSVRequestOptions",
108
+ "ExcelRequestOptions",
109
+ "ImageRequestOptions",
110
+ "PDFRequestOptions",
111
+ "RequestOptions",
112
+ "MissingRequiredFieldError",
113
+ "NotSignedInError",
114
+ "ServerResponseError",
115
+ "Filter",
116
+ "Pager",
117
+ "Server",
118
+ "Sort",
119
+ ]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-06-03T12:52:39-0700",
11
+ "date": "2024-07-27T15:44:04-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "4018a0ffc01bfa7c5b0024c6f112ced158d420b9",
15
- "version": "0.30.post0.dev1"
14
+ "full-revisionid": "257cf616f35cc36b24a73e9e102886a52ead1853",
15
+ "version": "0.32"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1,43 +1,94 @@
1
- from .column_item import ColumnItem
2
- from .connection_credentials import ConnectionCredentials
3
- from .connection_item import ConnectionItem
4
- from .custom_view_item import CustomViewItem
5
- from .data_acceleration_report_item import DataAccelerationReportItem
6
- from .data_alert_item import DataAlertItem
7
- from .database_item import DatabaseItem
8
- from .data_freshness_policy_item import DataFreshnessPolicyItem
9
- from .datasource_item import DatasourceItem
10
- from .dqw_item import DQWItem
11
- from .exceptions import UnpopulatedPropertyError
12
- from .favorites_item import FavoriteItem
13
- from .fileupload_item import FileuploadItem
14
- from .flow_item import FlowItem
15
- from .flow_run_item import FlowRunItem
16
- from .group_item import GroupItem
17
- from .interval_item import (
1
+ from tableauserverclient.models.column_item import ColumnItem
2
+ from tableauserverclient.models.connection_credentials import ConnectionCredentials
3
+ from tableauserverclient.models.connection_item import ConnectionItem
4
+ from tableauserverclient.models.custom_view_item import CustomViewItem
5
+ from tableauserverclient.models.data_acceleration_report_item import DataAccelerationReportItem
6
+ from tableauserverclient.models.data_alert_item import DataAlertItem
7
+ from tableauserverclient.models.database_item import DatabaseItem
8
+ from tableauserverclient.models.data_freshness_policy_item import DataFreshnessPolicyItem
9
+ from tableauserverclient.models.datasource_item import DatasourceItem
10
+ from tableauserverclient.models.dqw_item import DQWItem
11
+ from tableauserverclient.models.exceptions import UnpopulatedPropertyError
12
+ from tableauserverclient.models.favorites_item import FavoriteItem
13
+ from tableauserverclient.models.fileupload_item import FileuploadItem
14
+ from tableauserverclient.models.flow_item import FlowItem
15
+ from tableauserverclient.models.flow_run_item import FlowRunItem
16
+ from tableauserverclient.models.group_item import GroupItem
17
+ from tableauserverclient.models.interval_item import (
18
18
  IntervalItem,
19
19
  DailyInterval,
20
20
  WeeklyInterval,
21
21
  MonthlyInterval,
22
22
  HourlyInterval,
23
23
  )
24
- from .job_item import JobItem, BackgroundJobItem
25
- from .metric_item import MetricItem
26
- from .pagination_item import PaginationItem
27
- from .permissions_item import PermissionsRule, Permission
28
- from .project_item import ProjectItem
29
- from .revision_item import RevisionItem
30
- from .schedule_item import ScheduleItem
31
- from .server_info_item import ServerInfoItem
32
- from .site_item import SiteItem
33
- from .subscription_item import SubscriptionItem
34
- from .table_item import TableItem
35
- from .tableau_auth import Credentials, TableauAuth, PersonalAccessTokenAuth, JWTAuth
36
- from .tableau_types import Resource, TableauItem, plural_type
37
- from .tag_item import TagItem
38
- from .target import Target
39
- from .task_item import TaskItem
40
- from .user_item import UserItem
41
- from .view_item import ViewItem
42
- from .webhook_item import WebhookItem
43
- from .workbook_item import WorkbookItem
24
+ from tableauserverclient.models.job_item import JobItem, BackgroundJobItem
25
+ from tableauserverclient.models.metric_item import MetricItem
26
+ from tableauserverclient.models.pagination_item import PaginationItem
27
+ from tableauserverclient.models.permissions_item import PermissionsRule, Permission
28
+ from tableauserverclient.models.project_item import ProjectItem
29
+ from tableauserverclient.models.revision_item import RevisionItem
30
+ from tableauserverclient.models.schedule_item import ScheduleItem
31
+ from tableauserverclient.models.server_info_item import ServerInfoItem
32
+ from tableauserverclient.models.site_item import SiteItem
33
+ from tableauserverclient.models.subscription_item import SubscriptionItem
34
+ from tableauserverclient.models.table_item import TableItem
35
+ from tableauserverclient.models.tableau_auth import Credentials, TableauAuth, PersonalAccessTokenAuth, JWTAuth
36
+ from tableauserverclient.models.tableau_types import Resource, TableauItem, plural_type
37
+ from tableauserverclient.models.tag_item import TagItem
38
+ from tableauserverclient.models.target import Target
39
+ from tableauserverclient.models.task_item import TaskItem
40
+ from tableauserverclient.models.user_item import UserItem
41
+ from tableauserverclient.models.view_item import ViewItem
42
+ from tableauserverclient.models.webhook_item import WebhookItem
43
+ from tableauserverclient.models.workbook_item import WorkbookItem
44
+
45
+ __all__ = [
46
+ "ColumnItem",
47
+ "ConnectionCredentials",
48
+ "ConnectionItem",
49
+ "Credentials",
50
+ "CustomViewItem",
51
+ "DataAccelerationReportItem",
52
+ "DataAlertItem",
53
+ "DatabaseItem",
54
+ "DataFreshnessPolicyItem",
55
+ "DatasourceItem",
56
+ "DQWItem",
57
+ "UnpopulatedPropertyError",
58
+ "FavoriteItem",
59
+ "FileuploadItem",
60
+ "FlowItem",
61
+ "FlowRunItem",
62
+ "GroupItem",
63
+ "IntervalItem",
64
+ "JobItem",
65
+ "DailyInterval",
66
+ "WeeklyInterval",
67
+ "MonthlyInterval",
68
+ "HourlyInterval",
69
+ "BackgroundJobItem",
70
+ "MetricItem",
71
+ "PaginationItem",
72
+ "Permission",
73
+ "PermissionsRule",
74
+ "ProjectItem",
75
+ "RevisionItem",
76
+ "ScheduleItem",
77
+ "ServerInfoItem",
78
+ "SiteItem",
79
+ "SubscriptionItem",
80
+ "TableItem",
81
+ "TableauAuth",
82
+ "PersonalAccessTokenAuth",
83
+ "JWTAuth",
84
+ "Resource",
85
+ "TableauItem",
86
+ "plural_type",
87
+ "TagItem",
88
+ "Target",
89
+ "TaskItem",
90
+ "UserItem",
91
+ "ViewItem",
92
+ "WebhookItem",
93
+ "WorkbookItem",
94
+ ]
@@ -6,16 +6,16 @@ from typing import Dict, List, Optional, Set, Tuple
6
6
  from defusedxml.ElementTree import fromstring
7
7
 
8
8
  from tableauserverclient.datetime_helpers import parse_datetime
9
- from .connection_item import ConnectionItem
10
- from .exceptions import UnpopulatedPropertyError
11
- from .permissions_item import PermissionsRule
12
- from .property_decorators import (
9
+ from tableauserverclient.models.connection_item import ConnectionItem
10
+ from tableauserverclient.models.exceptions import UnpopulatedPropertyError
11
+ from tableauserverclient.models.permissions_item import PermissionsRule
12
+ from tableauserverclient.models.property_decorators import (
13
13
  property_not_nullable,
14
14
  property_is_boolean,
15
15
  property_is_enum,
16
16
  )
17
- from .revision_item import RevisionItem
18
- from .tag_item import TagItem
17
+ from tableauserverclient.models.revision_item import RevisionItem
18
+ from tableauserverclient.models.tag_item import TagItem
19
19
 
20
20
 
21
21
  class DatasourceItem(object):
@@ -47,6 +47,7 @@ class DatasourceItem(object):
47
47
  self._initial_tags: Set = set()
48
48
  self._project_name: Optional[str] = None
49
49
  self._revisions = None
50
+ self._size: Optional[int] = None
50
51
  self._updated_at = None
51
52
  self._use_remote_query_agent = None
52
53
  self._webpage_url = None
@@ -182,6 +183,10 @@ class DatasourceItem(object):
182
183
  raise UnpopulatedPropertyError(error)
183
184
  return self._revisions()
184
185
 
186
+ @property
187
+ def size(self) -> Optional[int]:
188
+ return self._size
189
+
185
190
  def _set_connections(self, connections):
186
191
  self._connections = connections
187
192
 
@@ -217,6 +222,7 @@ class DatasourceItem(object):
217
222
  updated_at,
218
223
  use_remote_query_agent,
219
224
  webpage_url,
225
+ size,
220
226
  ) = self._parse_element(datasource_xml, ns)
221
227
  self._set_values(
222
228
  ask_data_enablement,
@@ -237,6 +243,7 @@ class DatasourceItem(object):
237
243
  updated_at,
238
244
  use_remote_query_agent,
239
245
  webpage_url,
246
+ size,
240
247
  )
241
248
  return self
242
249
 
@@ -260,6 +267,7 @@ class DatasourceItem(object):
260
267
  updated_at,
261
268
  use_remote_query_agent,
262
269
  webpage_url,
270
+ size,
263
271
  ):
264
272
  if ask_data_enablement is not None:
265
273
  self._ask_data_enablement = ask_data_enablement
@@ -297,6 +305,8 @@ class DatasourceItem(object):
297
305
  self._use_remote_query_agent = str(use_remote_query_agent).lower() == "true"
298
306
  if webpage_url:
299
307
  self._webpage_url = webpage_url
308
+ if size is not None:
309
+ self._size = int(size)
300
310
 
301
311
  @classmethod
302
312
  def from_response(cls, resp: str, ns: Dict) -> List["DatasourceItem"]:
@@ -330,6 +340,7 @@ class DatasourceItem(object):
330
340
  has_extracts = datasource_xml.get("hasExtracts", None)
331
341
  use_remote_query_agent = datasource_xml.get("useRemoteQueryAgent", None)
332
342
  webpage_url = datasource_xml.get("webpageUrl", None)
343
+ size = datasource_xml.get("size", None)
333
344
 
334
345
  tags = None
335
346
  tags_elem = datasource_xml.find(".//t:tags", namespaces=ns)
@@ -372,4 +383,5 @@ class DatasourceItem(object):
372
383
  updated_at,
373
384
  use_remote_query_agent,
374
385
  webpage_url,
386
+ size,
375
387
  )
@@ -1,14 +1,14 @@
1
1
  import logging
2
2
 
3
3
  from defusedxml.ElementTree import fromstring
4
- from .tableau_types import TableauItem
4
+ from tableauserverclient.models.tableau_types import TableauItem
5
5
 
6
- from .datasource_item import DatasourceItem
7
- from .flow_item import FlowItem
8
- from .project_item import ProjectItem
9
- from .metric_item import MetricItem
10
- from .view_item import ViewItem
11
- from .workbook_item import WorkbookItem
6
+ from tableauserverclient.models.datasource_item import DatasourceItem
7
+ from tableauserverclient.models.flow_item import FlowItem
8
+ from tableauserverclient.models.project_item import ProjectItem
9
+ from tableauserverclient.models.metric_item import MetricItem
10
+ from tableauserverclient.models.view_item import ViewItem
11
+ from tableauserverclient.models.workbook_item import WorkbookItem
12
12
  from typing import Dict, List
13
13
 
14
14
  from tableauserverclient.helpers.logging import logger
@@ -45,7 +45,7 @@ class Permission:
45
45
  return "<Enum Capability: AddComment | ChangeHierarchy | ChangePermission ... (17 more) >"
46
46
 
47
47
 
48
- class PermissionsRule(object):
48
+ class PermissionsRule:
49
49
  def __init__(self, grantee: ResourceReference, capabilities: Dict[str, str]) -> None:
50
50
  self.grantee = grantee
51
51
  self.capabilities = capabilities
@@ -53,6 +53,51 @@ class PermissionsRule(object):
53
53
  def __repr__(self):
54
54
  return "<PermissionsRule grantee={}, capabilities={}>".format(self.grantee, self.capabilities)
55
55
 
56
+ def __eq__(self, other: object) -> bool:
57
+ if not hasattr(other, "grantee") or not hasattr(other, "capabilities"):
58
+ return False
59
+ return self.grantee == other.grantee and self.capabilities == other.capabilities
60
+
61
+ def __and__(self, other: "PermissionsRule") -> "PermissionsRule":
62
+ if self.grantee != other.grantee:
63
+ raise ValueError("Cannot AND two permissions rules with different grantees")
64
+
65
+ if self.capabilities == other.capabilities:
66
+ return self
67
+
68
+ capabilities = set((*self.capabilities.keys(), *other.capabilities.keys()))
69
+ new_capabilities = {}
70
+ for capability in capabilities:
71
+ if (self.capabilities.get(capability), other.capabilities.get(capability)) == (
72
+ Permission.Mode.Allow,
73
+ Permission.Mode.Allow,
74
+ ):
75
+ new_capabilities[capability] = Permission.Mode.Allow
76
+ elif Permission.Mode.Deny in (self.capabilities.get(capability), other.capabilities.get(capability)):
77
+ new_capabilities[capability] = Permission.Mode.Deny
78
+
79
+ return PermissionsRule(self.grantee, new_capabilities)
80
+
81
+ def __or__(self, other: "PermissionsRule") -> "PermissionsRule":
82
+ if self.grantee != other.grantee:
83
+ raise ValueError("Cannot OR two permissions rules with different grantees")
84
+
85
+ if self.capabilities == other.capabilities:
86
+ return self
87
+
88
+ capabilities = set((*self.capabilities.keys(), *other.capabilities.keys()))
89
+ new_capabilities = {}
90
+ for capability in capabilities:
91
+ if Permission.Mode.Allow in (self.capabilities.get(capability), other.capabilities.get(capability)):
92
+ new_capabilities[capability] = Permission.Mode.Allow
93
+ elif (self.capabilities.get(capability), other.capabilities.get(capability)) == (
94
+ Permission.Mode.Deny,
95
+ Permission.Mode.Deny,
96
+ ):
97
+ new_capabilities[capability] = Permission.Mode.Deny
98
+
99
+ return PermissionsRule(self.grantee, new_capabilities)
100
+
56
101
  @classmethod
57
102
  def from_response(cls, resp, ns=None) -> List["PermissionsRule"]:
58
103
  parsed_response = fromstring(resp)
@@ -4,8 +4,8 @@ from typing import List, Optional
4
4
 
5
5
  from defusedxml.ElementTree import fromstring
6
6
 
7
- from .exceptions import UnpopulatedPropertyError
8
- from .property_decorators import property_is_enum, property_not_empty
7
+ from tableauserverclient.models.exceptions import UnpopulatedPropertyError
8
+ from tableauserverclient.models.property_decorators import property_is_enum, property_not_empty
9
9
 
10
10
 
11
11
  class ProjectItem(object):
@@ -34,6 +34,7 @@ class ProjectItem(object):
34
34
  self.content_permissions: Optional[str] = content_permissions
35
35
  self.parent_id: Optional[str] = parent_id
36
36
  self._samples: Optional[bool] = samples
37
+ self._owner_id: Optional[str] = None
37
38
 
38
39
  self._permissions = None
39
40
  self._default_workbook_permissions = None
@@ -119,7 +120,7 @@ class ProjectItem(object):
119
120
 
120
121
  @owner_id.setter
121
122
  def owner_id(self, value: str) -> None:
122
- raise NotImplementedError("REST API does not currently support updating project owner.")
123
+ self._owner_id = value
123
124
 
124
125
  def is_default(self):
125
126
  return self.name.lower() == "default"
@@ -8,6 +8,11 @@ class ResourceReference(object):
8
8
 
9
9
  __repr__ = __str__
10
10
 
11
+ def __eq__(self, other: object) -> bool:
12
+ if not hasattr(other, "id") or not hasattr(other, "tag_name"):
13
+ return False
14
+ return (self.id == other.id) and (self.tag_name == other.tag_name)
15
+
11
16
  @property
12
17
  def id(self):
13
18
  return self._id
@@ -1,16 +1,20 @@
1
1
  import abc
2
+ from typing import Dict, Optional
2
3
 
3
4
 
4
5
  class Credentials(abc.ABC):
5
- def __init__(self, site_id=None, user_id_to_impersonate=None):
6
+ def __init__(self, site_id: Optional[str] = None, user_id_to_impersonate: Optional[str] = None) -> None:
6
7
  self.site_id = site_id or ""
7
8
  self.user_id_to_impersonate = user_id_to_impersonate or None
8
9
 
9
10
  @property
10
11
  @abc.abstractmethod
11
- def credentials(self):
12
- credentials = "Credentials can be username/password, Personal Access Token, or JWT"
13
- +"This method returns values to set as an attribute on the credentials element of the request"
12
+ def credentials(self) -> Dict[str, str]:
13
+ credentials = (
14
+ "Credentials can be username/password, Personal Access Token, or JWT"
15
+ "This method returns values to set as an attribute on the credentials element of the request"
16
+ )
17
+ return {"key": "value"}
14
18
 
15
19
  @abc.abstractmethod
16
20
  def __repr__(self):
@@ -28,10 +32,9 @@ def deprecate_site_attribute():
28
32
 
29
33
  # The traditional auth type: username/password
30
34
  class TableauAuth(Credentials):
31
- def __init__(self, username, password, site=None, site_id=None, user_id_to_impersonate=None):
32
- if site is not None:
33
- deprecate_site_attribute()
34
- site_id = site
35
+ def __init__(
36
+ self, username: str, password: str, site_id: Optional[str] = None, user_id_to_impersonate: Optional[str] = None
37
+ ) -> None:
35
38
  super().__init__(site_id, user_id_to_impersonate)
36
39
  if password is None:
37
40
  raise TabError("Must provide a password when using traditional authentication")
@@ -39,7 +42,7 @@ class TableauAuth(Credentials):
39
42
  self.username = username
40
43
 
41
44
  @property
42
- def credentials(self):
45
+ def credentials(self) -> Dict[str, str]:
43
46
  return {"name": self.username, "password": self.password}
44
47
 
45
48
  def __repr__(self):
@@ -49,20 +52,16 @@ class TableauAuth(Credentials):
49
52
  uid = ""
50
53
  return f"<Credentials username={self.username} password=redacted (site={self.site_id}{uid})>"
51
54
 
52
- @property
53
- def site(self):
54
- deprecate_site_attribute()
55
- return self.site_id
56
-
57
- @site.setter
58
- def site(self, value):
59
- deprecate_site_attribute()
60
- self.site_id = value
61
-
62
55
 
63
56
  # A Tableau-generated Personal Access Token
64
57
  class PersonalAccessTokenAuth(Credentials):
65
- def __init__(self, token_name, personal_access_token, site_id=None, user_id_to_impersonate=None):
58
+ def __init__(
59
+ self,
60
+ token_name: str,
61
+ personal_access_token: str,
62
+ site_id: Optional[str] = None,
63
+ user_id_to_impersonate: Optional[str] = None,
64
+ ) -> None:
66
65
  if personal_access_token is None or token_name is None:
67
66
  raise TabError("Must provide a token and token name when using PAT authentication")
68
67
  super().__init__(site_id=site_id, user_id_to_impersonate=user_id_to_impersonate)
@@ -70,7 +69,7 @@ class PersonalAccessTokenAuth(Credentials):
70
69
  self.personal_access_token = personal_access_token
71
70
 
72
71
  @property
73
- def credentials(self):
72
+ def credentials(self) -> Dict[str, str]:
74
73
  return {
75
74
  "personalAccessTokenName": self.token_name,
76
75
  "personalAccessTokenSecret": self.personal_access_token,
@@ -89,14 +88,14 @@ class PersonalAccessTokenAuth(Credentials):
89
88
 
90
89
  # A standard JWT generated specifically for Tableau
91
90
  class JWTAuth(Credentials):
92
- def __init__(self, jwt: str, site_id=None, user_id_to_impersonate=None):
91
+ def __init__(self, jwt: str, site_id: Optional[str] = None, user_id_to_impersonate: Optional[str] = None) -> None:
93
92
  if jwt is None:
94
93
  raise TabError("Must provide a JWT token when using JWT authentication")
95
94
  super().__init__(site_id, user_id_to_impersonate)
96
95
  self.jwt = jwt
97
96
 
98
97
  @property
99
- def credentials(self):
98
+ def credentials(self) -> Dict[str, str]:
100
99
  return {"jwt": self.jwt}
101
100
 
102
101
  def __repr__(self):
@@ -1,16 +1,91 @@
1
1
  # These two imports must come first
2
- from .request_factory import RequestFactory
3
- from .request_options import (
2
+ from tableauserverclient.server.request_factory import RequestFactory
3
+ from tableauserverclient.server.request_options import (
4
4
  CSVRequestOptions,
5
5
  ExcelRequestOptions,
6
6
  ImageRequestOptions,
7
7
  PDFRequestOptions,
8
8
  RequestOptions,
9
9
  )
10
+ from tableauserverclient.server.filter import Filter
11
+ from tableauserverclient.server.sort import Sort
12
+ from tableauserverclient.server.server import Server
13
+ from tableauserverclient.server.pager import Pager
14
+ from tableauserverclient.server.endpoint.exceptions import NotSignedInError
10
15
 
11
- from .filter import Filter
12
- from .sort import Sort
13
- from .endpoint import *
14
- from .server import Server
15
- from .pager import Pager
16
- from .endpoint.exceptions import NotSignedInError
16
+ from tableauserverclient.server.endpoint import (
17
+ Auth,
18
+ CustomViews,
19
+ DataAccelerationReport,
20
+ DataAlerts,
21
+ Databases,
22
+ Datasources,
23
+ QuerysetEndpoint,
24
+ MissingRequiredFieldError,
25
+ Endpoint,
26
+ Favorites,
27
+ Fileuploads,
28
+ FlowRuns,
29
+ Flows,
30
+ FlowTasks,
31
+ Groups,
32
+ Jobs,
33
+ Metadata,
34
+ Metrics,
35
+ Projects,
36
+ Schedules,
37
+ ServerInfo,
38
+ ServerResponseError,
39
+ Sites,
40
+ Subscriptions,
41
+ Tables,
42
+ Tasks,
43
+ Users,
44
+ Views,
45
+ Webhooks,
46
+ Workbooks,
47
+ )
48
+
49
+ __all__ = [
50
+ "RequestFactory",
51
+ "CSVRequestOptions",
52
+ "ExcelRequestOptions",
53
+ "ImageRequestOptions",
54
+ "PDFRequestOptions",
55
+ "RequestOptions",
56
+ "Filter",
57
+ "Sort",
58
+ "Server",
59
+ "Pager",
60
+ "NotSignedInError",
61
+ "Auth",
62
+ "CustomViews",
63
+ "DataAccelerationReport",
64
+ "DataAlerts",
65
+ "Databases",
66
+ "Datasources",
67
+ "QuerysetEndpoint",
68
+ "MissingRequiredFieldError",
69
+ "Endpoint",
70
+ "Favorites",
71
+ "Fileuploads",
72
+ "FlowRuns",
73
+ "Flows",
74
+ "FlowTasks",
75
+ "Groups",
76
+ "Jobs",
77
+ "Metadata",
78
+ "Metrics",
79
+ "Projects",
80
+ "Schedules",
81
+ "ServerInfo",
82
+ "ServerResponseError",
83
+ "Sites",
84
+ "Subscriptions",
85
+ "Tables",
86
+ "Tasks",
87
+ "Users",
88
+ "Views",
89
+ "Webhooks",
90
+ "Workbooks",
91
+ ]