@@ -279,6 +279,29 @@ def handle_user_invalid_email(user):
279279ID_TOKEN_ISSUER = getattr (settings , "SOCIALACCOUNT_PROVIDERS" , {}).get (PROVIDER_ID , {}).get ("ID_TOKEN_ISSUER" , "" )
280280
281281
282+ def _update_user_groups_from_social (sociallogin , user ):
283+ extractor = get_data_extractor (sociallogin .account .provider )
284+ group_role_mapper = get_group_role_mapper (sociallogin .account .provider )
285+ try :
286+ groups = extractor .extract_groups (sociallogin .account .extra_data ) or extractor .extract_roles (
287+ sociallogin .account .extra_data
288+ )
289+
290+ # check here if user is member already of other groups and remove it form the ones that are not declared here...
291+ for groupprofile in user .group_list_all ():
292+ groupprofile .leave (user )
293+ for group_role_name in groups :
294+ group_name , role_name = group_role_mapper .parse_group_and_role (group_role_name )
295+ groupprofile = GroupProfile .objects .filter (slug = group_name ).first ()
296+ if groupprofile :
297+ groupprofile .join (user )
298+ if group_role_mapper .is_manager (role_name ):
299+ groupprofile .promote (user )
300+ except (AttributeError , NotImplementedError ):
301+ pass # extractor doesn't define a method for extracting field
302+ return user
303+
304+
282305class GenericOpenIDConnectAdapter (OAuth2Adapter , SocialAccountAdapter ):
283306 provider_id = PROVIDER_ID
284307 access_token_url = ACCESS_TOKEN_URL
@@ -347,23 +370,12 @@ def complete_login(self, request, app, token, response, **kwargs):
347370
348371 def save_user (self , request , sociallogin , form = None ):
349372 user = super (SocialAccountAdapter , self ).save_user (request , sociallogin , form = form )
350- extractor = get_data_extractor (sociallogin .account .provider )
351- group_role_mapper = get_group_role_mapper (sociallogin .account .provider )
352- try :
353- groups = extractor .extract_groups (sociallogin .account .extra_data ) or extractor .extract_roles (
354- sociallogin .account .extra_data
355- )
356-
357- # check here if user is member already of other groups and remove it form the ones that are not declared here...
358- for groupprofile in user .group_list_all ():
359- groupprofile .leave (user )
360- for group_role_name in groups :
361- group_name , role_name = group_role_mapper .parse_group_and_role (group_role_name )
362- groupprofile = GroupProfile .objects .filter (slug = group_name ).first ()
363- if groupprofile :
364- groupprofile .join (user )
365- if group_role_mapper .is_manager (role_name ):
366- groupprofile .promote (user )
367- except (AttributeError , NotImplementedError ):
368- pass # extractor doesn't define a method for extracting field
373+ user = _update_user_groups_from_social (sociallogin , user )
369374 return user
375+
376+ def pre_social_login (self , request , sociallogin ):
377+ """update user groups on each social login"""
378+ super ().pre_social_login (request , sociallogin )
379+ user = sociallogin .user
380+ if user .pk :
381+ _update_user_groups_from_social (sociallogin , user )
0 commit comments