in pulseapi/users/adapter.py [0:0]
def pre_social_login(self, request, sociallogin):
email = user_email(sociallogin.user)
UserModel = get_user_model()
login_provider_id = sociallogin.account.provider
if (
not email or
not email_address_exists(email) or
sociallogin.state.get('process') != AuthProcess.LOGIN
):
# This is a new email address, or we're connecting social accounts
# so we don't need to do anything
return
try:
user = UserModel.objects.get(email=email)
except UserModel.DoesNotExist:
# This case shouldn't really happen, but even if it does, we
# don't do anything and let the default behavior kick in.
return
social_accounts = list(SocialAccount.objects.filter(
user=user
).values_list('provider', flat=True))
if len(social_accounts) == 0:
# This is a hack to associate existing accounts on pulse
# that were added via Google Auth the old way to the new allauth
# system. We only do this for new logins into this system.
request.migrate_user = user
elif login_provider_id in social_accounts:
# In this case, the existing user already has a social account
# and is logging into it using the same provider.
return
else:
# Here the user already has a Pulse social account (e.g. Google)
# but is logging in through a different social network
# (e.g. Github) that uses the same email for the first time.
# We redirect them to the login view where they have to login
# through their existing social account on Pulse before going to
# the Social Account Connections view to connect their secondary
# social account.
url = reverse('account_login')
qs = QueryDict(mutable=True)
next_url = sociallogin.get_redirect_url(request)
if next_url:
# We encode the final destination url in the connection
# view url so that users are correctly rerouted after
# connecting their accounts.
qs['next'] = next_url
next_url = '{url}?{qs}'.format(
url=reverse('socialaccount_connections'),
qs=qs.urlencode()
)
qs = QueryDict(mutable=True)
qs['next'] = next_url
qs['promptconnection'] = True
qs['provider'] = providers.registry.by_id(login_provider_id).name
raise ImmediateHttpResponse(
response=HttpResponseRedirect(f'{url}?{qs.urlencode()}')
)