Skip to content

Commit be1d1ad

Browse files
committed
feat: List server extension settings
1 parent fd187ba commit be1d1ad

File tree

8 files changed

+102
-0
lines changed

8 files changed

+102
-0
lines changed

tableauserverclient/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
DatabaseItem,
1414
DataFreshnessPolicyItem,
1515
DatasourceItem,
16+
ExtensionsServer,
1617
FavoriteItem,
1718
FlowItem,
1819
FlowRunItem,
@@ -88,6 +89,7 @@
8889
"DEFAULT_NAMESPACE",
8990
"DQWItem",
9091
"ExcelRequestOptions",
92+
"ExtensionsServer",
9193
"FailedSignInError",
9294
"FavoriteItem",
9395
"FileuploadItem",

tableauserverclient/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from tableauserverclient.models.datasource_item import DatasourceItem
1111
from tableauserverclient.models.dqw_item import DQWItem
1212
from tableauserverclient.models.exceptions import UnpopulatedPropertyError
13+
from tableauserverclient.models.extensions_item import ExtensionsServer
1314
from tableauserverclient.models.favorites_item import FavoriteItem
1415
from tableauserverclient.models.fileupload_item import FileuploadItem
1516
from tableauserverclient.models.flow_item import FlowItem
@@ -113,4 +114,5 @@
113114
"LinkedTaskStepItem",
114115
"LinkedTaskFlowRunItem",
115116
"ExtractItem",
117+
"ExtensionsServer",
116118
]
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from typing import Optional, TypeVar, overload
2+
from typing_extensions import Self
3+
4+
from defusedxml.ElementTree import fromstring
5+
6+
T = TypeVar("T")
7+
8+
9+
class ExtensionsServer:
10+
def __init__(self) -> None:
11+
self._enabled: Optional[bool] = None
12+
self._block_list: Optional[list[str]] = None
13+
14+
@property
15+
def enabled(self) -> Optional[bool]:
16+
"""Indicates whether the extensions server is enabled."""
17+
return self._enabled
18+
19+
@enabled.setter
20+
def enabled(self, value: Optional[bool]) -> None:
21+
self._enabled = value
22+
23+
@property
24+
def block_list(self) -> Optional[list[str]]:
25+
"""List of blocked extensions."""
26+
return self._block_list
27+
28+
@block_list.setter
29+
def block_list(self, value: Optional[list[str]]) -> None:
30+
self._block_list = value
31+
32+
@classmethod
33+
def from_response(cls: type[Self], response, ns) -> Self:
34+
xml = fromstring(response)
35+
obj = cls()
36+
element = xml.find(".//t:extensionsServerSettings", namespaces=ns)
37+
if element is None:
38+
raise ValueError("Missing extensionsServerSettings element in response")
39+
40+
if (enabled_element := element.find("./t:extensionsGloballyEnabled", namespaces=ns)) is not None:
41+
obj.enabled = string_to_bool(enabled_element.text)
42+
obj.block_list = [e.text for e in element.findall("./t:blockList", namespaces=ns)]
43+
44+
return obj
45+
46+
47+
@overload
48+
def string_to_bool(s: str) -> bool: ...
49+
50+
51+
@overload
52+
def string_to_bool(s: None) -> None: ...
53+
54+
55+
def string_to_bool(s):
56+
return s.lower() == "true" if s is not None else None

tableauserverclient/server/endpoint/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from tableauserverclient.server.endpoint.datasources_endpoint import Datasources
77
from tableauserverclient.server.endpoint.endpoint import Endpoint, QuerysetEndpoint
88
from tableauserverclient.server.endpoint.exceptions import ServerResponseError, MissingRequiredFieldError
9+
from tableauserverclient.server.endpoint.extensions_endpoint import Extensions
910
from tableauserverclient.server.endpoint.favorites_endpoint import Favorites
1011
from tableauserverclient.server.endpoint.fileuploads_endpoint import Fileuploads
1112
from tableauserverclient.server.endpoint.flow_runs_endpoint import FlowRuns
@@ -42,6 +43,7 @@
4243
"QuerysetEndpoint",
4344
"MissingRequiredFieldError",
4445
"Endpoint",
46+
"Extensions",
4547
"Favorites",
4648
"Fileuploads",
4749
"FlowRuns",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from tableauserverclient.models.extensions_item import ExtensionsServer
2+
from tableauserverclient.server.endpoint.endpoint import Endpoint
3+
from tableauserverclient.server.endpoint.endpoint import api
4+
5+
6+
class Extensions(Endpoint):
7+
def __init__(self, parent_srv):
8+
super().__init__(parent_srv)
9+
10+
@property
11+
def _server_baseurl(self) -> str:
12+
return f"{self.parent_srv.baseurl}/settings/extensions"
13+
14+
@api(version="3.21")
15+
def get_server_settings(self) -> ExtensionsServer:
16+
"""Lists the settings for extensions of a server
17+
18+
Returns
19+
-------
20+
ExtensionsServer
21+
The server extensions settings
22+
"""
23+
response = self.get_request(self._server_baseurl)
24+
return ExtensionsServer.from_response(response.content, self.parent_srv.namespace)

tableauserverclient/server/server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
Tags,
4040
VirtualConnections,
4141
OIDC,
42+
Extensions,
4243
)
4344
from tableauserverclient.server.exceptions import (
4445
ServerInfoEndpointNotFoundError,
@@ -185,6 +186,7 @@ def __init__(self, server_address, use_server_version=False, http_options=None,
185186
self.tags = Tags(self)
186187
self.virtual_connections = VirtualConnections(self)
187188
self.oidc = OIDC(self)
189+
self.extensions = Extensions(self)
188190

189191
self._session = self._session_factory()
190192
self._http_options = dict() # must set this before making a server call
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-2.3.xsd">
3+
<extensionsServerSettings>
4+
<extensionsGloballyEnabled>false</extensionsGloballyEnabled>
5+
</extensionsServerSettings>
6+
</tsResponse>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-2.3.xsd">
3+
<extensionsServerSettings>
4+
<extensionsGloballyEnabled>true</extensionsGloballyEnabled>
5+
<blockList>https://test.com</blockList>
6+
<blockList>https://example.com</blockList>
7+
</extensionsServerSettings>
8+
</tsResponse>

0 commit comments

Comments
 (0)