tableauserverclient 0.38__py3-none-any.whl → 0.40__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 (46) hide show
  1. _version.py +21 -0
  2. tableauserverclient/__init__.py +10 -5
  3. tableauserverclient/bin/__init__.py +3 -0
  4. tableauserverclient/bin/_version.py +3 -3
  5. tableauserverclient/models/__init__.py +9 -0
  6. tableauserverclient/models/collection_item.py +52 -0
  7. tableauserverclient/models/connection_item.py +16 -2
  8. tableauserverclient/models/custom_view_item.py +8 -0
  9. tableauserverclient/models/data_freshness_policy_item.py +3 -3
  10. tableauserverclient/models/datasource_item.py +3 -1
  11. tableauserverclient/models/extensions_item.py +186 -0
  12. tableauserverclient/models/favorites_item.py +21 -8
  13. tableauserverclient/models/flow_item.py +1 -1
  14. tableauserverclient/models/group_item.py +7 -1
  15. tableauserverclient/models/groupset_item.py +14 -0
  16. tableauserverclient/models/interval_item.py +2 -1
  17. tableauserverclient/models/oidc_item.py +82 -0
  18. tableauserverclient/models/permissions_item.py +2 -0
  19. tableauserverclient/models/project_item.py +3 -2
  20. tableauserverclient/models/property_decorators.py +2 -2
  21. tableauserverclient/models/reference_item.py +12 -6
  22. tableauserverclient/models/schedule_item.py +10 -1
  23. tableauserverclient/models/site_item.py +26 -0
  24. tableauserverclient/models/tableau_auth.py +13 -6
  25. tableauserverclient/models/user_item.py +10 -3
  26. tableauserverclient/models/workbook_item.py +2 -2
  27. tableauserverclient/server/endpoint/__init__.py +4 -0
  28. tableauserverclient/server/endpoint/datasources_endpoint.py +152 -22
  29. tableauserverclient/server/endpoint/extensions_endpoint.py +79 -0
  30. tableauserverclient/server/endpoint/flow_task_endpoint.py +1 -1
  31. tableauserverclient/server/endpoint/flows_endpoint.py +5 -4
  32. tableauserverclient/server/endpoint/oidc_endpoint.py +157 -0
  33. tableauserverclient/server/endpoint/projects_endpoint.py +12 -0
  34. tableauserverclient/server/endpoint/schedules_endpoint.py +48 -1
  35. tableauserverclient/server/endpoint/users_endpoint.py +274 -5
  36. tableauserverclient/server/endpoint/views_endpoint.py +23 -0
  37. tableauserverclient/server/endpoint/workbooks_endpoint.py +124 -9
  38. tableauserverclient/server/request_factory.py +281 -2
  39. tableauserverclient/server/request_options.py +12 -2
  40. tableauserverclient/server/server.py +4 -0
  41. {tableauserverclient-0.38.dist-info → tableauserverclient-0.40.dist-info}/METADATA +5 -26
  42. {tableauserverclient-0.38.dist-info → tableauserverclient-0.40.dist-info}/RECORD +45 -39
  43. {tableauserverclient-0.38.dist-info → tableauserverclient-0.40.dist-info}/WHEEL +1 -1
  44. tableauserverclient-0.38.dist-info/licenses/LICENSE.versioneer +0 -7
  45. {tableauserverclient-0.38.dist-info → tableauserverclient-0.40.dist-info}/licenses/LICENSE +0 -0
  46. {tableauserverclient-0.38.dist-info → tableauserverclient-0.40.dist-info}/top_level.txt +0 -0
@@ -184,6 +184,9 @@ class DatasourceRequest:
184
184
  project_element = ET.SubElement(datasource_element, "project")
185
185
  project_element.attrib["id"] = datasource_item.project_id
186
186
 
187
+ if datasource_item.description is not None:
188
+ datasource_element.attrib["description"] = datasource_item.description
189
+
187
190
  if connection_credentials is not None and connections is not None:
188
191
  raise RuntimeError("You cannot set both `connections` and `connection_credentials`")
189
192
 
@@ -196,7 +199,7 @@ class DatasourceRequest:
196
199
  _add_connections_element(connections_element, connection)
197
200
  return ET.tostring(xml_request)
198
201
 
199
- def update_req(self, datasource_item):
202
+ def update_req(self, datasource_item: DatasourceItem) -> bytes:
200
203
  xml_request = ET.Element("tsRequest")
201
204
  datasource_element = ET.SubElement(xml_request, "datasource")
202
205
  if datasource_item.name:
@@ -219,6 +222,8 @@ class DatasourceRequest:
219
222
  datasource_element.attrib["certificationNote"] = str(datasource_item.certification_note)
220
223
  if datasource_item.encrypt_extracts is not None:
221
224
  datasource_element.attrib["encryptExtracts"] = str(datasource_item.encrypt_extracts).lower()
225
+ if datasource_item.description is not None:
226
+ datasource_element.attrib["description"] = datasource_item.description
222
227
 
223
228
  return ET.tostring(xml_request)
224
229
 
@@ -244,6 +249,32 @@ class DatasourceRequest:
244
249
  parts = {"request_payload": ("", xml_request, "text/xml")}
245
250
  return _add_multipart(parts)
246
251
 
252
+ @_tsrequest_wrapped
253
+ def update_connections_req(
254
+ self,
255
+ element: ET.Element,
256
+ connection_luids: Iterable[str],
257
+ authentication_type: str,
258
+ username: Optional[str] = None,
259
+ password: Optional[str] = None,
260
+ embed_password: Optional[bool] = None,
261
+ ):
262
+ conn_luids_elem = ET.SubElement(element, "connectionLUIDs")
263
+ for luid in connection_luids:
264
+ ET.SubElement(conn_luids_elem, "connectionLUID").text = luid
265
+
266
+ connection_elem = ET.SubElement(element, "connection")
267
+ connection_elem.set("authenticationType", authentication_type)
268
+
269
+ if username is not None:
270
+ connection_elem.set("userName", username)
271
+
272
+ if password is not None:
273
+ connection_elem.set("password", password)
274
+
275
+ if embed_password is not None:
276
+ connection_elem.set("embedPassword", str(embed_password).lower())
277
+
247
278
 
248
279
  class DQWRequest:
249
280
  def add_req(self, dqw_item):
@@ -486,7 +517,10 @@ class PermissionRequest:
486
517
  for rule in rules:
487
518
  grantee_capabilities_element = ET.SubElement(permissions_element, "granteeCapabilities")
488
519
  grantee_element = ET.SubElement(grantee_capabilities_element, rule.grantee.tag_name)
489
- grantee_element.attrib["id"] = rule.grantee.id
520
+ if rule.grantee.id is not None:
521
+ grantee_element.attrib["id"] = rule.grantee.id
522
+ else:
523
+ raise ValueError("Grantee must have an ID")
490
524
 
491
525
  capabilities_element = ET.SubElement(grantee_capabilities_element, "capabilities")
492
526
  self._add_all_capabilities(capabilities_element, rule.capabilities)
@@ -609,6 +643,16 @@ class ScheduleRequest:
609
643
  def add_flow_req(self, id_: Optional[str], task_type: str = TaskItem.Type.RunFlow) -> bytes:
610
644
  return self._add_to_req(id_, "flow", task_type)
611
645
 
646
+ @_tsrequest_wrapped
647
+ def batch_update_state(self, xml: ET.Element, schedules: Iterable[ScheduleItem | str]) -> None:
648
+ luids = ET.SubElement(xml, "scheduleLuids")
649
+ for schedule in schedules:
650
+ luid = getattr(schedule, "id", schedule)
651
+ if not isinstance(luid, str):
652
+ continue
653
+ luid_tag = ET.SubElement(luids, "scheduleLuid")
654
+ luid_tag.text = luid
655
+
612
656
 
613
657
  class SiteRequest:
614
658
  def update_req(self, site_item: "SiteItem", parent_srv: Optional["Server"] = None):
@@ -715,6 +759,8 @@ class SiteRequest:
715
759
  site_element.attrib["autoSuspendRefreshInactivityWindow"] = str(
716
760
  site_item.auto_suspend_refresh_inactivity_window
717
761
  )
762
+ if site_item.attribute_capture_enabled is not None:
763
+ site_element.attrib["attributeCaptureEnabled"] = str(site_item.attribute_capture_enabled).lower()
718
764
 
719
765
  return ET.tostring(xml_request)
720
766
 
@@ -819,6 +865,8 @@ class SiteRequest:
819
865
  site_element.attrib["autoSuspendRefreshInactivityWindow"] = str(
820
866
  site_item.auto_suspend_refresh_inactivity_window
821
867
  )
868
+ if site_item.attribute_capture_enabled is not None:
869
+ site_element.attrib["attributeCaptureEnabled"] = str(site_item.attribute_capture_enabled).lower()
822
870
 
823
871
  return ET.tostring(xml_request)
824
872
 
@@ -894,6 +942,7 @@ class TagRequest:
894
942
  if item.id is None:
895
943
  raise ValueError(f"Item {item} must have an ID to be tagged.")
896
944
  content_element.attrib["id"] = item.id
945
+ content_element.attrib["contentType"] = item.__class__.__name__.replace("Item", "")
897
946
 
898
947
  return ET.tostring(element)
899
948
 
@@ -936,6 +985,32 @@ class UserRequest:
936
985
  user_element.attrib["idpConfigurationId"] = user_item.idp_configuration_id
937
986
  return ET.tostring(xml_request)
938
987
 
988
+ def import_from_csv_req(self, csv_content: bytes, users: Iterable[UserItem]):
989
+ xml_request = ET.Element("tsRequest")
990
+ for user in users:
991
+ if user.name is None:
992
+ raise ValueError("User name must be populated.")
993
+ user_element = ET.SubElement(xml_request, "user")
994
+ user_element.attrib["name"] = user.name
995
+ if user.auth_setting is not None and user.idp_configuration_id is not None:
996
+ raise ValueError("User cannot have both authSetting and idpConfigurationId.")
997
+ elif user.idp_configuration_id is not None:
998
+ user_element.attrib["idpConfigurationId"] = user.idp_configuration_id
999
+ else:
1000
+ user_element.attrib["authSetting"] = user.auth_setting or "ServerDefault"
1001
+
1002
+ parts = {
1003
+ "tableau_user_import": ("tsc_users_file.csv", csv_content, "file"),
1004
+ "request_payload": ("", ET.tostring(xml_request), "text/xml"),
1005
+ }
1006
+ return _add_multipart(parts)
1007
+
1008
+ def delete_csv_req(self, csv_content: bytes):
1009
+ parts = {
1010
+ "tableau_user_delete": ("tsc_users_file.csv", csv_content, "file"),
1011
+ }
1012
+ return _add_multipart(parts)
1013
+
939
1014
 
940
1015
  class WorkbookRequest:
941
1016
  def _generate_xml(
@@ -1092,6 +1167,32 @@ class WorkbookRequest:
1092
1167
  if (id_ := datasource_item.id) is not None:
1093
1168
  datasource_element.attrib["id"] = id_
1094
1169
 
1170
+ @_tsrequest_wrapped
1171
+ def update_connections_req(
1172
+ self,
1173
+ element: ET.Element,
1174
+ connection_luids: Iterable[str],
1175
+ authentication_type: str,
1176
+ username: Optional[str] = None,
1177
+ password: Optional[str] = None,
1178
+ embed_password: Optional[bool] = None,
1179
+ ):
1180
+ conn_luids_elem = ET.SubElement(element, "connectionLUIDs")
1181
+ for luid in connection_luids:
1182
+ ET.SubElement(conn_luids_elem, "connectionLUID").text = luid
1183
+
1184
+ connection_elem = ET.SubElement(element, "connection")
1185
+ connection_elem.set("authenticationType", authentication_type)
1186
+
1187
+ if username is not None:
1188
+ connection_elem.set("userName", username)
1189
+
1190
+ if password is not None:
1191
+ connection_elem.set("password", password)
1192
+
1193
+ if embed_password is not None:
1194
+ connection_elem.set("embedPassword", str(embed_password).lower())
1195
+
1095
1196
 
1096
1197
  class Connection:
1097
1198
  @_tsrequest_wrapped
@@ -1110,6 +1211,8 @@ class Connection:
1110
1211
  connection_element.attrib["userName"] = connection_item.username
1111
1212
  if connection_item.password is not None:
1112
1213
  connection_element.attrib["password"] = connection_item.password
1214
+ if connection_item.auth_type is not None:
1215
+ connection_element.attrib["authenticationType"] = connection_item.auth_type
1113
1216
  if connection_item.embed_password is not None:
1114
1217
  connection_element.attrib["embedPassword"] = str(connection_item.embed_password).lower()
1115
1218
  if connection_item.query_tagging is not None:
@@ -1446,6 +1549,180 @@ class VirtualConnectionRequest:
1446
1549
  return ET.tostring(xml_request)
1447
1550
 
1448
1551
 
1552
+ class OIDCRequest:
1553
+ @_tsrequest_wrapped
1554
+ def create_req(self, xml_request: ET.Element, oidc_item: SiteOIDCConfiguration) -> bytes:
1555
+ oidc_element = ET.SubElement(xml_request, "siteOIDCConfiguration")
1556
+
1557
+ # Check required attributes first
1558
+
1559
+ if oidc_item.idp_configuration_name is None:
1560
+ raise ValueError(f"OIDC Item missing idp_configuration_name: {oidc_item}")
1561
+ if oidc_item.client_id is None:
1562
+ raise ValueError(f"OIDC Item missing client_id: {oidc_item}")
1563
+ if oidc_item.client_secret is None:
1564
+ raise ValueError(f"OIDC Item missing client_secret: {oidc_item}")
1565
+ if oidc_item.authorization_endpoint is None:
1566
+ raise ValueError(f"OIDC Item missing authorization_endpoint: {oidc_item}")
1567
+ if oidc_item.token_endpoint is None:
1568
+ raise ValueError(f"OIDC Item missing token_endpoint: {oidc_item}")
1569
+ if oidc_item.userinfo_endpoint is None:
1570
+ raise ValueError(f"OIDC Item missing userinfo_endpoint: {oidc_item}")
1571
+ if not isinstance(oidc_item.enabled, bool):
1572
+ raise ValueError(f"OIDC Item missing enabled: {oidc_item}")
1573
+ if oidc_item.jwks_uri is None:
1574
+ raise ValueError(f"OIDC Item missing jwks_uri: {oidc_item}")
1575
+
1576
+ oidc_element.attrib["name"] = oidc_item.idp_configuration_name
1577
+ oidc_element.attrib["clientId"] = oidc_item.client_id
1578
+ oidc_element.attrib["clientSecret"] = oidc_item.client_secret
1579
+ oidc_element.attrib["authorizationEndpoint"] = oidc_item.authorization_endpoint
1580
+ oidc_element.attrib["tokenEndpoint"] = oidc_item.token_endpoint
1581
+ oidc_element.attrib["userInfoEndpoint"] = oidc_item.userinfo_endpoint
1582
+ oidc_element.attrib["enabled"] = str(oidc_item.enabled).lower()
1583
+ oidc_element.attrib["jwksUri"] = oidc_item.jwks_uri
1584
+
1585
+ if oidc_item.allow_embedded_authentication is not None:
1586
+ oidc_element.attrib["allowEmbeddedAuthentication"] = str(oidc_item.allow_embedded_authentication).lower()
1587
+ if oidc_item.custom_scope is not None:
1588
+ oidc_element.attrib["customScope"] = oidc_item.custom_scope
1589
+ if oidc_item.prompt is not None:
1590
+ oidc_element.attrib["prompt"] = oidc_item.prompt
1591
+ if oidc_item.client_authentication is not None:
1592
+ oidc_element.attrib["clientAuthentication"] = oidc_item.client_authentication
1593
+ if oidc_item.essential_acr_values is not None:
1594
+ oidc_element.attrib["essentialAcrValues"] = oidc_item.essential_acr_values
1595
+ if oidc_item.voluntary_acr_values is not None:
1596
+ oidc_element.attrib["voluntaryAcrValues"] = oidc_item.voluntary_acr_values
1597
+ if oidc_item.email_mapping is not None:
1598
+ oidc_element.attrib["emailMapping"] = oidc_item.email_mapping
1599
+ if oidc_item.first_name_mapping is not None:
1600
+ oidc_element.attrib["firstNameMapping"] = oidc_item.first_name_mapping
1601
+ if oidc_item.last_name_mapping is not None:
1602
+ oidc_element.attrib["lastNameMapping"] = oidc_item.last_name_mapping
1603
+ if oidc_item.full_name_mapping is not None:
1604
+ oidc_element.attrib["fullNameMapping"] = oidc_item.full_name_mapping
1605
+ if oidc_item.use_full_name is not None:
1606
+ oidc_element.attrib["useFullName"] = str(oidc_item.use_full_name).lower()
1607
+
1608
+ return ET.tostring(xml_request)
1609
+
1610
+ @_tsrequest_wrapped
1611
+ def update_req(self, xml_request: ET.Element, oidc_item: SiteOIDCConfiguration) -> bytes:
1612
+ oidc_element = ET.SubElement(xml_request, "siteOIDCConfiguration")
1613
+
1614
+ # Check required attributes first
1615
+
1616
+ if oidc_item.idp_configuration_name is None:
1617
+ raise ValueError(f"OIDC Item missing idp_configuration_name: {oidc_item}")
1618
+ if oidc_item.client_id is None:
1619
+ raise ValueError(f"OIDC Item missing client_id: {oidc_item}")
1620
+ if oidc_item.client_secret is None:
1621
+ raise ValueError(f"OIDC Item missing client_secret: {oidc_item}")
1622
+ if oidc_item.authorization_endpoint is None:
1623
+ raise ValueError(f"OIDC Item missing authorization_endpoint: {oidc_item}")
1624
+ if oidc_item.token_endpoint is None:
1625
+ raise ValueError(f"OIDC Item missing token_endpoint: {oidc_item}")
1626
+ if oidc_item.userinfo_endpoint is None:
1627
+ raise ValueError(f"OIDC Item missing userinfo_endpoint: {oidc_item}")
1628
+ if not isinstance(oidc_item.enabled, bool):
1629
+ raise ValueError(f"OIDC Item missing enabled: {oidc_item}")
1630
+ if oidc_item.jwks_uri is None:
1631
+ raise ValueError(f"OIDC Item missing jwks_uri: {oidc_item}")
1632
+
1633
+ oidc_element.attrib["name"] = oidc_item.idp_configuration_name
1634
+ oidc_element.attrib["clientId"] = oidc_item.client_id
1635
+ oidc_element.attrib["clientSecret"] = oidc_item.client_secret
1636
+ oidc_element.attrib["authorizationEndpoint"] = oidc_item.authorization_endpoint
1637
+ oidc_element.attrib["tokenEndpoint"] = oidc_item.token_endpoint
1638
+ oidc_element.attrib["userInfoEndpoint"] = oidc_item.userinfo_endpoint
1639
+ oidc_element.attrib["enabled"] = str(oidc_item.enabled).lower()
1640
+ oidc_element.attrib["jwksUri"] = oidc_item.jwks_uri
1641
+
1642
+ if oidc_item.allow_embedded_authentication is not None:
1643
+ oidc_element.attrib["allowEmbeddedAuthentication"] = str(oidc_item.allow_embedded_authentication).lower()
1644
+ if oidc_item.custom_scope is not None:
1645
+ oidc_element.attrib["customScope"] = oidc_item.custom_scope
1646
+ if oidc_item.prompt is not None:
1647
+ oidc_element.attrib["prompt"] = oidc_item.prompt
1648
+ if oidc_item.client_authentication is not None:
1649
+ oidc_element.attrib["clientAuthentication"] = oidc_item.client_authentication
1650
+ if oidc_item.essential_acr_values is not None:
1651
+ oidc_element.attrib["essentialAcrValues"] = oidc_item.essential_acr_values
1652
+ if oidc_item.voluntary_acr_values is not None:
1653
+ oidc_element.attrib["voluntaryAcrValues"] = oidc_item.voluntary_acr_values
1654
+ if oidc_item.email_mapping is not None:
1655
+ oidc_element.attrib["emailMapping"] = oidc_item.email_mapping
1656
+ if oidc_item.first_name_mapping is not None:
1657
+ oidc_element.attrib["firstNameMapping"] = oidc_item.first_name_mapping
1658
+ if oidc_item.last_name_mapping is not None:
1659
+ oidc_element.attrib["lastNameMapping"] = oidc_item.last_name_mapping
1660
+ if oidc_item.full_name_mapping is not None:
1661
+ oidc_element.attrib["fullNameMapping"] = oidc_item.full_name_mapping
1662
+ if oidc_item.use_full_name is not None:
1663
+ oidc_element.attrib["useFullName"] = str(oidc_item.use_full_name).lower()
1664
+
1665
+ return ET.tostring(xml_request)
1666
+
1667
+
1668
+ class ExtensionsRequest:
1669
+ @_tsrequest_wrapped
1670
+ def update_server_extensions(self, xml_request: ET.Element, extensions_server: "ExtensionsServer") -> None:
1671
+ extensions_element = ET.SubElement(xml_request, "extensionsServerSettings")
1672
+ if not isinstance(extensions_server.enabled, bool):
1673
+ raise ValueError(f"Extensions Server missing enabled: {extensions_server}")
1674
+ enabled_element = ET.SubElement(extensions_element, "extensionsGloballyEnabled")
1675
+ enabled_element.text = str(extensions_server.enabled).lower()
1676
+
1677
+ if extensions_server.block_list is None:
1678
+ return
1679
+ for blocked in extensions_server.block_list:
1680
+ blocked_element = ET.SubElement(extensions_element, "blockList")
1681
+ blocked_element.text = blocked
1682
+ return
1683
+
1684
+ @_tsrequest_wrapped
1685
+ def update_site_extensions(self, xml_request: ET.Element, extensions_site_settings: ExtensionsSiteSettings) -> None:
1686
+ ext_element = ET.SubElement(xml_request, "extensionsSiteSettings")
1687
+ if not isinstance(extensions_site_settings.enabled, bool):
1688
+ raise ValueError(f"Extensions Site Settings missing enabled: {extensions_site_settings}")
1689
+ enabled_element = ET.SubElement(ext_element, "extensionsEnabled")
1690
+ enabled_element.text = str(extensions_site_settings.enabled).lower()
1691
+ if not isinstance(extensions_site_settings.use_default_setting, bool):
1692
+ raise ValueError(
1693
+ f"Extensions Site Settings missing use_default_setting: {extensions_site_settings.use_default_setting}"
1694
+ )
1695
+ default_element = ET.SubElement(ext_element, "useDefaultSetting")
1696
+ default_element.text = str(extensions_site_settings.use_default_setting).lower()
1697
+ if extensions_site_settings.allow_trusted is not None:
1698
+ allow_trusted_element = ET.SubElement(ext_element, "allowTrusted")
1699
+ allow_trusted_element.text = str(extensions_site_settings.allow_trusted).lower()
1700
+ if extensions_site_settings.include_sandboxed is not None:
1701
+ include_sandboxed_element = ET.SubElement(ext_element, "includeSandboxed")
1702
+ include_sandboxed_element.text = str(extensions_site_settings.include_sandboxed).lower()
1703
+ if extensions_site_settings.include_tableau_built is not None:
1704
+ include_tableau_built_element = ET.SubElement(ext_element, "includeTableauBuilt")
1705
+ include_tableau_built_element.text = str(extensions_site_settings.include_tableau_built).lower()
1706
+ if extensions_site_settings.include_partner_built is not None:
1707
+ include_partner_built_element = ET.SubElement(ext_element, "includePartnerBuilt")
1708
+ include_partner_built_element.text = str(extensions_site_settings.include_partner_built).lower()
1709
+
1710
+ if extensions_site_settings.safe_list is None:
1711
+ return
1712
+
1713
+ safe_element = ET.SubElement(ext_element, "safeList")
1714
+ for safe in extensions_site_settings.safe_list:
1715
+ if safe.url is not None:
1716
+ url_element = ET.SubElement(safe_element, "url")
1717
+ url_element.text = safe.url
1718
+ if safe.full_data_allowed is not None:
1719
+ full_data_element = ET.SubElement(safe_element, "fullDataAllowed")
1720
+ full_data_element.text = str(safe.full_data_allowed).lower()
1721
+ if safe.prompt_needed is not None:
1722
+ prompt_element = ET.SubElement(safe_element, "promptNeeded")
1723
+ prompt_element.text = str(safe.prompt_needed).lower()
1724
+
1725
+
1449
1726
  class RequestFactory:
1450
1727
  Auth = AuthRequest()
1451
1728
  Connection = Connection()
@@ -1456,6 +1733,7 @@ class RequestFactory:
1456
1733
  Database = DatabaseRequest()
1457
1734
  DQW = DQWRequest()
1458
1735
  Empty = EmptyRequest()
1736
+ Extensions = ExtensionsRequest()
1459
1737
  Favorite = FavoriteRequest()
1460
1738
  Fileupload = FileuploadRequest()
1461
1739
  Flow = FlowRequest()
@@ -1463,6 +1741,7 @@ class RequestFactory:
1463
1741
  Group = GroupRequest()
1464
1742
  GroupSet = GroupSetRequest()
1465
1743
  Metric = MetricRequest()
1744
+ OIDC = OIDCRequest()
1466
1745
  Permission = PermissionRequest()
1467
1746
  Project = ProjectRequest()
1468
1747
  Schedule = ScheduleRequest()
@@ -96,7 +96,10 @@ class RequestOptions(RequestOptionsBase):
96
96
  if self.pagesize:
97
97
  params["pageSize"] = self.pagesize
98
98
  if self.fields:
99
- params["fields"] = ",".join(self.fields)
99
+ if "_all_" in self.fields:
100
+ params["fields"] = "_all_"
101
+ else:
102
+ params["fields"] = ",".join(sorted(self.fields))
100
103
  return params
101
104
 
102
105
  def page_size(self, page_size):
@@ -384,7 +387,14 @@ class _DataExportOptions(RequestOptionsBase):
384
387
  Self
385
388
  The current object
386
389
  """
387
- self.view_parameters.append((name, value))
390
+ prefix = "vf_Parameters."
391
+ if name.startswith(prefix):
392
+ proper_name = name
393
+ elif name.startswith("Parameters."):
394
+ proper_name = f"vf_{name}"
395
+ else:
396
+ proper_name = f"{prefix}{name}"
397
+ self.view_parameters.append((proper_name, value))
388
398
  return self
389
399
 
390
400
  def _append_view_filters(self, params) -> None:
@@ -38,6 +38,8 @@ from tableauserverclient.server.endpoint import (
38
38
  GroupSets,
39
39
  Tags,
40
40
  VirtualConnections,
41
+ OIDC,
42
+ Extensions,
41
43
  )
42
44
  from tableauserverclient.server.exceptions import (
43
45
  ServerInfoEndpointNotFoundError,
@@ -183,6 +185,8 @@ class Server:
183
185
  self.group_sets = GroupSets(self)
184
186
  self.tags = Tags(self)
185
187
  self.virtual_connections = VirtualConnections(self)
188
+ self.oidc = OIDC(self)
189
+ self.extensions = Extensions(self)
186
190
 
187
191
  self._session = self._session_factory()
188
192
  self._http_options = dict() # must set this before making a server call
@@ -1,30 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tableauserverclient
3
- Version: 0.38
3
+ Version: 0.40
4
4
  Summary: A Python module for working with the Tableau Server REST API.
5
5
  Author-email: Tableau <github@tableau.com>
6
- License: The MIT License (MIT)
7
-
8
- Copyright (c) 2022 Tableau
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
28
6
  Project-URL: repository, https://github.com/tableau/server-client-python
29
7
  Classifier: Programming Language :: Python
30
8
  Classifier: Programming Language :: Python :: 3
@@ -36,20 +14,21 @@ Classifier: Programming Language :: Python :: 3.13
36
14
  Requires-Python: >=3.9
37
15
  Description-Content-Type: text/markdown
38
16
  License-File: LICENSE
39
- License-File: LICENSE.versioneer
40
17
  Requires-Dist: defusedxml>=0.7.1
41
18
  Requires-Dist: packaging>=23.1
42
19
  Requires-Dist: requests>=2.32
43
- Requires-Dist: urllib3<3,>=2.2.2
20
+ Requires-Dist: urllib3<3,>=2.6.0
44
21
  Requires-Dist: typing_extensions>=4.0
45
22
  Provides-Extra: test
46
- Requires-Dist: black==24.8; extra == "test"
23
+ Requires-Dist: black==24.10; extra == "test"
47
24
  Requires-Dist: build; extra == "test"
48
25
  Requires-Dist: mypy==1.4; extra == "test"
49
26
  Requires-Dist: pytest>=7.0; extra == "test"
50
27
  Requires-Dist: pytest-cov; extra == "test"
51
28
  Requires-Dist: pytest-subtests; extra == "test"
29
+ Requires-Dist: pytest-xdist; extra == "test"
52
30
  Requires-Dist: requests-mock<2.0,>=1.0; extra == "test"
31
+ Requires-Dist: types-requests>=2.32.4.20250913; extra == "test"
53
32
  Dynamic: license-file
54
33
 
55
34
  # Tableau Server Client (Python)
@@ -1,108 +1,114 @@
1
- tableauserverclient/__init__.py,sha256=MF3FF8PVVTOMt6XisyADxGtHwT2ZGYqzD0QYbKL3Fo0,2958
1
+ _version.py,sha256=Ar107OxOqwZ2wY6jnrdR0S_7IBYED_e3LfHht0loQi8,496
2
+ tableauserverclient/__init__.py,sha256=77xoTo7gV3vQTJ1LESSkM6ivCBt0hNTxBrLF24kE_1g,3098
2
3
  tableauserverclient/config.py,sha256=LcWVmZjkYMh1cKCKZm3VZItgKOoSLz1ai4PnVgbAtDA,713
3
4
  tableauserverclient/datetime_helpers.py,sha256=_-gWz5I2_KHT5AzW_boD8meH6loTTKdK-_62h1MA6ko,884
4
5
  tableauserverclient/exponential_backoff.py,sha256=HtAfbbVnYtiOe2_ZzKqZmsml40EDZBaC3bttif5qeG8,1474
5
6
  tableauserverclient/filesys_helpers.py,sha256=hosTm9fpc9B9_VCDcAuyHA0A-f-MWs9_2utyRweuZ5I,1667
6
7
  tableauserverclient/namespace.py,sha256=Zh6QtxNmqPkjRMsefHHX-ycS4r-egnrJ4-hdHvldBHw,963
7
8
  tableauserverclient/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- tableauserverclient/bin/_version.py,sha256=E7k74Qr0m6ibFzFeSwltkPyK8dAWvX_lwhGIx-whZy4,496
9
+ tableauserverclient/bin/__init__.py,sha256=T8WHy9zTlF9XZWoqqMbrxJ39Tw4YHo4x7zq9iSQRioQ,119
10
+ tableauserverclient/bin/_version.py,sha256=Ar107OxOqwZ2wY6jnrdR0S_7IBYED_e3LfHht0loQi8,496
9
11
  tableauserverclient/helpers/__init__.py,sha256=llpqF9zV5dsP5hQt8dyop33Op5OzGmxW0BZibaSlCcM,23
10
12
  tableauserverclient/helpers/headers.py,sha256=Pg-ZWSgV2Yp813BV1Tzo8F2Hn4P01zscla2RRM4yqNk,411
11
13
  tableauserverclient/helpers/logging.py,sha256=5q_oR3wERHVXFXY6XDnLYML5-HdAPJTmqhH9IZg4VfY,113
12
14
  tableauserverclient/helpers/strings.py,sha256=7MvaS9haJ5hpdv4NPQ11gRj94zIgbDmujFPD_GnZPJI,2013
13
- tableauserverclient/models/__init__.py,sha256=Udhoop0M75G6NMWyPzgH6Mr2PBH5H77jF359P5y4DUM,4272
15
+ tableauserverclient/models/__init__.py,sha256=m_hsDtY9aQwtd1rtg34QqmBVBF1wGh3SEArFjKMP1-8,4679
16
+ tableauserverclient/models/collection_item.py,sha256=nZISWKtjsuAHSBrw9_h1Xco0zHNf1x5uQ0UAH2MWxaQ,2162
14
17
  tableauserverclient/models/column_item.py,sha256=yUFzXNcnUPVo2imrhEBS4fMVAR5j2ZzksOk5t9XYW5s,1964
15
18
  tableauserverclient/models/connection_credentials.py,sha256=CQ8FkkHW9MeTw8uArNhrU5mowtryWUddgEgEliqh3ys,2066
16
- tableauserverclient/models/connection_item.py,sha256=LwZza3I5Zwx04BcLGWQXRcuZq5X_X86DDse6RMmrcr8,6002
17
- tableauserverclient/models/custom_view_item.py,sha256=JZyq7jkt9WH-24eOV4PO2uGJxaSZ-5K05jL4UoZ8kYs,7771
19
+ tableauserverclient/models/connection_item.py,sha256=QO-20N7df-5V1rCnaZCQ6bxLRncctWvprq1aXSOF7YE,6553
20
+ tableauserverclient/models/custom_view_item.py,sha256=oIdYhyWLhJZUaSsp9QAAAka9AP7kO8LOaN97vPw95Qw,7967
18
21
  tableauserverclient/models/data_acceleration_report_item.py,sha256=HFZROetfOWh-hMS48xBEHqYOViINHZR-EpcrP45_8AI,3386
19
22
  tableauserverclient/models/data_alert_item.py,sha256=VZtRR-kqojq-mkrTgvay4WkPawj3-4jbSc0wBijmJhk,6444
20
- tableauserverclient/models/data_freshness_policy_item.py,sha256=UdaEmwVL_q364Do_2dOnkCSX-oKnvjKfsYzGSaJIQFs,7618
23
+ tableauserverclient/models/data_freshness_policy_item.py,sha256=k_EfTuf9Av6kDEapmqiLbkzT8W4yEYS6V3EY0CRXPbM,7648
21
24
  tableauserverclient/models/database_item.py,sha256=lWxmmMpPeVxzizVAsVkc6Ps2I-j-0KJAJZto8qShrYU,8223
22
- tableauserverclient/models/datasource_item.py,sha256=1cQrn_Mm46aPq-RPJD5LRBq-gr2zbgXs5tLG8wG7oP8,19689
25
+ tableauserverclient/models/datasource_item.py,sha256=ITVzWLHdY2xLhP1UCWJqE9j5ZijomxT83p5B_WE78I4,19735
23
26
  tableauserverclient/models/dqw_item.py,sha256=87oTc7icrQst_DSaTqoVR965YEckg5dk6osa51BrCAk,3710
24
27
  tableauserverclient/models/exceptions.py,sha256=pQu5DS4jNMT9A0wEBWv2vANAQU1vgNpFatVr8sGE4zk,105
28
+ tableauserverclient/models/extensions_item.py,sha256=nJj5Xl_B1j5KK6TQ8-g8tBaBH5tkCsR2Y0GTnuOcxWQ,6684
25
29
  tableauserverclient/models/extract_item.py,sha256=2qDyNrAanbw1gK6qE2L7RwQFsIg_59unUx8rbLWrTmg,2691
26
- tableauserverclient/models/favorites_item.py,sha256=JxHfy38xdRYol2KM_8_A7Ng59cZunkhTNcpxO670k08,3294
30
+ tableauserverclient/models/favorites_item.py,sha256=IvImwOW8csz14HdrTVSDZ6mCubyuYjTLsI9yS3nD2jE,3947
27
31
  tableauserverclient/models/fileupload_item.py,sha256=N5M0jtlFj_PFh3jlp2AbcYOwCwdnBCk_L64xe3Z4ves,742
28
- tableauserverclient/models/flow_item.py,sha256=aXAv7yIWdpISBWARBkc8aHUmMmtk4z2ZFhWvVT0gCkg,8664
32
+ tableauserverclient/models/flow_item.py,sha256=sFAgm-RSJOBaq2CTZvL9F0wD3MiO0r7tBXfqVR7JDic,8674
29
33
  tableauserverclient/models/flow_run_item.py,sha256=nf_b6KRwNevwZRsPoMh8dLzdONUMWY2wipWEMdY9SN4,3113
30
- tableauserverclient/models/group_item.py,sha256=qirnux5rrH_-Ih6ZyXceSz7ylXtRinY7FgN_Zmkhc7U,5241
31
- tableauserverclient/models/groupset_item.py,sha256=gxxyzviE5B8zr2sKJteIDKtYTPYKsGd-qMcrjEY2uVU,1885
32
- tableauserverclient/models/interval_item.py,sha256=zAP6gLjvFSKgEtuI2On_RRRSq240TJdCiRZaU4U2Kkg,10962
34
+ tableauserverclient/models/group_item.py,sha256=7i-b4GvAC03GQtR8BweTDj5xcxEDvoer5EXuygvIYVU,5532
35
+ tableauserverclient/models/groupset_item.py,sha256=sNaXHbFLxC1sLiJgA_Dbm_d2nny2sRVN383Dltvy-kQ,2339
36
+ tableauserverclient/models/interval_item.py,sha256=q-SK-Coo3WhoLsNbzkC4K3qYCMfcNnrRzAmKmdIKuIY,11016
33
37
  tableauserverclient/models/job_item.py,sha256=Q7tTKXEiW-5VJsLmnAq6auP0jvmbbImmqw_nx1kiXtM,11512
34
38
  tableauserverclient/models/linked_tasks_item.py,sha256=TYkNvmJfKlZ30OST8w9GUobboFAH5ftFKjXdWWAtR24,3806
35
39
  tableauserverclient/models/location_item.py,sha256=8pVxiSoySTAQOF9QDe0KiHMUp0aiFG-sZ2cB1u8oAEg,1287
36
40
  tableauserverclient/models/metric_item.py,sha256=D3atzbr3jtQUsVsqYHfz-v3yRP3qruRN5jRsv_-yRQ0,5378
41
+ tableauserverclient/models/oidc_item.py,sha256=hKqX8QiIUtd6keXKT9l9LzhIMkaO2QkvXkp2VxzhkHQ,3753
37
42
  tableauserverclient/models/pagination_item.py,sha256=55Ap_9pJxq8plWQO1Js3Jp6KFidN3TQsL5LM2-yZGDo,1424
38
- tableauserverclient/models/permissions_item.py,sha256=CWf1Q4x7U4QQWQ1VUWgDzaE7mhriHblG1MJAc6EKJHM,6149
39
- tableauserverclient/models/project_item.py,sha256=5xoKbLUhpQ21i0iRG1MVbYLa5wetwTAmZ2IkzwmFsO4,11687
40
- tableauserverclient/models/property_decorators.py,sha256=v2cTqiW5iZXoOyu6RYg3X6Ly--8sozjWOcKCTLi99Nc,4645
41
- tableauserverclient/models/reference_item.py,sha256=R4Tr7qfVdnGcq_ac4hr0yhAjBOkqFZEW-4NGMUYaf9w,733
43
+ tableauserverclient/models/permissions_item.py,sha256=Av_z2P8IbxH-FXWMhOPGZapPR6qQRrYfqo30nZjMBrM,6245
44
+ tableauserverclient/models/project_item.py,sha256=MFUJ9vDbsTdZXmWtmeWKitffZ7lFfP2eOZY-HSvSIbM,11729
45
+ tableauserverclient/models/property_decorators.py,sha256=Xp08wlfbHImLEgb9TrdbdFTlAGCO3RR68Sw5qvnBDJ4,4632
46
+ tableauserverclient/models/reference_item.py,sha256=8cFg61-Y2NQsDE5IAHGSYU5p3unVB2nHclOq8e8EFFs,940
42
47
  tableauserverclient/models/revision_item.py,sha256=5ghmnwhUcCOWwZdApzgV_uM3sqdoG_gtsJwUQwfKITo,2773
43
- tableauserverclient/models/schedule_item.py,sha256=tiIkTj3JIsozCqIkMLzjM11FZMAWJ3vrNgySGPbuido,13490
48
+ tableauserverclient/models/schedule_item.py,sha256=553k5g1gbLiNs4_4NLbDhTKDgU4lqXfK6fBh35-tSxY,13770
44
49
  tableauserverclient/models/server_info_item.py,sha256=55wTG_31o-WwqgBrbwpgMpq_by10iM6BXpmdAZ3TO90,2631
45
- tableauserverclient/models/site_item.py,sha256=UjSl413kYwNJEVrqH3Fb3Y63IiCXICGYuRQuXgTyS5E,46219
50
+ tableauserverclient/models/site_item.py,sha256=Wq5Ry_14RUgJEXDAcs87SFAaRsvVlUqQYbQ6CWe1l30,47296
46
51
  tableauserverclient/models/subscription_item.py,sha256=ujaQQIo_ln3pnm0Th2IdcGCp_cl6WxvEMPgeZbwZtFc,4724
47
52
  tableauserverclient/models/table_item.py,sha256=4CZ2R0asNz8iINn3FKKQzjpwt-5lBAvfm0fHKmz5gcw,4752
48
- tableauserverclient/models/tableau_auth.py,sha256=atmXdAsA5LrrLHEzrHJQPLYETC1iKyxFqPSwIk-vacI,8218
53
+ tableauserverclient/models/tableau_auth.py,sha256=F1AOyKCaxwS4q_1HbNC8nw2KBaYNexXescxZdHhNkjw,8394
49
54
  tableauserverclient/models/tableau_types.py,sha256=bukzI490GWpebGv9ZiCuSqioqIZm9ao9Yr2GGrmM8_A,1420
50
55
  tableauserverclient/models/tag_item.py,sha256=K2EVEy1EDdr0yLr4wBvGr-p9gIAFVsOCv80b-AFPFLk,588
51
56
  tableauserverclient/models/target.py,sha256=dVc1SHwo9ZASR8250MhAPODXX_G5UqA4BnK8hykRE6E,263
52
57
  tableauserverclient/models/task_item.py,sha256=l4t4COw2LfdlYmJpzUSgwGven_NSZj2r3PUJZkqvCus,4555
53
- tableauserverclient/models/user_item.py,sha256=SsrbSA62oD99agQSzNv-q5Yjqd7UEQfmAD8j78bjrDU,19454
58
+ tableauserverclient/models/user_item.py,sha256=Nynycb3lM2q909P8bML6xOncr4P1yBhWO17lE_Nh9P8,19814
54
59
  tableauserverclient/models/view_item.py,sha256=-JxiwRFqBo7DS3dvwk4rxRhc25WH-Pgf8rBaLyFQOzE,12451
55
60
  tableauserverclient/models/virtual_connection_item.py,sha256=TvX7MId7WSg4IZE41XAMl1l3Ibu8kTUR1xr26Cqtyeo,3357
56
61
  tableauserverclient/models/webhook_item.py,sha256=r37fHY3_uhDhxupHfMSvB4I2aUjy3qQ2FOLQjAcNUUk,3994
57
- tableauserverclient/models/workbook_item.py,sha256=8HMO7MGtclG4vsnP-rUCyZE5PczbXAm1fTG-9wRUlKI,22384
62
+ tableauserverclient/models/workbook_item.py,sha256=myU8Tesc5eGwmYEICQdk3aXtxERkHdC8FEk1zwO65Y4,22404
58
63
  tableauserverclient/server/__init__.py,sha256=77E-3LseLd9gHeRgKPnpZTNMQySgYiwst33AsReol-k,1940
59
64
  tableauserverclient/server/exceptions.py,sha256=l-O4lcoEeXJC7fLWUanIcZM_Mf8m54uK3NQuKNj3RCg,183
60
65
  tableauserverclient/server/filter.py,sha256=Z7O6A175bBSmcponLs0Enh5R5Gp2puVRGfOMk-V395w,1096
61
66
  tableauserverclient/server/pager.py,sha256=IESvCba7WZO3O9VBcKlJ6ricVDgro0gKuUQyJnOCUws,3497
62
67
  tableauserverclient/server/query.py,sha256=dY_y20DOBOFwydIpLcWLK39s1lVmDPxhX5x6hVxeoL0,10529
63
- tableauserverclient/server/request_factory.py,sha256=O6jqmDXUN-TnyieSvANhHyLtNxV49SzWnHdACmDRCTY,72994
64
- tableauserverclient/server/request_options.py,sha256=gSaVE0LVQNNDgJFB9_WNOjjdyAl_i0Y6cwyJhXHXYkc,19889
65
- tableauserverclient/server/server.py,sha256=BemJ2L0gl34JpMZL43nPQj5rulYWA1MdaaUh8DiVhKI,13363
68
+ tableauserverclient/server/request_factory.py,sha256=2A6mFp-eLi7wd18I1QySULvCx1B78EHyNu59Oj2dzsM,87792
69
+ tableauserverclient/server/request_options.py,sha256=xVMZYO_dXdDHWi4bYalA8w-n55z-qSuSNGRGwwEFUCU,20251
70
+ tableauserverclient/server/server.py,sha256=YC7rmMdw7asDMsvq2M5FGujl3FE2qP35M5DOwnNwHZ4,13463
66
71
  tableauserverclient/server/sort.py,sha256=wjnlt7rlmLvQjM_XpgD8N8Hlg0zVvLOV7k_dAs1DmHY,628
67
- tableauserverclient/server/endpoint/__init__.py,sha256=MpttkNENWAiXS2QigwZMfWG6PnsB05QSFK4-OIR3CaQ,3101
72
+ tableauserverclient/server/endpoint/__init__.py,sha256=kHDGHsGU0QgJVBzMzerfR8vQ476ksC0QFQJfMDvQ_Vk,3277
68
73
  tableauserverclient/server/endpoint/auth_endpoint.py,sha256=8N3_OUSwYm4KCvwDJHGmH9i2OqzH70PLP0-rT-sKYVo,7177
69
74
  tableauserverclient/server/endpoint/custom_views_endpoint.py,sha256=se-CZ9BF8Cf_quT_3BbrO9lwK7E8hHbCoMYq-2IZMM8,14515
70
75
  tableauserverclient/server/endpoint/data_acceleration_report_endpoint.py,sha256=he-MVqCvAQo8--icEKFoIV2KUP6Z1s_PJ2uZ8Xpj2f8,1130
71
76
  tableauserverclient/server/endpoint/data_alert_endpoint.py,sha256=ZNotgG3hBpR7fo8eDTXx_gSppF2n25GQ3udwF3MKFLk,5203
72
77
  tableauserverclient/server/endpoint/databases_endpoint.py,sha256=vojSCB6DQ665Z0X7h5TQg5wflU_WUtd4pgcjsda7JdU,8689
73
- tableauserverclient/server/endpoint/datasources_endpoint.py,sha256=n6R5Qdfyc_nOGzhG_zcVsEtaWKZ5dRTopBM36fVTYvg,41838
78
+ tableauserverclient/server/endpoint/datasources_endpoint.py,sha256=CQ6erQgiWIKgyfAPDtwFquXNy6MxdSIcjjhsbRrZN6I,44921
74
79
  tableauserverclient/server/endpoint/default_permissions_endpoint.py,sha256=bZlhDqu6jFyC4vbrdC3Nn1cWRJWRz0mhxco9hRUouJA,4327
75
80
  tableauserverclient/server/endpoint/dqw_endpoint.py,sha256=bfgA7sRGQajR67xcRS9mIF7yKlJmjjFyN-hBxwZ5wkU,2626
76
81
  tableauserverclient/server/endpoint/endpoint.py,sha256=035rsaaUoQP0oYtaRhtIMHs9bwMeFCt2u-gn5asOK7o,15309
77
82
  tableauserverclient/server/endpoint/exceptions.py,sha256=ifkRatvvqG5awY73BzwALlby3dYYKr_8leUOmpeZS0Y,2919
83
+ tableauserverclient/server/endpoint/extensions_endpoint.py,sha256=sInHr4sDMoXC7X-eHyOmP4bJfJbUypalfsUEKHK_F7Y,2992
78
84
  tableauserverclient/server/endpoint/favorites_endpoint.py,sha256=ZMui0KQCSGRBlUrem519Y5_gBpngN7wtDWo_EvEUMEk,6340
79
85
  tableauserverclient/server/endpoint/fileuploads_endpoint.py,sha256=e3qIw6lJJG4Y8RHG26psMjjETovpfrBzmFjeYeJll8s,2410
80
86
  tableauserverclient/server/endpoint/flow_runs_endpoint.py,sha256=HIVuTi4pXIqog16K_3Zzu1LC96TR_pZlAjxRKoJrJ_g,4957
81
- tableauserverclient/server/endpoint/flow_task_endpoint.py,sha256=4D7tEYow7lqkCuazXUrUyIH_y_PQMTehmeIi-zSIMXo,1078
82
- tableauserverclient/server/endpoint/flows_endpoint.py,sha256=i0nc9JeBzJ7A-kymGMubV8khT-NU3oxlvB7SHd_bddA,23650
87
+ tableauserverclient/server/endpoint/flow_task_endpoint.py,sha256=z9qrWw9hrWXPHwRT9j0vx9PeW_kL_yphB5h9-inLj6M,1075
88
+ tableauserverclient/server/endpoint/flows_endpoint.py,sha256=GLODBEg31O-mZeqLV6kjaPGg0bLP93_kl6ok2GF_k4A,23738
83
89
  tableauserverclient/server/endpoint/groups_endpoint.py,sha256=5ZhKJeKT3GoM2olqJYJggdiVYQ9BdcEJCIqkx-tZqxo,18745
84
90
  tableauserverclient/server/endpoint/groupsets_endpoint.py,sha256=Kcrrd0NbduwIhAtGkG-EMf38qcCM74EnCybAs24TFnM,5577
85
91
  tableauserverclient/server/endpoint/jobs_endpoint.py,sha256=rhR8tD89U5ha-g5QhLlGXurTF77mLQREnd7k208EHxA,10387
86
92
  tableauserverclient/server/endpoint/linked_tasks_endpoint.py,sha256=tMZqVPWPZvYawaXLJGVV9scmWPu1rdCxz-eWZv1WbPk,2262
87
93
  tableauserverclient/server/endpoint/metadata_endpoint.py,sha256=sg0Yehj2f0wlrJMkVjzNdNxNEhSeNbZIkio3eQamOVk,5228
88
94
  tableauserverclient/server/endpoint/metrics_endpoint.py,sha256=p9F_tbUela1sb3i9n67Tr9zsPRmsjSAigC6EqLwZHqE,3175
95
+ tableauserverclient/server/endpoint/oidc_endpoint.py,sha256=OMOpOOcPO8C1z6FFRHf6CEVgJqWgaETRSWPiQdYg4wA,5969
89
96
  tableauserverclient/server/endpoint/permissions_endpoint.py,sha256=tXX_KSanbxUeR-L4UdI_jphko8dD_fZsXVhQayQL3JA,3719
90
- tableauserverclient/server/endpoint/projects_endpoint.py,sha256=aIYW2NWZnWgK2PXHcBgHJwGxv6Ak915J-1wmPD1FiFY,30603
97
+ tableauserverclient/server/endpoint/projects_endpoint.py,sha256=cIeoCGUCiUl_MtpHDycI21n9DIjGfSvFeyGW1iDduwo,31114
91
98
  tableauserverclient/server/endpoint/resource_tagger.py,sha256=eKekflXzLjx_zDOLgYkTIusRO8vsFus1LvLIf0LOwtQ,6661
92
- tableauserverclient/server/endpoint/schedules_endpoint.py,sha256=6CnlvC2OIMRTUM1JYYgg5WWVG68vnw2Cfui-O-vkYj4,11032
99
+ tableauserverclient/server/endpoint/schedules_endpoint.py,sha256=C4evSP4P6_7cxTlk71IaswIxba7Bo2I5eVM-W5cfyGU,12716
93
100
  tableauserverclient/server/endpoint/server_info_endpoint.py,sha256=9UcYP3td22S_Kwabu-RWc-Pn3lFrIERVlzVpl4ErP_I,2649
94
101
  tableauserverclient/server/endpoint/sites_endpoint.py,sha256=Fh8ppL00IVI1YpXyOXCCc5fIc_r_TC1o8GCgYD_gOV4,14778
95
102
  tableauserverclient/server/endpoint/subscriptions_endpoint.py,sha256=21oZ6Q14AL8p2ZHyfREpbnPU6Vj4Xh97o1K9hmKRJ-I,3187
96
103
  tableauserverclient/server/endpoint/tables_endpoint.py,sha256=PcNqk66aJ_rsFSHOJ1FCB_G5GlvGFIzr66G5aO2aIRo,9742
97
104
  tableauserverclient/server/endpoint/tasks_endpoint.py,sha256=5VHGe2NSgr40BKPPOm9nVrdZGrG3Sf0ri_CNqsv0CpQ,6304
98
- tableauserverclient/server/endpoint/users_endpoint.py,sha256=M8rtc0UOgJTpOudZg9XhPWpSNX5HOrNGeYAdYTfzYrs,20414
99
- tableauserverclient/server/endpoint/views_endpoint.py,sha256=4wTqjo1MyB6kkVB0W9QSajz8eqwO7vaZCcD2y6hN4Zo,17859
105
+ tableauserverclient/server/endpoint/users_endpoint.py,sha256=How6_592NotSDF__pRSQ_IMkKWX-jjRKIHTVCsTXfgo,30054
106
+ tableauserverclient/server/endpoint/views_endpoint.py,sha256=p4rSEPS3Octgm9W7b1QHSaxVJW4F5KJHoYXTymYMo-o,18639
100
107
  tableauserverclient/server/endpoint/virtual_connections_endpoint.py,sha256=K5R86aIm4hZeYw3OUOlKv-zTmsWa3np1iuV_h5iPvt0,8458
101
108
  tableauserverclient/server/endpoint/webhooks_endpoint.py,sha256=nmEjKdbntwBg-0XAP2TluOv2v8usqxXg7sO8ogS5rDI,4923
102
- tableauserverclient/server/endpoint/workbooks_endpoint.py,sha256=W6o64Rec7i3dBzyR8TYntgWzryXbxFAZ_xa37edyzqY,43910
103
- tableauserverclient-0.38.dist-info/licenses/LICENSE,sha256=MMkY7MguOb4L-WCmmqrVcwg2iwSGaz-RfAMFvXRXwsQ,1074
104
- tableauserverclient-0.38.dist-info/licenses/LICENSE.versioneer,sha256=OYaGozOXk7bUNSm1z577iDYpti8a40XIqqR4lyQ47D8,334
105
- tableauserverclient-0.38.dist-info/METADATA,sha256=Mqmu3eGpJkEDtUCXPioiJvuo5yHjUv77jwF_xGm48go,4351
106
- tableauserverclient-0.38.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
107
- tableauserverclient-0.38.dist-info/top_level.txt,sha256=kBnL39G2RlGqxJSsShDBWG4WZ3NFcWJkv1EGiOfZh4Q,20
108
- tableauserverclient-0.38.dist-info/RECORD,,
109
+ tableauserverclient/server/endpoint/workbooks_endpoint.py,sha256=tN5AybuR8lZxwM6OFtJLJ0Cryo2d8thWHUONCT4OK7k,47116
110
+ tableauserverclient-0.40.dist-info/licenses/LICENSE,sha256=MMkY7MguOb4L-WCmmqrVcwg2iwSGaz-RfAMFvXRXwsQ,1074
111
+ tableauserverclient-0.40.dist-info/METADATA,sha256=jyP890hWytY2lSih7m-iQewIdfwkquwcXkUWEuYVfLs,3176
112
+ tableauserverclient-0.40.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
113
+ tableauserverclient-0.40.dist-info/top_level.txt,sha256=kBnL39G2RlGqxJSsShDBWG4WZ3NFcWJkv1EGiOfZh4Q,20
114
+ tableauserverclient-0.40.dist-info/RECORD,,