Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django. Python social auth. create profiles at the end of pipeline

I want to add a function at the end of the auth pipeline, the function is meant to check if there is a "Profiles" table for that user, if there isn't it will create a table. The Profiles model is a table where I store some extra information about the user:

class Profiles(models.Model):
    user = models.OneToOneField(User, unique=True, null=True)
    description = models.CharField(max_length=250, blank=True, null=True)
    points = models.SmallIntegerField(default=0)
    posts_number = models.SmallIntegerField(default=0)

Each user must have a Profiles table. So, I added a function at the end of the pipeline:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    'app.utils.create_profile'  #Custom pipeline
)

#utils.py 
def create_profile(strategy, details, response, user, *args, **kwargs):
    username = kwargs['details']['username']
    user_object = User.objects.get(username=username)
    if Profiles.ojects.filter(user=user_object).exists():
        pass
    else:
        new_profile = Profiles(user=user_object)
        new_profile.save()
    return kwargs

I get the error:

 KeyError at /complete/facebook/
 'details'
 ...
 utils.py in create_profile
 username = kwargs['details']['username']

I'm new to python social auth, and it looks that I'm missing something obvious. Any help will be appreciated.

like image 297
Alejandro Veintimilla Avatar asked Jul 28 '14 16:07

Alejandro Veintimilla


1 Answers

Ok so I'll answer my own question just in case it is useful for someone in the future. I'm no expert but here it is:

I was following this tutorial, and becouse he does

 email = kwargs['details']['email']

I thought I could do

username = kwargs['details']['username']

But it didn't work, it gave my a KeyError.

Then I tried:

username = details['username']

And it worked. But I had a new problem, the username from the details dict was something like u'Firstname Lastname' and when I tried to get the User object

user_object = User.objects.get(username=username)

It was not found, becouse the username in the User model was u'FirstnameLastname' (without the space).

Finally I read the docs again and I found out that I could simply use the user object directly, it gets passed to the function as "user":

def create_profile(strategy, details, response, user, *args, **kwargs):

    if Profiles.objects.filter(usuario=user).exists():
        pass
    else:
        new_profile = Profiles(user=user)
        new_profile.save()

    return kwargs
like image 135
Alejandro Veintimilla Avatar answered Oct 30 '22 19:10

Alejandro Veintimilla