Skip to content

Commit e5c9035

Browse files
committed
feat: support updating server extension settings
1 parent be1d1ad commit e5c9035

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

tableauserverclient/server/endpoint/extensions_endpoint.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from tableauserverclient.models.extensions_item import ExtensionsServer
22
from tableauserverclient.server.endpoint.endpoint import Endpoint
33
from tableauserverclient.server.endpoint.endpoint import api
4+
from tableauserverclient.server.request_factory import RequestFactory
45

56

67
class Extensions(Endpoint):
@@ -22,3 +23,21 @@ def get_server_settings(self) -> ExtensionsServer:
2223
"""
2324
response = self.get_request(self._server_baseurl)
2425
return ExtensionsServer.from_response(response.content, self.parent_srv.namespace)
26+
27+
@api(version="3.21")
28+
def update_server_settings(self, extensions_server: ExtensionsServer) -> ExtensionsServer:
29+
"""Updates the settings for extensions of a server
30+
31+
Parameters
32+
----------
33+
extensions_server : ExtensionsServer
34+
The server extensions settings to update
35+
36+
Returns
37+
-------
38+
ExtensionsServer
39+
The updated server extensions settings
40+
"""
41+
req = RequestFactory.Extensions.update_server_extensions(extensions_server)
42+
response = self.put_request(self._server_baseurl, req)
43+
return ExtensionsServer.from_response(response.content, self.parent_srv.namespace)

tableauserverclient/server/request_factory.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,23 @@ def update_req(self, xml_request: ET.Element, oidc_item: SiteOIDCConfiguration)
16211621
return ET.tostring(xml_request)
16221622

16231623

1624+
class ExtensionsRequest:
1625+
@_tsrequest_wrapped
1626+
def update_server_extensions(self, xml_request: ET.Element, extensions_server: "ExtensionsServer") -> None:
1627+
extensions_element = ET.SubElement(xml_request, "extensionsServerSettings")
1628+
if not isinstance(extensions_server.enabled, bool):
1629+
raise ValueError(f"Extensions Server missing enabled: {extensions_server}")
1630+
enabled_element = ET.SubElement(extensions_element, "extensionsGloballyEnabled")
1631+
enabled_element.text = str(extensions_server.enabled).lower()
1632+
1633+
if extensions_server.block_list is None:
1634+
return
1635+
for blocked in extensions_server.block_list:
1636+
blocked_element = ET.SubElement(extensions_element, "blockList")
1637+
blocked_element.text = blocked
1638+
return
1639+
1640+
16241641
class RequestFactory:
16251642
Auth = AuthRequest()
16261643
Connection = Connection()
@@ -1631,6 +1648,7 @@ class RequestFactory:
16311648
Database = DatabaseRequest()
16321649
DQW = DQWRequest()
16331650
Empty = EmptyRequest()
1651+
Extensions = ExtensionsRequest()
16341652
Favorite = FavoriteRequest()
16351653
Fileupload = FileuploadRequest()
16361654
Flow = FlowRequest()

test/test_extensions.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from pathlib import Path
2+
3+
import requests_mock
4+
import pytest
5+
6+
import tableauserverclient as TSC
7+
8+
9+
TEST_ASSET_DIR = Path(__file__).parent / "assets"
10+
11+
GET_SERVER_EXT_SETTINGS = TEST_ASSET_DIR / "extensions_server_settings_true.xml"
12+
GET_SERVER_EXT_SETTINGS_FALSE = TEST_ASSET_DIR / "extensions_server_settings_false.xml"
13+
14+
15+
@pytest.fixture(scope="function")
16+
def server() -> TSC.Server:
17+
server = TSC.Server("http://test", False)
18+
19+
# Fake sign in
20+
server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67"
21+
server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM"
22+
server.version = "3.21"
23+
24+
return server
25+
26+
27+
def test_get_server_extensions_settings(server: TSC.Server) -> None:
28+
with requests_mock.mock() as m:
29+
m.get(server.extensions._server_baseurl, text=GET_SERVER_EXT_SETTINGS.read_text())
30+
ext_settings = server.extensions.get_server_settings()
31+
32+
assert ext_settings.enabled is True
33+
assert ext_settings.block_list is not None
34+
assert set(ext_settings.block_list) == {"https://test.com", "https://example.com"}
35+
36+
37+
def test_get_server_extensions_settings_false(server: TSC.Server) -> None:
38+
with requests_mock.mock() as m:
39+
m.get(server.extensions._server_baseurl, text=GET_SERVER_EXT_SETTINGS_FALSE.read_text())
40+
ext_settings = server.extensions.get_server_settings()
41+
42+
assert ext_settings.enabled is False
43+
assert ext_settings.block_list is not None
44+
assert len(ext_settings.block_list) == 0
45+
46+
47+
def test_update_server_extensions_settings(server: TSC.Server) -> None:
48+
with requests_mock.mock() as m:
49+
m.put(server.extensions._server_baseurl, text=GET_SERVER_EXT_SETTINGS_FALSE.read_text())
50+
51+
ext_settings = TSC.ExtensionsServer()
52+
ext_settings.enabled = False
53+
ext_settings.block_list = []
54+
55+
updated_settings = server.extensions.update_server_settings(ext_settings)
56+
57+
assert updated_settings.enabled is False
58+
assert updated_settings.block_list is not None
59+
assert len(updated_settings.block_list) == 0

0 commit comments

Comments
 (0)