8000 Jorwoods/type hint permissions (#940) · tableau/server-client-python@80480fb · GitHub
[go: up one dir, main page]

Skip to content

Commit 80480fb

Browse files
jorwoodsjacalata
andauthored
Jorwoods/type hint permissions (#940)
* Type hint permissions * Type hint default permissions * Remove hints from enums * Remove unused import Co-authored-by: Jac <jacalata@users.noreply.github.com>
1 parent 1f0d0dc commit 80480fb

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

tableauserverclient/models/permissions_item.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77

88
logger = logging.getLogger("tableau.models.permissions_item")
99

10+
from typing import Dict, List, Optional, TYPE_CHECKING
11+
12+
if TYPE_CHECKING:
13+
from .reference_item import ResourceReference
14+
1015

1116
class Permission:
1217
class Mode:
@@ -42,19 +47,19 @@ class Resource:
4247

4348

4449
class PermissionsRule(object):
45-
def __init__(self, grantee, capabilities):
50+
def __init__(self, grantee: "ResourceReference", capabilities: Dict[Optional[str], Optional[str]]) -> None:
4651
self.grantee = grantee
4752
self.capabilities = capabilities
4853

4954
@classmethod
50-
def from_response(cls, resp, ns=None):
55+
def from_response(cls, resp, ns=None) -> List["PermissionsRule"]:
5156
parsed_response = ET.fromstring(resp)
5257

5358
rules = []
5459
permissions_rules_list_xml = parsed_response.findall(".//t:granteeCapabilities", namespaces=ns)
5560

5661
for grantee_capability_xml in permissions_rules_list_xml:
57-
capability_dict = {}
62+
capability_dict: Dict[Optional[str], Optional[str]] = {}
5863

5964
grantee = PermissionsRule._parse_grantee_element(grantee_capability_xml, ns)
6065

@@ -70,7 +75,7 @@ def from_response(cls, resp, ns=None):
7075
return rules
7176

7277
@staticmethod
73-
def _parse_grantee_element(grantee_capability_xml, ns):
78+
def _parse_grantee_element(grantee_capability_xml: ET.Element, ns: Optional[Dict[str, str]]) -> "ResourceReference":
7479
"""Use Xpath magic and some string splitting to get the right object type from the xml"""
7580

7681
# Get the first element in the tree with an 'id' attribute

tableauserverclient/server/endpoint/default_permissions_endpoint.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99

1010
logger = logging.getLogger(__name__)
1111

12+
from typing import TYPE_CHECKING, Callable, List, Optional, Sequence, Union
13+
14+
if TYPE_CHECKING:
15+
from ...models import (
16+
DatasourceItem,
17+
FlowItem,
18+
ProjectItem,
19+
ViewItem,
20+
WorkbookItem,
21+
)
22+
23+
from ..server import Server
24+
from ..request_options import RequestOptions
25+
26+
TableauItem = Union[DatasourceItem, FlowItem, ProjectItem, ViewItem, WorkbookItem]
27+
1228

1329
class _DefaultPermissionsEndpoint(Endpoint):
1430
"""Adds default-permission model to another endpoint
@@ -19,15 +35,17 @@ class _DefaultPermissionsEndpoint(Endpoint):
1935
has these supported endpoints
2036
"""
2137

22-
def __init__(self, parent_srv, owner_baseurl):
38+
def __init__(self, parent_srv: "Server", owner_baseurl: Callable[[], str]) -> None:
2339
super(_DefaultPermissionsEndpoint, self).__init__(parent_srv)
2440

2541
# owner_baseurl is the baseurl of the parent. The MUST be a lambda
2642
# since we don't know the full site URL until we sign in. If
2743
# populated without, we will get a sign-in error
2844
self.owner_baseurl = owner_baseurl
2945

30-
def update_default_permissions(self, resource, permissions, content_type):
46+
def update_default_permissions(
47+
self, resource: "TableauItem", permissions: Sequence[PermissionsRule], content_type: str
48+
) -> List[PermissionsRule]:
3149
url = "{0}/{1}/default-permissions/{2}".format(self.owner_baseurl(), resource.id, content_type + "s")
3250
update_req = RequestFactory.Permission.add_req(permissions)
3351
response = self.put_request(url, update_req)
@@ -36,7 +54,7 @@ def update_default_permissions(self, resource, permissions, content_type):
3654

3755
return permissions
3856

39-
def delete_default_permission(self, resource, rule, content_type):
57+
def delete_default_permission(self, resource: "TableauItem", rule: PermissionsRule, content_type: str) -> None:
4058
for capability, mode in rule.capabilities.items():
4159
# Made readability better but line is too long, will make this look better
4260
url = (
@@ -60,18 +78,20 @@ def delete_default_permission(self, resource, rule, content_type):
6078
"Deleted permission for {0} {1} item {2}".format(rule.grantee.tag_name, rule.grantee.id, resource.id)
6179
)
6280

63-
def populate_default_permissions(self, item, content_type):
81+
def populate_default_permissions(self, item: "ProjectItem", content_type: str) -> None:
6482
if not item.id:
6583
error = "Server item is missing ID. Item must be retrieved from server first."
6684
raise MissingRequiredFieldError(error)
6785

68-
def permission_fetcher():
86+
def permission_fetcher() -> List[PermissionsRule]:
6987
return self._get_default_permissions(item, content_type)
7088

7189
item._set_default_permissions(permission_fetcher, content_type)
7290
logger.info("Populated {0} permissions for item (ID: {1})".format(item.id, content_type))
7391

74-
def _get_default_permissions(self, item, content_type, req_options=None):
92+
def _get_default_permissions(
93+
self, item: "TableauItem", content_type: str, req_options: Optional["RequestOptions"] = None
94+
) -> List[PermissionsRule]:
7595
url = "{0}/{1}/default-permissions/{2}".format(self.owner_baseurl(), item.id, content_type + "s")
7696
server_response = self.get_request(url, req_options)
7797
permissions = PermissionsRule.from_response(server_response.content, self.parent_srv.namespace)

tableauserverclient/server/endpoint/permissions_endpoint.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88

99
logger = logging.getLogger(__name__)
1010

11+
from typing import Callable, TYPE_CHECKING, List, Union
12+
13+
if TYPE_CHECKING:
14+
from ...models import DatasourceItem, ProjectItem, WorkbookItem, ViewItem
15+
from ..server import Server
16+
from ..request_options import RequestOptions
17+
18+
TableauItem = Union["DatasourceItem", "ProjectItem", "WorkbookItem", "ViewItem"]
19+
1120

1221
class _PermissionsEndpoint(Endpoint):
1322
"""Adds permission model to another endpoint
@@ -18,15 +27,15 @@ class _PermissionsEndpoint(Endpoint):
1827
parent endpoint which has these supported endpoints
1928
"""
2029

21-
def __init__(self, parent_srv, owner_baseurl):
30+
def __init__(self, parent_srv: "Server", owner_baseurl: Callable[[], str]) -> None:
2231
super(_PermissionsEndpoint, self).__init__(parent_srv)
2332

2433
# owner_baseurl is the baseurl of the parent. The MUST be a lambda
2534
# since we don't know the full site URL until we sign in. If
2635
# populated without, we will get a sign-in error
2736
self.owner_baseurl = owner_baseurl
2837

29-
def update(self, resource, permissions):
38+
def update(self, resource: TableauItem, permissions: List[PermissionsRule]) -> List[PermissionsRule]:
3039
url = "{0}/{1}/permissions".format(self.owner_baseurl(), resource.id)
3140
update_req = RequestFactory.Permission.add_req(permissions)
3241
response = self.put_request(url, update_req)
@@ -35,7 +44,7 @@ def update(self, resource, permissions):
3544

3645
return permissions
3746

38-
def delete(self, resource, rules):
47+
def delete(self, resource: TableauItem, rules: Union[PermissionsRule, List[PermissionsRule]]):
3948
# Delete is the only endpoint that doesn't take a list of rules
4049
# so let's fake it to keep it consistent
4150
# TODO that means we need error handling around the call
@@ -62,7 +71,7 @@ def delete(self, resource, rules):
6271
"Deleted permission for {0} {1} item {2}".format(rule.grantee.tag_name, rule.grantee.id, resource.id)
6372
)
6473

65-
def populate(self, item):
74+
def populate(self, item: TableauItem):
6675
if not item.id:
6776
error = "Server item is missing ID. Item must be retrieved from server first."
6877
raise MissingRequiredFieldError(error)
@@ -73,7 +82,7 @@ def permission_fetcher():
7382
item._set_permissions(permission_fetcher)
7483
logger.info("Populated permissions for item (ID: {0})".format(item.id))
7584

76-
def _get_permissions(self, item, req_options=None):
85+
def _get_permissions(self, item: TableauItem, req_options: "RequestOptions" = None):
7786
url = "{0}/{1}/permissions".format(self.owner_baseurl(), item.id)
7887
server_response = self.get_request(url, req_options)
7988
permissions = PermissionsRule.from_response(server_response.content, self.parent_srv.namespace)

tableauserverclient/server/request_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from ..models import TaskItem, UserItem, GroupItem, PermissionsRule, FavoriteItem
77

8-
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Tuple
8+
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Tuple, Iterable
99

1010
if TYPE_CHECKING:
1111
from ..models import DataAlertItem
@@ -429,7 +429,7 @@ def update_req(self, group_item: GroupItem, default_site_role: Optional[str] = N
429429

430430

431431
class PermissionRequest(object):
432-
def add_req(self, rules):
432+
def add_req(self, rules: Iterable[PermissionsRule]) -> bytes:
433433
xml_request = ET.Element("tsRequest")
434434
permissions_element = ET.SubElement(xml_request, "permissions")
435435

0 commit comments

Comments
 (0)
0