8000 Jorwoods/type hint groups (#938) · tableau/server-client-python@ce144d0 · GitHub
[go: up one dir, main page]

Skip to content

Commit ce144d0

Browse files
jorwoodsjacalata
andcommitted
Jorwoods/type hint groups (#938)
* Type hint groups * Type hint GroupRequest Co-authored-by: Jac <jacalata@users.noreply.github.com>
1 parent 2373133 commit ce144d0

File tree

4 files changed

+88
-61
lines changed

4 files changed

+88
-61
lines changed

tableauserverclient/models/group_item.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,78 +4,83 @@
44
from .reference_item import ResourceReference
55
from .user_item import UserItem
66

7+
from typing import Callable, List, Optional, TYPE_CHECKING
8+
9+
if TYPE_CHECKING:
10+
from ..server import Pager
11+
712

813
class GroupItem(object):
914

10-
tag_name = "group"
15+
tag_name: str = "group"
1116

1217
class LicenseMode:
13-
onLogin = "onLogin"
14-
onSync = "onSync"
18+
onLogin: str = "onLogin"
19+
onSync: str = "onSync"
1520

16-
def __init__(self, name=None, domain_name=None):
17-
self._id = None
18-
self._license_mode = None
19-
self._minimum_site_role = None
20-
self._users = None
21-
self.name = name
22-
self.domain_name = domain_name
21+
def __init__(self, name=None, domain_name=None) -> None:
22+
self._id: Optional[str] = None
23+
self._license_mode: Optional[str] = None
24+
self._minimum_site_role: Optional[str] = None
25+
self._users: Optional[Callable[..., "Pager"]] = None
26+
self.name: Optional[str] = name
27+
self.domain_name: Optional[str] = domain_name
2328

2429
@property
25-
def domain_name(self):
30+
def domain_name(self) -> Optional[str]:
2631
return self._domain_name
2732

2833
@domain_name.setter
29-
def domain_name(self, value):
34+
def domain_name(self, value: str) -> None:
3035
self._domain_name = value
3136

3237
@property
33-
def id(self):
38+
def id(self) -> Optional[str]:
3439
return self._id
3540

3641
@property
37-
def name(self):
42+
def name(self) -> Optional[str]:
3843
return self._name
3944

4045
@name.setter
4146
@property_not_empty
42-
def name(self, value):
47+
def name(self, value: str) -> None:
4348
self._name = value
4449

4550
@property
46-
def license_mode(self):
51+
def license_mode(self) -> Optional[str]:
4752
return self._license_mode
4853

4954
@license_mode.setter
5055
@property_is_enum(LicenseMode)
51-
def license_mode(self, value):
56+
def license_mode(self, value: str) -> None:
5257
self._license_mode = value
5358

5459
@property
55-
def minimum_site_role(self):
60+
def minimum_site_role(self) -> Optional[str]:
5661
return self._minimum_site_role
5762

5863
@minimum_site_role.setter
5964
@property_is_enum(UserItem.Roles)
60-
def minimum_site_role(self, value):
65+
def minimum_site_role(self, value: str) -> None:
6166
self._minimum_site_role = value
6267

6368
@property
64-
def users(self):
69+
def users(self) -> "Pager":
6570
if self._users is None:
6671
error = "Group must be populated with users first."
6772
raise UnpopulatedPropertyError(error)
6873
# Each call to `.users` should create a new pager, this just runs the callable
6974
return self._users()
7075

71-
def to_reference(self):
76+
def to_reference(self) -> ResourceReference:
7277
return ResourceReference(id_=self.id, tag_name=self.tag_name)
7378

74-
def _set_users(self, users):
79+
def _set_users(self, users: Callable[..., "Pager"]) -> None:
7580
self._users = users
7681

7782
@classmethod
78-
def from_response(cls, resp, ns):
83+
def from_response(cls, resp, ns) -> List["GroupItem"]:
7984
all_group_items = list()
8085
parsed_response = ET.fromstring(resp)
8186
all_group_xml = parsed_response.findall(".//t:group", namespaces=ns)
@@ -100,5 +105,5 @@ def from_response(cls, resp, ns):
100105
return all_group_items
101106

102107
@staticmethod
103-
def as_reference(id_):
108+
def as_reference(id_: str) -> ResourceReference:
104109
return ResourceReference(id_, GroupItem.tag_name)

tableauserverclient/server/endpoint/groups_endpoint.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@
77

88
logger = logging.getLogger("tableau.endpoint.groups")
99

10+
from typing import List, Optional, TYPE_CHECKING, Tuple, Union
11+
12+
if TYPE_CHECKING:
13+
from ..request_options import RequestOptions
14+
1015

1116
class Groups(Endpoint):
1217
@property
13-
def baseurl(self):
18+
def baseurl(self) -> str:
1419
return "{0}/sites/{1}/groups".format(self.parent_srv.baseurl, self.parent_srv.site_id)
1520

1621
# Gets all groups
1722
@api(version="2.0")
18-
def get(self, req_options=None):
23+
def get(self, req_options: Optional["RequestOptions"] = None) -> Tuple[List[GroupItem], PaginationItem]:
1924
logger.info("Querying all groups on site")
2025
url = self.baseurl
2126
server_response = self.get_request(url, req_options)
@@ -25,7 +30,7 @@ def get(self, req_options=None):
2530

2631
# Gets all users in a given group
2732
@api(version="2.0")
28-
def populate_users(self, group_item, req_options=None):
33+
def populate_users(self, group_item, req_options: Optional["RequestOptions"] = None) -> None:
2934
if not group_item.id:
3035
error = "Group item missing ID. Group must be retrieved from server first."
3136
raise MissingRequiredFieldError(error)
@@ -40,7 +45,9 @@ def user_pager():
4045

4146
group_item._set_users(user_pager)
4247

43-
def _get_users_for_group(self, group_item, req_options=None):
48+
def _get_users_for_group(
49+
self, group_item, req_options: Optional["RequestOptions"] = None
50+
) -> Tuple[List[GroupItem], PaginationItem]:
4451
url = "{0}/{1}/users".format(self.baseurl, group_item.id)
4552
server_response = self.get_request(url, req_options)
4653
user_item = UserItem.from_response(server_response.content, self.parent_srv.namespace)
@@ -50,7 +57,7 @@ def _get_users_for_group(self, group_item, req_options=None):
5057

5158
# Deletes 1 group by id
5259
@api(version="2.0")
53-
def delete(self, group_id):
60+
def delete(self, group_id: str) -> None:
5461
if not group_id:
5562
error = "Group ID undefined."
5663
raise ValueError(error)
@@ -59,7 +66,9 @@ def delete(self, group_id):
5966
logger.info("Deleted single group (ID: {0})".format(group_id))
6067

6168
@api(version="2.0")
62-
def update(self, group_item, default_site_role=None, as_job=False):
69+
def update(
70+
self, group_item: GroupItem, default_site_role: Optional[str] = None, as_job: bool = False
71+
) -> Union[GroupItem, JobItem]:
6372
# (1/8/2021): Deprecated starting v0.15
6473
if default_site_role is not None:
6574
import warnings
@@ -90,15 +99,15 @@ def update(self, group_item, default_site_role=None, as_job=False):
9099

91100
# Create a 'local' Tableau group
92101
@api(version="2.0")
93-
def create(self, group_item):
102+
def create(self, group_item: GroupItem) -> GroupItem:
94103
url = self.baseurl
95104
create_req = RequestFactory.Group.create_local_req(group_item)
96105
server_response = self.post_request(url, create_req)
97106
return GroupItem.from_response(server_response.content, self.parent_srv.namespace)[0]
98107

99108
# Create a group based on Active Directory
100109
@api(version="2.0")
101-
def create_AD_group(self, group_item, asJob=False):
110+
def create_AD_group(self, group_item: GroupItem, asJob: bool = False) -> Union[GroupItem, JobItem]:
102111
asJobparameter = "?asJob=true" if asJob else ""
103112
url = self.baseurl + asJobparameter
104113
create_req = RequestFactory.Group.create_ad_req(group_item)
@@ -110,7 +119,7 @@ def create_AD_group(self, group_item, asJob=False):
110119

111120
# Removes 1 user from 1 group
112121
@api(version="2.0")
113-
def remove_user(self, group_item, user_id):
122+
def remove_user(self, group_item: GroupItem, user_id: str) -> None:
114123
if not group_item.id:
115124
error = "Group item missing ID."
116125
raise MissingRequiredFieldError(error)
@@ -123,7 +132,7 @@ def remove_user(self, group_item, user_id):
123132

124133
# Adds 1 user to 1 group
125134
@api(version="2.0")
126-
def add_user(self, group_item, user_id):
135+
def add_user(self, group_item: GroupItem, user_id: str) -> UserItem:
127136
if not group_item.id:
128137
error = "Group item missing ID."
129138
raise MissingRequiredFieldError(error)

tableauserverclient/server/request_factory.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from ..models import FlowItem
1313
from ..models import ConnectionItem
1414

15-
1615
def _add_multipart(parts: Dict) -> Tuple[Any, str]:
1716
mime_multipart_parts = list()
1817
for name, (filename, data, content_type) in parts.items():
@@ -353,24 +352,30 @@ def publish_req_chunked(self, flow_item, connections=None) -> Tuple[Any, str]:
353352

354353

355354
class GroupRequest(object):
356-
def add_user_req(self, user_id):
355+
def add_user_req(self, user_id: str) -> bytes:
357356
xml_request = ET.Element("tsRequest")
358357
user_element = ET.SubElement(xml_request, "user")
359358
user_element.attrib["id"] = user_id
360359
return ET.tostring(xml_request)
361360

362-
def create_local_req(self, group_item):
361+
def create_local_req(self, group_item: GroupItem) -> bytes:
363362
xml_request = ET.Element("tsRequest")
364363
group_element = ET.SubElement(xml_request, "group")
365-
group_element.attrib["name"] = group_item.name
364+
if group_item.name is not None:
365+
group_element.attrib["name"] = group_item.name
366+
else:
367+
raise ValueError("Group name must be populated")
366368
if group_item.minimum_site_role is not None:
367369
group_element.attrib["minimumSiteRole"] = group_item.minimum_site_role
368370
return ET.tostring(xml_request)
369371

370-
def create_ad_req(self, group_item):
372+
def create_ad_req(self, group_item: GroupItem) -> bytes:
371373
xml_request = ET.Element("tsRequest")
372374
group_element = ET.SubElement(xml_request, "group")
373-
group_element.attrib["name"] = group_item.name
375+
if group_item.name is not None:
376+
group_element.attrib["name"] = group_item.name
377+
else:
378+
raise ValueError("Group name must be populated")
374379
import_element = ET.SubElement(group_element, "import")
375380
import_element.attrib["source"] = "ActiveDirectory"
376381
if group_item.domain_name is None:
@@ -384,7 +389,7 @@ def create_ad_req(self, group_item):
384389
import_element.attrib["siteRole"] = group_item.minimum_site_role
385390
return ET.tostring(xml_request)
386391

387-
def update_req(self, group_item, default_site_role=None):
392+
def update_req(self, group_item: GroupItem, default_site_role: Optional[str] = None) -> bytes:
388393
# (1/8/2021): Deprecated starting v0.15
389394
if default_site_role is not None:
390395
import warnings
@@ -399,13 +404,20 @@ def update_req(self, group_item, default_site_role=None):
399404

400405
xml_request = ET.Element("tsRequest")
401406
group_element = ET.SubElement(xml_request, "group")
402-
group_element.attrib["name"] = group_item.name
407+
408+
if group_item.name is not None:
409+
group_element.attrib["name"] = group_item.name
410+
else:
411+
raise ValueError("Group name must be populated")
403412
if group_item.domain_name is not None and group_item.domain_name != "local":
404413
# Import element is only accepted in the request for AD groups
405414
import_element = ET.SubElement(group_element, "import")
406415
import_element.attrib["source"] = "ActiveDirectory"
407416
import_element.attrib["domainName"] = group_item.domain_name
408-
import_element.attrib["siteRole"] = group_item.minimum_site_role
417+
if isinstance(group_item.minimum_site_role, str):
418+
import_element.attrib["siteRole"] = group_item.minimum_site_role
419+
else:
420+
raise ValueError("Minimum site role must be provided.")
409421
if group_item.license_mode is not None:
410422
import_element.attrib["grantLicenseMode"] = group_item.license_mode
411423
else:

0 commit comments

Comments
 (0)
0