* `Facebook OAuth`_
* `Orkut OAuth`_
-- Basic user data population
+- Basic user data population and signaling, to allows custom fields values
+ from providers response
- Multiple social accounts association to single users
it might solve your case.
+-------
+Signals
+-------
+A pre_update signal is sent when user data is about to be updated with new
+values from auth service provider, this apply to new users and already
+existent ones. This is useful to update custom user fields or `User Profiles`_,
+for example, to store user gender, location, etc. Example::
+
+ from django.dispatch import receiver
+
+ from social_auth.signals import pre_save
+ from social_auth.backends import FacebookBackend
+
+ @receiver(pre_save, sender=FacebookBackend)
+ def facebook_extra_values(sender, user, response, details):
+ user.gender = response.get('gender')
+ return True
+
+
------
OpenId
------
from .models import UserSocialAuth
from .conf import OLD_AX_ATTRS, AX_SCHEMA_ATTRS
+from .signals import pre_update
# get User class, could not be auth.User
User = UserSocialAuth._meta.get_field('user').rel.to
user = self.create_user(details=details, *args, **kwargs)
else:
user = auth_user.user
- self.update_user_details(user, details)
+ self.update_user_details(user, response, details)
return user
def get_username(self, details):
password=UNUSABLE_PASSWORD)
# update details and associate account with social credentials
- self.update_user_details(user, details)
- self.associate_auth(user, response, details)
+ try:
+ self.update_user_details(user, response, details)
+ self.associate_auth(user, response, details)
+ except Exception, e:
+ print str(e)
return user
def associate_auth(self, user, response, details):
"""Return default blank user extra data"""
return ''
- def update_user_details(self, user, details):
+ def update_user_details(self, user, response, details):
"""Update user details with new (maybe) data"""
- fields = (name for name in ('first_name', 'last_name', 'email')
- if user._meta.get_field(name))
changed = False
-
- for name in fields:
- value = details.get(name)
+ for name, value in details.iteritems():
if value and value != getattr(user, name, value):
setattr(user, name, value)
changed = True
- if changed:
+ # Fire a pre-update signal sending current backend instance,
+ # user instance (created or retrieved from database), service
+ # response and processed details, signal handlers must return
+ # True or False to signal that something has changed
+ updated = filter(bool, pre_update.send(sender=self, user=user,
+ response=response,
+ details=details))
+ if changed or len(updated) > 0:
user.save()
def get_user_id(self, details, response):
def get_user_details(self, response):
"""Return user details from Facebook account"""
+ import pprint
+ pprint.pprint(response)
return {'email': response.get('email', ''),
'username': response['name'],
'fullname': response['name'],