55from allauth .account .signals import user_logged_in
66from allauth .socialaccount .adapter import DefaultSocialAccountAdapter
77from django .dispatch import receiver
8+ from common .helpers .error_handlers import ReportableError
89from civictechprojects .models import ProjectFile , FileCategory
910from democracylab .models import Contributor
1011from django .contrib .auth .models import User
1112from django .utils import timezone
13+ import simplejson as json
14+
15+
16+ class MissingOAuthFieldError (ReportableError ):
17+ """Exception raised when required fields are not returned from OAuth
18+
19+ Attributes:
20+ missing_fields -- description of missing fields
21+ message -- explanation of the error to be reported in the logs
22+ """
23+
24+ def __init__ (self , message , provider , missing_fields ):
25+ super ().__init__ (message , {'provider' : provider , 'missing_fields' : missing_fields })
1226
1327
1428class SocialAccountAdapter (DefaultSocialAccountAdapter ):
@@ -35,13 +49,20 @@ def pre_social_login(self, request, sociallogin):
3549 raising an ImmediateHttpResponse
3650 """
3751 # standardizing fields across different providers
38- data = sociallogin .account .get_provider ().extract_common_fields (
52+ provider = sociallogin .account .get_provider ()
53+ data = provider .extract_common_fields (
3954 sociallogin .account .extra_data )
4055
4156 full_name = data .get ('name' )
4257 first_name = data .get ('first_name' )
4358 last_name = data .get ('last_name' )
4459
60+ if full_name is None and first_name is None :
61+ missing_fields = ['name' , 'first_name' , 'last_name' ]
62+ msg = 'Social login Failed for {provider}. Missing fields: {fields}' \
63+ .format (provider = provider .name , fields = missing_fields )
64+ raise MissingOAuthFieldError (msg , provider .name , "Full Name" )
65+
4566 sociallogin .user .first_name = first_name or full_name .split ()[0 ]
4667 sociallogin .user .last_name = last_name or ' ' .join (full_name .split ()[1 :])
4768 # Set username to lowercase email
0 commit comments