11from __future__ import absolute_import
22import logging
33import os
4+ import warnings
45
5- from irods .models import User , UserGroup
6+ from irods .models import User , Group
67from irods .manager import Manager
78from irods .message import UserAdminRequest , GeneralAdminRequest , iRODSMessage , GetTempPasswordForOtherRequest , GetTempPasswordForOtherOut
8- from irods .exception import UserDoesNotExist , UserGroupDoesNotExist , NoResultFound , CAT_SQL_ERR
9+ from irods .exception import UserDoesNotExist , GroupDoesNotExist , NoResultFound , CAT_SQL_ERR
910from irods .api_number import api_number
10- from irods .user import iRODSUser , iRODSUserGroup
11+ from irods .user import iRODSUser , iRODSGroup
1112import irods .password_obfuscation as obf
1213
1314logger = logging .getLogger (__name__ )
@@ -27,6 +28,24 @@ def get(self, user_name, user_zone=""):
2728 raise UserDoesNotExist ()
2829 return iRODSUser (self , result )
2930
31+ def create_with_password (self , user_name , password , user_zone = '' ):
32+ """This method can be used by a groupadmin to initialize the password field while creating the new user.
33+ (This is necessary since group administrators may not change the password of an existing user.)
34+ """
35+
36+ message_body = UserAdminRequest (
37+ "mkuser" , user_name , "" if not password else \
38+ obf .obfuscate_new_password_with_key (password , self .sess .pool .account .password )
39+ )
40+ request = iRODSMessage ("RODS_API_REQ" , msg = message_body ,
41+ int_info = api_number ['USER_ADMIN_AN' ])
42+ with self .sess .pool .get_connection () as conn :
43+ conn .send (request )
44+ response = conn .recv ()
45+ logger .debug (response .int_info )
46+ return self .get (user_name , user_zone )
47+
48+
3049 def create (self , user_name , user_type , user_zone = "" , auth_str = "" ):
3150 message_body = GeneralAdminRequest (
3251 "add" ,
@@ -176,36 +195,60 @@ def modify(self, user_name, option, new_value, user_zone=""):
176195 logger .debug (response .int_info )
177196
178197
179- class UserGroupManager (UserManager ):
198+ class GroupManager (UserManager ):
180199
181200 def get (self , name , user_zone = "" ):
182- query = self .sess .query (UserGroup ).filter (UserGroup .name == name )
201+ query = self .sess .query (Group ).filter (Group .name == name )
183202
184203 try :
185204 result = query .one ()
186205 except NoResultFound :
187- raise UserGroupDoesNotExist ()
188- return iRODSUserGroup (self , result )
206+ raise GroupDoesNotExist ()
207+ return iRODSGroup (self , result )
189208
190- def create (self , name , user_type = 'rodsgroup' , user_zone = "" , auth_str = "" , group_admin = False ):
191- if group_admin :
192- message_body = UserAdminRequest (
209+ def _api_info (self , group_admin_flag ):
210+ """
211+ If group_admin_flag is: then use UserAdminRequest API:
212+ --------------------------- ------------------------------
213+ True always
214+ False (user_groups default) never
215+ None (groups default) when user type is groupadmin
216+ """
217+
218+ sess = self .sess
219+ if group_admin_flag or (group_admin_flag is not False and sess .users .get (sess .username ).type == 'groupadmin' ):
220+ return (UserAdminRequest , 'USER_ADMIN_AN' )
221+ return (GeneralAdminRequest , 'GENERAL_ADMIN_AN' )
222+
223+ def create (self , name ,
224+ user_type = 'rodsgroup' ,
225+ user_zone = "" ,
226+ auth_str = "" ,
227+ group_admin = False , ** options ):
228+
229+ if not options .pop ('suppress_deprecation_warning' , False ):
230+ warnings .warn ('Use of session.user_groups is deprecated in v1.1.7 - prefer session.groups' ,
231+ DeprecationWarning , stacklevel = 2 )
232+
233+ (MessageClass , api_key ) = self ._api_info (group_admin )
234+ api_to_use = api_number [api_key ]
235+
236+ if MessageClass is UserAdminRequest :
237+ message_body = MessageClass (
193238 "mkgroup" ,
194239 name ,
195240 user_type ,
196241 user_zone
197242 )
198- api_to_use = api_number ['USER_ADMIN_AN' ]
199243 else :
200- message_body = GeneralAdminRequest (
244+ message_body = MessageClass (
201245 "add" ,
202246 "user" ,
203247 name ,
204248 user_type ,
205249 "" ,
206250 ""
207251 )
208- api_to_use = api_number ['GENERAL_ADMIN_AN' ]
209252 request = iRODSMessage ("RODS_API_REQ" , msg = message_body ,
210253 int_info = api_to_use )
211254 with self .sess .pool .get_connection () as conn :
@@ -216,11 +259,21 @@ def create(self, name, user_type='rodsgroup', user_zone="", auth_str="", group_a
216259
217260 def getmembers (self , name ):
218261 results = self .sess .query (User ).filter (
219- User .type != 'rodsgroup' , UserGroup .name == name )
262+ User .type != 'rodsgroup' , Group .name == name )
220263 return [iRODSUser (self , row ) for row in results ]
221264
222- def addmember (self , group_name , user_name , user_zone = "" ):
223- message_body = GeneralAdminRequest (
265+ def addmember (self , group_name ,
266+ user_name ,
267+ user_zone = "" ,
268+ group_admin = False , ** options ):
269+
270+ if not options .pop ('suppress_deprecation_warning' , False ):
271+ warnings .warn ('Use of session.user_groups is deprecated in v1.1.7 - prefer session.groups' ,
272+ DeprecationWarning , stacklevel = 2 )
273+
274+ (MessageClass , api_key ) = self ._api_info (group_admin )
275+
276+ message_body = MessageClass (
224277 "modify" ,
225278 "group" ,
226279 group_name ,
@@ -229,14 +282,25 @@ def addmember(self, group_name, user_name, user_zone=""):
229282 user_zone
230283 )
231284 request = iRODSMessage ("RODS_API_REQ" , msg = message_body ,
232- int_info = api_number ['GENERAL_ADMIN_AN' ])
285+ int_info = api_number [api_key ])
233286 with self .sess .pool .get_connection () as conn :
234287 conn .send (request )
235288 response = conn .recv ()
236289 logger .debug (response .int_info )
237290
238- def removemember (self , group_name , user_name , user_zone = "" ):
239- message_body = GeneralAdminRequest (
291+ def removemember (self ,
292+ group_name ,
293+ user_name ,
294+ user_zone = "" ,
295+ group_admin = False , ** options ):
296+
297+ if not options .pop ('suppress_deprecation_warning' , False ):
298+ warnings .warn ('Use of session.user_groups is deprecated in v1.1.7 - prefer session.groups' ,
299+ DeprecationWarning , stacklevel = 2 )
300+
301+ (MessageClass , api_key ) = self ._api_info (group_admin )
302+
303+ message_body = MessageClass (
240304 "modify" ,
241305 "group" ,
242306 group_name ,
@@ -245,8 +309,12 @@ def removemember(self, group_name, user_name, user_zone=""):
245309 user_zone
246310 )
247311 request = iRODSMessage ("RODS_API_REQ" , msg = message_body ,
248- int_info = api_number ['GENERAL_ADMIN_AN' ])
312+ int_info = api_number [api_key ])
249313 with self .sess .pool .get_connection () as conn :
250314 conn .send (request )
251315 response = conn .recv ()
252316 logger .debug (response .int_info )
317+
318+
319+ # NOTE: Everything of the form *UserGroup* is deprecated.
320+ UserGroupManager = GroupManager
0 commit comments