1
1
import logging
2
2
3
- from .endpoint import QuerysetEndpoint , api
4
- from .exceptions import MissingRequiredFieldError
3
+ from tableauserverclient . server . endpoint .endpoint import QuerysetEndpoint , api
4
+ from tableauserverclient . server . endpoint .exceptions import MissingRequiredFieldError
5
5
from tableauserverclient .server import RequestFactory
6
6
from tableauserverclient .models import GroupItem , UserItem , PaginationItem , JobItem
7
- from . .pager import Pager
7
+ from tableauserverclient . server .pager import Pager
8
8
9
9
from tableauserverclient .helpers .logging import logger
10
10
11
- from typing import List , Optional , TYPE_CHECKING , Tuple , Union
11
+ from typing import Iterable , List , Optional , TYPE_CHECKING , Tuple , Union
12
12
13
13
if TYPE_CHECKING :
14
- from . .request_options import RequestOptions
14
+ from tableauserverclient . server .request_options import RequestOptions
15
15
16
16
17
17
class Groups (QuerysetEndpoint [GroupItem ]):
18
18
@property
19
19
def baseurl (self ) -> str :
20
20
return "{0}/sites/{1}/groups" .format (self .parent_srv .baseurl , self .parent_srv .site_id )
21
21
22
- # Gets all groups
23
22
@api (version = "2.0" )
24
23
def get (self , req_options : Optional ["RequestOptions" ] = None ) -> Tuple [List [GroupItem ], PaginationItem ]:
24
+ """Gets all groups"""
25
25
logger .info ("Querying all groups on site" )
26
26
url = self .baseurl
27
27
server_response = self .get_request (url , req_options )
28
28
pagination_item = PaginationItem .from_response (server_response .content , self .parent_srv .namespace )
29
29
all_group_items = GroupItem .from_response (server_response .content , self .parent_srv .namespace )
30
30
return all_group_items , pagination_item
31
31
32
- # Gets all users in a given group
33
32
@api (version = "2.0" )
34
- def populate_users (self , group_item , req_options : Optional ["RequestOptions" ] = None ) -> None :
33
+ def populate_users (self , group_item : GroupItem , req_options : Optional ["RequestOptions" ] = None ) -> None :
34
+ """Gets all users in a given group"""
35
35
if not group_item .id :
36
36
error = "Group item missing ID. Group must be retrieved from server first."
37
37
raise MissingRequiredFieldError (error )
@@ -47,7 +47,7 @@ def user_pager():
47
47
group_item ._set_users (user_pager )
48
48
49
49
def _get_users_for_group (
50
- self , group_item , req_options : Optional ["RequestOptions" ] = None
50
+ self , group_item : GroupItem , req_options : Optional ["RequestOptions" ] = None
51
51
) -> Tuple [List [UserItem ], PaginationItem ]:
52
52
url = "{0}/{1}/users" .format (self .baseurl , group_item .id )
53
53
server_response = self .get_request (url , req_options )
@@ -56,9 +56,9 @@ def _get_users_for_group(
56
56
logger .info ("Populated users for group (ID: {0})" .format (group_item .id ))
57
57
return user_item , pagination_item
58
58
59
- # Deletes 1 group by id
60
59
@api (version = "2.0" )
61
60
def delete (self , group_id : str ) -> None :
61
+ """Deletes 1 group by id"""
62
62
if not group_id :
63
63
error = "Group ID undefined."
64
64
raise ValueError (error )
@@ -87,17 +87,17 @@ def update(self, group_item: GroupItem, as_job: bool = False) -> Union[GroupItem
87
87
else :
88
88
return GroupItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
89
89
90
- # Create a 'local' Tableau group
91
90
@api (version = "2.0" )
92
91
def create (self , group_item : GroupItem ) -> GroupItem :
92
+ """Create a 'local' Tableau group"""
93
93
url = self .baseurl
94
94
create_req = RequestFactory .Group .create_local_req (group_item )
95
95
server_response = self .post_request (url , create_req )
96
96
return GroupItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
97
97
98
- # Create a group based on Active Directory
99
98
@api (version = "2.0" )
100
99
def create_AD_group (self , group_item : GroupItem , asJob : bool = False ) -> Union [GroupItem , JobItem ]:
100
+ """Create a group based on Active Directory"""
101
101
asJobparameter = "?asJob=true" if asJob else ""
102
102
url = self .baseurl + asJobparameter
103
103
create_req = RequestFactory .Group .create_ad_req (group_item )
@@ -107,9 +107,9 @@ def create_AD_group(self, group_item: GroupItem, asJob: bool = False) -> Union[G
107
107
else :
108
108
return GroupItem .from_response (server_response .content , self .parent_srv .namespace )[0 ]
109
109
110
- # Removes 1 user from 1 group
111
110
@api (version = "2.0" )
112
111
def remove_user (self , group_item : GroupItem , user_id : str ) -> None :
112
+ """Removes 1 user from 1 group"""
113
113
if not group_item .id :
114
114
error = "Group item missing ID."
115
115
raise MissingRequiredFieldError (error )
@@ -120,9 +120,22 @@ def remove_user(self, group_item: GroupItem, user_id: str) -> None:
120
120
self .delete_request (url )
121
121
logger .info ("Removed user (id: {0}) from group (ID: {1})" .format (user_id , group_item .id ))
122
122
123
- # Adds 1 user to 1 group
123
+ @api (version = "3.21" )
124
+ def remove_users (self , group_item : GroupItem , users : Iterable [Union [str , UserItem ]]) -> None :
125
+ """Removes multiple users from 1 group"""
126
+ group_id = group_item .id if hasattr (group_item , "id" ) else group_item
127
+ if not isinstance (group_id , str ):
128
+ raise ValueError (f"Invalid group provided: { group_item } " )
129
+
130
+ url = f"{ self .baseurl } /{ group_id } /users/remove"
131
+ add_req = RequestFactory .Group .remove_users_req (users )
132
+ _ = self .put_request (url , add_req )
133
+ logger .info ("Removed users to group (ID: {0})" .format (group_item .id ))
134
+ return None
135
+
124
136
@api (version = "2.0" )
125
137
def add_user (self , group_item : GroupItem , user_id : str ) -> UserItem :
138
+ """Adds 1 user to 1 group"""
126
139
if not group_item .id :
127
140
error = "Group item missing ID."
128
141
raise MissingRequiredFieldError (error )
@@ -135,3 +148,17 @@ def add_user(self, group_item: GroupItem, user_id: str) -> UserItem:
135
148
user = UserItem .from_response (server_response .content , self .parent_srv .namespace ).pop ()
136
149
logger .info ("Added user (id: {0}) to group (ID: {1})" .format (user_id , group_item .id ))
137
150
return user
151
+
152
+ @api (version = "3.21" )
153
+ def add_users (self , group_item : GroupItem , users : Iterable [Union [str , UserItem ]]) -> List [UserItem ]:
154
+ """Adds multiple users to 1 group"""
155
+ group_id = group_item .id if hasattr (group_item , "id" ) else group_item
156
+ if not isinstance (group_id , str ):
157
+ raise ValueError (f"Invalid group provided: { group_item } " )
158
+
159
+ url = f"{ self .baseurl } /{ group_id } /users"
160
+ add_req = RequestFactory .Group .add_users_req (users )
161
+ server_response = self .post_request (url , add_req )
162
+ users = UserItem .from_response (server_response .content , self .parent_srv .namespace )
163
+ logger .info ("Added users to group (ID: {0})" .format (group_item .id ))
164
+ return users
0 commit comments