Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

92 lines (75 sloc) 3.295 kB
from uuid import uuid4
from social_auth.utils import setting
from social_auth.models import UserSocialAuth
from social_auth.backends import USERNAME
from social_auth.signals import socialauth_registered, \
def get_username(details, user=None,
*args, **kwargs):
"""Return an username for new user. Return current user username
if user was given.
if user:
return {'username': user.username}
if details.get(USERNAME):
username = unicode(details[USERNAME])
username = uuid4().get_hex()
uuid_length = 16
max_length = UserSocialAuth.username_max_length()
short_username = username[:max_length - uuid_length]
final_username = username[:max_length]
# Generate a unique username for current user using username
# as base but adding a unique hash at the end. Original
# username is cut to avoid any field max_length.
while user_exists(username=final_username):
username = short_username + uuid4().get_hex()[:uuid_length]
final_username = username[:max_length]
return {'username': final_username}
def create_user(backend, details, response, uid, username, user=None, *args,
"""Create user. Depends on get_username pipeline."""
if user:
return {'user': user}
if not username:
return None
# NOTE: not return None because Django raises exception of strip email
email = details.get('email') or ''
return {
'user': UserSocialAuth.create_user(username=username, email=email),
'is_new': True
def update_user_details(backend, details, response, user, is_new=False, *args,
"""Update user details using data from provider."""
changed = False # flag to track changes
for name, value in details.iteritems():
# do not update username, it was already generated
# do not update configured fields if user already existed
if name in (USERNAME, 'id', 'pk') or (not is_new and
name in setting('SOCIAL_AUTH_PROTECTED_USER_FIELDS', [])):
if value and value != getattr(user, name, None):
setattr(user, name, value)
changed = True
# Fire a pre-update signal sending current backend instance,
# user instance (created or retrieved from database), service
# response and processed details.
# Also fire socialauth_registered signal for newly registered
# users.
# Signal handlers must return True or False to signal instance
# changes. Send method returns a list of tuples with receiver
# and it's response.
signal_response = lambda (receiver, response): response
signal_kwargs = {'sender': backend.__class__, 'user': user,
'response': response, 'details': details}
changed |= any(filter(signal_response, pre_update.send(**signal_kwargs)))
# Fire socialauth_registered signal on new user registration
if is_new:
changed |= any(filter(signal_response,
if changed:
Jump to Line
Something went wrong with that request. Please try again.