Skip to content

Commit 5daf9b9

Browse files
committed
add two auth types
1 parent ba5eff5 commit 5daf9b9

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

tableauserverclient/models/user_item.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ class Auth:
8686
SAML = "SAML"
8787
TableauIDWithMFA = "TableauIDWithMFA"
8888
ServerDefault = "ServerDefault"
89+
TableauID = "TableauID"
90+
Local = "Local"
8991

9092
def __init__(
9193
self, name: Optional[str] = None, site_role: Optional[str] = None, auth_setting: Optional[str] = None
@@ -394,7 +396,7 @@ def process_file_for_import(
394396
if not validate_only:
395397
user: UserItem = UserItem.CSVImport.create_user_model_from_line(line, logger)
396398
users.append(user)
397-
valid.append(line)
399+
valid.append(" ".join(line))
398400
except Exception as e:
399401
failed.append((" ".join(line), e))
400402
return users, valid, failed
@@ -419,6 +421,7 @@ def _validate_import_line_or_throw(line, logger) -> None:
419421

420422
if len(line) > UserItem.CSVImport.ColumnType.MAX:
421423
raise AttributeError("Too many attributes in line")
424+
# sometimes usernames are case sensitive
422425
username = line[UserItem.CSVImport.ColumnType.USERNAME.value]
423426
logger.debug(f"> details - {username}")
424427
UserItem.validate_username_or_throw(username)

tableauserverclient/server/endpoint/users_endpoint.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import _csv
12
import copy
23
import logging
34
from typing import Optional
@@ -21,6 +22,10 @@ class Users(QuerysetEndpoint[UserItem]):
2122
users in the REST API and operate on the UserItem class. Only server and
2223
site administrators can access the user resources.
2324
"""
25+
def _check_user_id(self, user_item: UserItem):
26+
if not user_item.id:
27+
error = "User item missing ID."
28+
raise MissingRequiredFieldError(error)
2429

2530
@property
2631
def baseurl(self) -> str:
@@ -193,9 +198,7 @@ def update(self, user_item: UserItem, password: Optional[str] = None) -> UserIte
193198
>>> updated_user = server.users.update(user)
194199
195200
"""
196-
if not user_item.id:
197-
error = "User item missing ID."
198-
raise MissingRequiredFieldError(error)
201+
self._check_user_id(user_item)
199202

200203
url = f"{self.baseurl}/{user_item.id}"
201204
update_req = RequestFactory.User.update_req(user_item, password)
@@ -424,9 +427,7 @@ def populate_workbooks(self, user_item: UserItem, req_options: Optional[RequestO
424427
>>> for wb in user.workbooks:
425428
>>> print(wb.name)
426429
"""
427-
if not user_item.id:
428-
error = "User item missing ID."
429-
raise MissingRequiredFieldError(error)
430+
self._check_user_id(user_item)
430431

431432
def wb_pager():
432433
return Pager(lambda options: self._get_wbs_for_user(user_item, options), req_options)
@@ -436,6 +437,8 @@ def wb_pager():
436437
def _get_wbs_for_user(
437438
self, user_item: UserItem, req_options: Optional[RequestOptions] = None
438439
) -> tuple[list[WorkbookItem], PaginationItem]:
440+
441+
self._check_user_id(user_item)
439442
url = f"{self.baseurl}/{user_item.id}/workbooks"
440443
server_response = self.get_request(url, req_options)
441444
logger.info(f"Populated workbooks for user (ID: {user_item.id})")
@@ -500,9 +503,7 @@ def populate_groups(self, user_item: UserItem, req_options: Optional[RequestOpti
500503
>>> for group in user.groups:
501504
>>> print(group.name)
502505
"""
503-
if not user_item.id:
504-
error = "User item missing ID."
505-
raise MissingRequiredFieldError(error)
506+
self._check_user_id(user_item)
506507

507508
def groups_for_user_pager():
508509
return Pager(

test/test_user_model.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,31 @@ def test_get_user_detail_standard(self):
9191
assert test_user.site_role == "Unlicensed", test_user.site_role
9292
assert test_user.email == "email", test_user.email
9393

94+
def test_get_user_detail_variation(self):
95+
test_line = ["username", "pword", "fname", "license", "admin", "pub", "email"]
96+
test_user: TSC.UserItem = TSC.UserItem.CSVImport.create_user_model_from_line(test_line, UserDataTest.logger)
97+
assert test_user.name == "username", test_user.name
98+
assert test_user.fullname == "fname", test_user.fullname
99+
assert test_user.site_role == "license", test_user.site_role
100+
assert test_user.email == "email", test_user.email
101+
102+
def test_create_user_invalid_license(self):
103+
test_line = ["username", "pword", "fname", "license", "site", "yes", "email"]
104+
with self.assertRaises(AttributeError):
105+
test_user: TSC.UserItem = TSC.UserItem.CSVImport.create_user_model_from_line(test_line, UserDataTest.logger)
106+
107+
def test_create_user_invalid_role(self):
108+
test_line = ["username", "pword", "fname", "creator", "role", "yes", "email"]
109+
with self.assertRaises(AttributeError):
110+
test_user: TSC.UserItem = TSC.UserItem.CSVImport.create_user_model_from_line(test_line, UserDataTest.logger)
111+
112+
test_line = ["username", "pword", "fname", "license", "admin", "pub", "email"]
113+
test_user: TSC.UserItem = TSC.UserItem.CSVImport.create_user_model_from_line(test_line, UserDataTest.logger)
114+
assert test_user.name == "username", test_user.name
115+
assert test_user.fullname == "fname", test_user.fullname
116+
assert test_user.site_role == "license", test_user.site_role
117+
assert test_user.email == "email", test_user.email
118+
94119
def test_get_user_details_only_username(self):
95120
test_line = ["username"]
96121
test_user: TSC.UserItem = TSC.UserItem.CSVImport.create_user_model_from_line(test_line, UserDataTest.logger)

0 commit comments

Comments
 (0)