0

I'm using python-social-auth to log users in to my site, which works fine but I want to use a custom user model that will not only save basic info about the user, but also gets their profile picture.

Here is my user model

def get_upload_file_name(instance, filename):
    return "%s_%s" % (str(time()).replace('.', '_'), filename)

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    name = models.CharField(max_length=250, null=True, blank=True)
    profile_image = models.ImageField(upload_to = get_upload_file_name, null=True, blank=True)

    def __str__(self):
    return u'%s profile' % self.user.username

This is the pipeline function

def user_details(strategy, details, response, user=None, *args, **kwargs):
if user:
    if kwargs['is_new']:
        attrs = {'user': user}
        if strategy.backend.name == 'facebook':
            fb = {
                    'name': response['first_name']
                }
            new_user = dict(attrs.items() + fb.items())
            UserProfile.objects.create(
                **new_user
            )

        elif strategy.backend.name == 'google-oauth2':
            new_user = dict(attrs.items())
            UserProfile.objects.create(
                **new_user
            )

        elif strategy.backend.name == 'twitter':
            new_user = dict(attrs.items())
            UserProfile.objects.create(
                **new_user
            )

And this is the other function that gets the user profile image

def save_profile_picture(strategy, user, response, details, is_new=False,
                         *args, **kwargs):

    if is_new and strategy.backend.name == 'facebook':
        url = 'http://graph.facebook.com/{0}/picture'.format(response['id'])

        try:
            response = request('GET', url, params={'type': 'large'})
            response.raise_for_status()
        except HTTPError:
            pass
        else:
            S_user = setattr(UserProfile, "profile_image", "{0}_social.jpg".format(user.username), ContentFile(response.content))
            S_user.save()

I'm only trying it on facebook first, but I can't seem to populate the name field in the database, and I also have to sign in twice before it gets saved to the default social-auth table. Both functions have been added to the settings.py file, I was also wondering if it matters where they go in the cue if it matters since they're at the bottom, the last part of the auth process?

user3545981
  • 23
  • 1
  • 4
  • I figured it out, since i was using python3 i should of used list() on my dict values like so: `attrs = dict(list(attrs.items()) + list(fb_data.items()))` – user3545981 May 26 '14 at 14:19
  • also instead of saving the image in the database it was best just to save the url, saving alot of space. – user3545981 May 26 '14 at 20:15

1 Answers1

0

I figured it out, since i was using python3 i should of used list() on my dict values like so: attrs = dict(list(attrs.items()) + list(fb_data.items()))

Also instead of saving the image in the database it was best just to save the url, saving alot of space

user3545981
  • 23
  • 1
  • 4