response = kwargs.get('response')
details = self.get_user_details(response)
uid = self.get_user_id(details, response)
- new_user = False
try:
social_user = UserSocialAuth.objects.select_related('user')\
.get(provider=self.name,
username = self.username(details)
email = details.get('email')
user = User.objects.create_user(username=username, email=email)
- new_user = True
social_user = self.associate_auth(user, uid, response, details)
else:
user = social_user.user
- # Update the user account data.
- self.update_user_details(user, response, details, new_user=new_user)
+ # Update user account data.
+ self.update_user_details(user, response, details)
# Update extra_data storage, unless disabled by setting
if getattr(settings, 'SOCIAL_AUTH_EXTRA_DATA', True):
"""Return default blank user extra data"""
return ''
- def update_user_details(self, user, response, details, new_user=False):
+ def update_user_details(self, user, response, details):
"""Update user details with (maybe) new data. Username is not
changed if associating a new credential."""
- changed = False
+ changed = False # flag to track changes
# check if values update should be left to signals handlers only
if not getattr(settings, 'SOCIAL_AUTH_CHANGE_SIGNAL_ONLY', False):
for name, value in details.iteritems():
- # not update username if user already exists
- if not new_user and name == USERNAME:
- continue
- if value and value != getattr(user, name, value):
+ # do not update username, it was already generated by
+ # self.username(...) and loaded in given instance
+ if name != USERNAME and value and value != getattr(user, name,
+ value):
setattr(user, name, value)
changed = True