-
Notifications
You must be signed in to change notification settings - Fork 414
/
group_item.py
111 lines (86 loc) · 3.56 KB
/
group_item.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from typing import Callable, List, Optional, TYPE_CHECKING
from defusedxml.ElementTree import fromstring
from .exceptions import UnpopulatedPropertyError
from .property_decorators import property_not_empty, property_is_enum
from .reference_item import ResourceReference
from .user_item import UserItem
if TYPE_CHECKING:
from ..server import Pager
class GroupItem(object):
tag_name: str = "group"
class LicenseMode:
onLogin: str = "onLogin"
onSync: str = "onSync"
def __init__(self, name=None, domain_name=None) -> None:
self._id: Optional[str] = None
self._license_mode: Optional[str] = None
self._minimum_site_role: Optional[str] = None
self._users: Optional[Callable[..., "Pager"]] = None
self.name: Optional[str] = name
self.domain_name: Optional[str] = domain_name
def __str__(self):
return "{}({!r})".format(self.__class__.__name__, self.__dict__)
__repr__ = __str__
@property
def domain_name(self) -> Optional[str]:
return self._domain_name
@domain_name.setter
def domain_name(self, value: str) -> None:
self._domain_name = value
@property
def id(self) -> Optional[str]:
return self._id
@property
def name(self) -> Optional[str]:
return self._name
@name.setter
@property_not_empty
def name(self, value: str) -> None:
self._name = value
@property
def license_mode(self) -> Optional[str]:
return self._license_mode
@license_mode.setter
@property_is_enum(LicenseMode)
def license_mode(self, value: str) -> None:
self._license_mode = value
@property
def minimum_site_role(self) -> Optional[str]:
return self._minimum_site_role
@minimum_site_role.setter
@property_is_enum(UserItem.Roles)
def minimum_site_role(self, value: str) -> None:
self._minimum_site_role = value
@property
def users(self) -> "Pager":
if self._users is None:
error = "Group must be populated with users first."
raise UnpopulatedPropertyError(error)
# Each call to `.users` should create a new pager, this just runs the callable
return self._users()
def _set_users(self, users: Callable[..., "Pager"]) -> None:
self._users = users
@classmethod
def from_response(cls, resp, ns) -> List["GroupItem"]:
all_group_items = list()
parsed_response = fromstring(resp)
all_group_xml = parsed_response.findall(".//t:group", namespaces=ns)
for group_xml in all_group_xml:
name = group_xml.get("name", None)
group_item = cls(name)
group_item._id = group_xml.get("id", None)
# Domain name is returned in a domain element for some calls
domain_elem = group_xml.find(".//t:domain", namespaces=ns)
if domain_elem is not None:
group_item.domain_name = domain_elem.get("name", None)
# Import element is returned for both local and AD groups (2020.3+)
import_elem = group_xml.find(".//t:import", namespaces=ns)
if import_elem is not None:
group_item.domain_name = import_elem.get("domainName", None)
group_item.license_mode = import_elem.get("grantLicenseMode", None)
group_item.minimum_site_role = import_elem.get("siteRole", None)
all_group_items.append(group_item)
return all_group_items
@staticmethod
def as_reference(id_: str) -> ResourceReference:
return ResourceReference(id_, GroupItem.tag_name)