@@ -68,6 +68,7 @@ def __init__(self, caller_options, target_options: dict[str, dict]):
6868 self .sign_users_matched_no_updates = set ()
6969 self .directory_users_excluded = set ()
7070 self .sign_only_users_by_org : dict [str , dict [str , DetailedUserInfo ]] = {}
71+ self .target_groups_by_org = {}
7172 self .total_sign_only_user_count = 0
7273
7374 def get_groups (self , org ):
@@ -91,6 +92,9 @@ def run(self, directory_groups, directory_connector):
9192 for org_name in self .connectors :
9293 self .sign_groups [org_name ] = self .get_groups (org_name )
9394 self .default_groups [org_name ] = self .get_default_group (org_name )
95+ self .target_groups_by_org [org_name ] = set ([group for groups in [g ['groups' ]
96+ for g in directory_groups .values ()]
97+ for group in groups if group .umapi_name == org_name ])
9498
9599 for org_name , sign_connector in self .connectors .items ():
96100 self .sign_user_groups [org_name ] = sign_connector .get_user_groups ()
@@ -182,6 +186,7 @@ def update_sign_users(self, directory_users, sign_connector: SignConnector, org_
182186 self .directory_users_excluded .add (directory_user ['email' ])
183187 continue
184188 else :
189+ is_umg = self .options ['user_sync' ]['umg' ]
185190 # do not update if admin status should not change
186191 if sign_user .isAccountAdmin != directory_user ['is_admin' ]:
187192 # Update existing users
@@ -193,45 +198,68 @@ def update_sign_users(self, directory_users, sign_connector: SignConnector, org_
193198 user_data .isAccountAdmin = directory_user ['is_admin' ]
194199 self .sign_users_role_updates .add (sign_user .email )
195200 users_update_list .append (user_data )
201+
196202 # manage primary group asssignment
197- # current_group: UserGroupInfo = self.sign_user_primary_groups[org_name][sign_user.id]
198- current_group = self .get_primary_group (sign_user , self .sign_user_groups [org_name ])
199- should_be_group_admin = directory_user ['is_group_admin' ]
200- is_group_admin = current_group .isGroupAdmin
203+ current_groups = self .sign_user_groups [org_name ].get (sign_user .id )
204+
205+ assigned_groups = {}
206+ if current_groups is not None :
207+ assigned_groups = {g .name .lower (): g for g in current_groups }
208+ if not is_umg :
209+ g = self .get_primary_group (sign_user , self .sign_user_groups [org_name ])
210+ assigned_groups = {g .name .lower (): g }
201211
202- assignment_group = None
212+ desired_groups = set ()
203213 if directory_user ['sign_groups' ]:
204- assignment_group = directory_user ['sign_groups' ][ 0 ]. group_name
214+ desired_groups = set ([ g . group_name . lower () for g in directory_user ['sign_groups' ]])
205215 else :
206- assignment_group = self .get_primary_group (sign_user , self .sign_user_groups [org_name ])
207-
208- updated_group_info = False
209- group_to_assign = UserGroupInfo (
210- id = current_group .id ,
211- name = current_group .name ,
212- isGroupAdmin = is_group_admin ,
213- isPrimaryGroup = current_group .isPrimaryGroup ,
214- status = current_group .status ,
215- createdDate = current_group .createdDate ,
216- settings = current_group .settings ,
217- )
218-
219- if current_group .name .lower () != assignment_group .lower ():
220- assignment_group_info : GroupInfo = self .sign_groups [org_name ][assignment_group .lower ()]
221- self .logger .info (f"Assigning primary group '{ assignment_group } ' to user { sign_user .email } " )
222- group_to_assign .id = assignment_group_info .groupId
223- group_to_assign .name = assignment_group_info .groupName
224- self .sign_users_group_updates .add (sign_user .email )
225- updated_group_info = True
226-
227- if is_group_admin != should_be_group_admin :
228- self .logger .info (f"Changing group Admin role for user '{ sign_user .email } ', status? { should_be_group_admin } " )
229- group_to_assign .isGroupAdmin = should_be_group_admin
230- self .sign_users_role_updates .add (sign_user .email )
231- updated_group_info = True
216+ desired_groups = set ([self .get_primary_group (sign_user , self .sign_user_groups [org_name ]).name .lower ()])
217+ if not is_umg :
218+ desired_groups = set ([directory_user ['sign_roups' ][0 ].group_name .lower ()])
219+ target_groups = set ([g .group_name .lower () for g in self .target_groups_by_org [org_name ]])
220+
221+ groups_to_assign = []
222+ for dg in desired_groups :
223+ group_info = self .sign_groups [org_name ].get (dg )
224+ if group_info is None :
225+ raise AssertionException (f"'{ dg } ' isn't a valid Sign group" )
226+
227+ assigned_group = assigned_groups .get (group_info .groupName .lower ())
228+
229+ wants_group_admin = False
230+ if is_umg :
231+ wants_group_admin = directory_user ['is_group_admin' ]
232+ else :
233+ wants_group_admin = dg in directory_user ['admin_groups' ]
234+
235+ change_group_admin = (assigned_group is None and
236+ wants_group_admin ) or \
237+ (assigned_group is not None and
238+ assigned_group .isGroupAdmin is not wants_group_admin )
239+
240+ if assigned_group is not None and not change_group_admin :
241+ continue
242+
243+ if assigned_group is None :
244+ self .logger .info (f"Assigning group '{ group_info .groupId } ' to user { sign_user .email } " )
245+ self .sign_users_group_updates .add (sign_user .email )
246+
247+ admin_status = False if not wants_group_admin and assigned_group .isGroupAdmin is not wants_group_admin else True
232248
233- if updated_group_info :
234- group_update_data = UserGroupsInfo (groupInfoList = [group_to_assign ])
249+ if change_group_admin :
250+ self .logger .info (f"Changing group Admin role for user '{ sign_user .email } ', status? { admin_status } " )
251+ self .sign_users_role_updates .add (sign_user .email )
252+
253+ groups_to_assign .append (UserGroupInfo (
254+ id = group_info .groupId ,
255+ name = group_info .groupName ,
256+ isGroupAdmin = admin_status ,
257+ isPrimaryGroup = False ,
258+ status = 'ACTIVE' ,
259+ ))
260+
261+ if groups_to_assign :
262+ group_update_data = UserGroupsInfo (groupInfoList = groups_to_assign )
235263 user_groups_update_list .append ((sign_user .id , group_update_data ))
236264
237265 sign_connector .update_users (users_update_list )
@@ -354,14 +382,15 @@ def get_directory_user_key(self, directory_user):
354382
355383 @staticmethod
356384 def resolve_group_mappings (directory_groups , group_mapping , account_admin_groups , group_admin_mapping ) -> dict :
357- matched_groups = []
385+ matched_groups = set ()
358386
359387 matched_mappings = [m for g , m in group_mapping .items () if g in directory_groups ]
360388 matched_mappings .sort (key = lambda x : x ['priority' ])
361389
362- for g in matched_mappings :
363- if g ['groups' ]:
364- matched_groups .extend (g ['groups' ])
390+ for m in matched_mappings :
391+ if m ['groups' ]:
392+ for g in m ['groups' ]:
393+ matched_groups .add (g )
365394
366395 is_admin = False
367396 for g in directory_groups :
@@ -379,7 +408,7 @@ def resolve_group_mappings(directory_groups, group_mapping, account_admin_groups
379408 is_group_admin = True
380409 admin_groups .update (target_groups )
381410
382- return matched_groups , is_admin , is_group_admin , admin_groups
411+ return list ( matched_groups ) , is_admin , is_group_admin , admin_groups
383412
384413 def insert_new_users (self , org_name : str , sign_connector : SignConnector , directory_user : dict , assignment_groups ):
385414 """
@@ -395,23 +424,33 @@ def insert_new_users(self, org_name: str, sign_connector: SignConnector, directo
395424 lastName = directory_user ['lastname' ],
396425 )
397426 try :
427+ is_umg = self .options ['user_sync' ]['umg' ]
428+ if is_umg :
429+ groups = assignment_groups
430+ else :
431+ groups = assignment_groups [0 :1 ]
432+ groups_to_assign = []
433+ for group in groups :
434+ wants_group_admin = False
435+ if is_umg :
436+ wants_group_admin = directory_user ['is_group_admin' ]
437+ else :
438+ wants_group_admin = group in directory_user ['admin_groups' ]
439+ group_to_assign = self .sign_groups [org_name ][group .group_name .lower ()]
440+ groups_to_assign .append (UserGroupInfo (
441+ id = group_to_assign .groupId ,
442+ name = group_to_assign .groupName ,
443+ isGroupAdmin = wants_group_admin ,
444+ isPrimaryGroup = False ,
445+ status = 'ACTIVE' ,
446+ ))
447+ self .logger .info (f"{ self .org_string (sign_connector .console_org )} Assigning '{ new_user .email } ' to group '{ group_to_assign .groupName } ', group admin?: { wants_group_admin } " )
398448 user_id = sign_connector .insert_user (new_user )
399449 self .sign_users_created .add (directory_user ['email' ])
400450 self .logger .info (f"{ self .org_string (sign_connector .console_org )} Inserted sign user '{ new_user .email } ', admin?: { new_user .isAccountAdmin } " )
401451
402- assignment_group = assignment_groups [0 ].group_name
403- group_to_assign : GroupInfo = self .sign_groups [org_name ][assignment_group .lower ()]
404-
405- group_update_data = UserGroupsInfo (groupInfoList = [UserGroupInfo (
406- id = group_to_assign .groupId ,
407- name = group_to_assign .groupName ,
408- isGroupAdmin = directory_user ['is_group_admin' ],
409- isPrimaryGroup = True ,
410- status = 'ACTIVE' ,
411- )])
412-
452+ group_update_data = UserGroupsInfo (groupInfoList = groups_to_assign )
413453 sign_connector .update_user_group_single (user_id , group_update_data )
414- self .logger .info (f"{ self .org_string (sign_connector .console_org )} Assigned '{ new_user .email } ' to group '{ group_to_assign .groupName } ', group admin?: { directory_user ['is_group_admin' ]} " )
415454 except ClientException as e :
416455 self .logger .error (format (e ))
417456
0 commit comments