Vitalii Mytenko
Vitalii Mytenko

Reputation: 772

How to populate DB from Facebook response using python-social-auth

I have Django with python-social-auth installed.

My custom user model:

class User(AbstractUser):
    """Custom User model."""

    username = None
    email = models.EmailField(blank=False, unique=True, verbose_name=_("Email"))
    facebook_link = models.URLField(blank=True, verbose_name=_("Facebook profile link"))
    contacts = models.CharField(blank=True, max_length=250, verbose_name=_("Contacts"))
    hometown = models.CharField(blank=True, max_length=250, verbose_name=_("Hometown"))
    start_coordinates = models.CharField(blank=True, max_length=100, verbose_name=_("Start coordinates"))
    avatar = ProcessedImageField(
        upload_to="avatar/",
        format="JPEG",
        options={"quality": 80},
        default="avatar/default_avatar.jpg",
        verbose_name=_("Image"),
    )


    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

def __str__(self):
    """Model representation."""
    return self.email

def get_absolute_url(self):
    """Get url to User's model instance."""
    return reverse_lazy("public-profile", kwargs={"user_id": self.pk})

def get_full_name(self):
    """Concatenate fist and last names."""
    full_name = " ".join([self.first_name, self.last_name])
    return full_name.strip()

get_full_name.short_description = _("Full name")

class Meta:
    verbose_name = _("User")
    verbose_name_plural = _("Users")

Managers.py

class UserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError(_("Email required"))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", True)
        if extra_fields.get("is_staff") is not True:
            raise ValueError(_("Superuser must have is_staff=True."))
        if extra_fields.get("is_superuser") is not True:
            raise ValueError(_("Superuser must have is_superuser=True."))
        return self.create_user(email, password, **extra_fields)

I do succesfull authentication with Facebook with this code:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.github.GithubOAuth2',
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.facebook.FacebookOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)

SOCIAL_AUTH_USER_MODEL = 'accounts.User'
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
SOCIAL_AUTH_LOGIN_REDIRECT_URL = 'home'
SOCIAL_AUTH_LOGIN_URL = 'login'

SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'user_link', 'user_hometown']
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id, name, email, picture.type(large), link, hometown'
}
SOCIAL_AUTH_FACEBOOK_EXTRA_DATA = [
    ('name', 'name'),
    ('email', 'email'),
    ('picture', 'avatar'),
    ('link', 'facebook_link'),
    ('hometown', 'hometown'),
]

As a result, I have a new user instance created in DB with the automatically populated fields: fist_name, last_name, email.

How do I can populate the rest of fields (facebook_link, hometown) with data from response?

Upvotes: 1

Views: 32

Answers (0)

Related Questions