Skip to content

Commit 007136f

Browse files
committed
feat: support _all_ fields for UserItem
1 parent e874411 commit 007136f

File tree

3 files changed

+90
-2
lines changed

3 files changed

+90
-2
lines changed

tableauserverclient/models/user_item.py

+43-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ def __init__(
9494
self.name: Optional[str] = name
9595
self.site_role: Optional[str] = site_role
9696
self.auth_setting: Optional[str] = auth_setting
97+
self._locale: Optional[str] = None
98+
self._language: Optional[str] = None
99+
self._idp_configuration_id: Optional[str] = None
97100

98101
return None
99102

@@ -184,6 +187,18 @@ def groups(self) -> "Pager":
184187
raise UnpopulatedPropertyError(error)
185188
return self._groups()
186189

190+
@property
191+
def locale(self) -> Optional[str]:
192+
return self._locale
193+
194+
@property
195+
def language(self) -> Optional[str]:
196+
return self._language
197+
198+
@property
199+
def idp_configuration_id(self) -> Optional[str]:
200+
return self._idp_configuration_id
201+
187202
def _set_workbooks(self, workbooks) -> None:
188203
self._workbooks = workbooks
189204

@@ -204,8 +219,11 @@ def _parse_common_tags(self, user_xml, ns) -> "UserItem":
204219
email,
205220
auth_setting,
206221
_,
222+
_,
223+
_,
224+
_,
207225
) = self._parse_element(user_xml, ns)
208-
self._set_values(None, None, site_role, None, None, fullname, email, auth_setting, None)
226+
self._set_values(None, None, site_role, None, None, fullname, email, auth_setting, None, None, None, None)
209227
return self
210228

211229
def _set_values(
@@ -219,6 +237,9 @@ def _set_values(
219237
email,
220238
auth_setting,
221239
domain_name,
240+
locale,
241+
language,
242+
idp_configuration_id,
222243
):
223244
if id is not None:
224245
self._id = id
@@ -238,6 +259,12 @@ def _set_values(
238259
self._auth_setting = auth_setting
239260
if domain_name:
240261
self._domain_name = domain_name
262+
if locale:
263+
self._locale = locale
264+
if language:
265+
self._language = language
266+
if idp_configuration_id:
267+
self._idp_configuration_id = idp_configuration_id
241268

242269
@classmethod
243270
def from_response(cls, resp, ns) -> list["UserItem"]:
@@ -271,6 +298,9 @@ def _parse_xml(cls, element_name, resp, ns):
271298
email,
272299
auth_setting,
273300
domain_name,
301+
locale,
302+
language,
303+
idp_configuration_id,
274304
) = cls._parse_element(user_xml, ns)
275305
user_item = cls(name, site_role)
276306
user_item._set_values(
@@ -283,6 +313,9 @@ def _parse_xml(cls, element_name, resp, ns):
283313
email,
284314
auth_setting,
285315
domain_name,
316+
locale,
317+
language,
318+
idp_configuration_id,
286319
)
287320
all_user_items.append(user_item)
288321
return all_user_items
@@ -301,6 +334,9 @@ def _parse_element(user_xml, ns):
301334
fullname = user_xml.get("fullName", None)
302335
email = user_xml.get("email", None)
303336
auth_setting = user_xml.get("authSetting", None)
337+
locale = user_xml.get("locale", None)
338+
language = user_xml.get("language", None)
339+
idp_configuration_id = user_xml.get("idpConfigurationId", None)
304340

305341
domain_name = None
306342
domain_elem = user_xml.find(".//t:domain", namespaces=ns)
@@ -317,6 +353,9 @@ def _parse_element(user_xml, ns):
317353
email,
318354
auth_setting,
319355
domain_name,
356+
locale,
357+
language,
358+
idp_configuration_id,
320359
)
321360

322361
class CSVImport:
@@ -367,6 +406,9 @@ def create_user_from_line(line: str):
367406
values[UserItem.CSVImport.ColumnType.EMAIL],
368407
values[UserItem.CSVImport.ColumnType.AUTH],
369408
None,
409+
None,
410+
None,
411+
None,
370412
)
371413
return user
372414

test/assets/user_get_all_fields.xml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<ns0:tsResponse xmlns:ns0="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api https://help.tableau.com/samples/en-us/rest_api/ts-api_3_25.xsd">
2+
<ns0:pagination pageNumber="1" pageSize="100" totalAvailable="2" />
3+
<ns0:users>
4+
<ns0:user authSetting="TableauIDWithMFA" email="[email protected]" externalAuthUserId="38c870c3ac5e84ec66e6ced9fb23681835b07e56d5660371ac1f705cc65bd610" fullName="Bob Smith" id="ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" lastLogin="2025-02-04T06:39:20Z" name="[email protected]" siteRole="SiteAdministratorCreator" locale="" language="en" idpConfigurationId="22222222-2222-2222-2222-222222222222">
5+
<ns0:domain name="TABID_WITH_MFA" />
6+
</ns0:user>
7+
<ns0:user authSetting="TableauIDWithMFA" email="[email protected]" externalAuthUserId="96f66b893b22669cdfa632275d354cd1d92cea0266f3be7702151b9b8c52be29" fullName="Alice Jones" id="f6d72445-285b-48e5-8380-f90b519ce682" name="[email protected]" siteRole="ExplorerCanPublish" locale="" language="en" idpConfigurationId="22222222-2222-2222-2222-222222222222">
8+
<ns0:domain name="TABID_WITH_MFA" />
9+
</ns0:user>
10+
</ns0:users>
11+
</ns0:tsResponse>

test/test_user.py

+36-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import requests_mock
55

66
import tableauserverclient as TSC
7-
from tableauserverclient.datetime_helpers import format_datetime
7+
from tableauserverclient.datetime_helpers import format_datetime, parse_datetime
88

99
TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), "assets")
1010

1111
GET_XML = os.path.join(TEST_ASSET_DIR, "user_get.xml")
12+
GET_XML_ALL_FIELDS = os.path.join(TEST_ASSET_DIR, "user_get_all_fields.xml")
1213
GET_EMPTY_XML = os.path.join(TEST_ASSET_DIR, "user_get_empty.xml")
1314
GET_BY_ID_XML = os.path.join(TEST_ASSET_DIR, "user_get_by_id.xml")
1415
UPDATE_XML = os.path.join(TEST_ASSET_DIR, "user_update.xml")
@@ -233,3 +234,37 @@ def test_get_users_from_file(self):
233234
users, failures = self.server.users.create_from_file(USERS)
234235
assert users[0].name == "Cassie", users
235236
assert failures == []
237+
238+
def test_get_users_all_fields(self) -> None:
239+
self.server.version = "3.7"
240+
baseurl = self.server.users.baseurl
241+
with open(GET_XML_ALL_FIELDS) as f:
242+
response_xml = f.read()
243+
244+
with requests_mock.mock() as m:
245+
m.get(f"{baseurl}?fields=_all_", text=response_xml)
246+
all_users, _ = self.server.users.get()
247+
248+
assert all_users[0].auth_setting == "TableauIDWithMFA"
249+
assert all_users[0].email == "[email protected]"
250+
assert all_users[0].external_auth_user_id == "38c870c3ac5e84ec66e6ced9fb23681835b07e56d5660371ac1f705cc65bd610"
251+
assert all_users[0].fullname == "Bob Smith"
252+
assert all_users[0].id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9"
253+
assert all_users[0].last_login == parse_datetime("2025-02-04T06:39:20Z")
254+
assert all_users[0].name == "[email protected]"
255+
assert all_users[0].site_role == "SiteAdministratorCreator"
256+
assert all_users[0].locale is None
257+
assert all_users[0].language == "en"
258+
assert all_users[0].idp_configuration_id == "22222222-2222-2222-2222-222222222222"
259+
assert all_users[0].domain_name == "TABID_WITH_MFA"
260+
assert all_users[1].auth_setting == "TableauIDWithMFA"
261+
assert all_users[1].email == "[email protected]"
262+
assert all_users[1].external_auth_user_id == "96f66b893b22669cdfa632275d354cd1d92cea0266f3be7702151b9b8c52be29"
263+
assert all_users[1].fullname == "Alice Jones"
264+
assert all_users[1].id == "f6d72445-285b-48e5-8380-f90b519ce682"
265+
assert all_users[1].name == "[email protected]"
266+
assert all_users[1].site_role == "ExplorerCanPublish"
267+
assert all_users[1].locale is None
268+
assert all_users[1].language == "en"
269+
assert all_users[1].idp_configuration_id == "22222222-2222-2222-2222-222222222222"
270+
assert all_users[1].domain_name == "TABID_WITH_MFA"

0 commit comments

Comments
 (0)