@@ -287,9 +287,25 @@ def update_sign_users(self, directory_users, sign_connector: SignConnector, org_
287287 status = 'DELETED' ,
288288 )
289289
290+ # figure out primary group for user
291+ sign_groups = set ([g .lower () for g in groups_to_update .keys ()])\
292+ .union (set ([g .lower () for g in assigned_groups .keys ()]))
293+ desired_pg = self .resolve_primary_group (sign_groups )
294+ current_pg = [g .name .lower () for g in assigned_groups .values () if g .isPrimaryGroup ]
295+ if current_pg :
296+ current_pg = current_pg [0 ]
297+ else :
298+ current_pg = None
299+
300+ if desired_pg is None :
301+ raise AssertionException (f"Can't identify a primary group for user '{ sign_user .email } '" )
302+
303+ if current_pg is None or desired_pg .lower () != current_pg :
304+ self .logger .debug (f"Primary group of '{ sign_user .email } ' is '{ desired_pg } '" )
305+ groups_to_update [desired_pg .lower ()].isPrimaryGroup = True
290306
291307 if groups_to_update :
292- group_update_data = UserGroupsInfo (groupInfoList = groups_to_update )
308+ group_update_data = UserGroupsInfo (groupInfoList = list ( groups_to_update . values ()) )
293309 user_groups_update_list .append ((sign_user .id , group_update_data ))
294310
295311 sign_connector .update_users (users_update_list )
@@ -300,6 +316,12 @@ def update_sign_users(self, directory_users, sign_connector: SignConnector, org_
300316 self .total_sign_only_user_count += 1
301317 self .sign_only_users_by_org [org_name ][user ] = data
302318
319+ def resolve_primary_group (self , sign_groups ):
320+ rules = self .options ['primary_group_rules' ]
321+ for r in rules :
322+ if set (sign_groups ).intersection (r ['sign_groups' ]) == r ['sign_groups' ]:
323+ return r ['primary_group' ]
324+
303325 @staticmethod
304326 def get_primary_group (user , sign_user_groups ) -> UserGroupInfo :
305327 user_groups = sign_user_groups .get (user .id )
@@ -459,27 +481,32 @@ def insert_new_users(self, org_name: str, sign_connector: SignConnector, directo
459481 groups = assignment_groups
460482 else :
461483 groups = assignment_groups [0 :1 ]
462- groups_to_assign = []
484+ groups_to_assign = {}
463485 for group in groups :
464486 wants_group_admin = False
465487 if is_umg :
466488 wants_group_admin = directory_user ['is_group_admin' ]
467489 else :
468490 wants_group_admin = group in directory_user ['admin_groups' ]
469491 group_to_assign = self .sign_groups [org_name ][group .group_name .lower ()]
470- groups_to_assign . append ( UserGroupInfo (
492+ groups_to_assign [ group_to_assign . groupName . lower ()] = UserGroupInfo (
471493 id = group_to_assign .groupId ,
472494 name = group_to_assign .groupName ,
473495 isGroupAdmin = wants_group_admin ,
474496 isPrimaryGroup = False ,
475497 status = 'ACTIVE' ,
476- ))
498+ )
477499 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 } " )
500+ primary_group = self .resolve_primary_group (groups_to_assign .keys ())
501+ if primary_group is None :
502+ raise AssertionException (f"Can't identify a primary group for user '{ new_user .email } '" )
503+ self .logger .debug (f"Primary group of '{ new_user .email } ' is '{ primary_group } '" )
504+ groups_to_assign [primary_group .lower ()].isPrimaryGroup = True
478505 user_id = sign_connector .insert_user (new_user )
479506 self .sign_users_created .add (directory_user ['email' ])
480507 self .logger .info (f"{ self .org_string (sign_connector .console_org )} Inserted sign user '{ new_user .email } ', admin?: { new_user .isAccountAdmin } " )
481508
482- group_update_data = UserGroupsInfo (groupInfoList = groups_to_assign )
509+ group_update_data = UserGroupsInfo (groupInfoList = list ( groups_to_assign . values ()) )
483510 sign_connector .update_user_group_single (user_id , group_update_data )
484511 except ClientException as e :
485512 self .logger .error (format (e ))
0 commit comments