def test_check_connect_facebook(self):
        graph = get_facebook_graph(access_token='new_user')
        facebook = FacebookUserConverter(graph)
        data = facebook.facebook_registration_data()
        self.assertEqual(data['gender'], 'm')

        response = self.client.get(reverse('login:index'))
    def test_check_connect_facebook(self):
        graph = get_facebook_graph(access_token='new_user')
        facebook = FacebookUserConverter(graph)
        data = facebook.facebook_registration_data()
        self.assertEqual(data['gender'], 'm')

        response = self.client.get(reverse('login:index'))
Example #3
0
    def _register_user(self, facebook, profile_callback=None):
        '''
        Creates a new user and authenticates
        The registration form handles the registration and validation
        Other data on the user profile is updates afterwards
        '''
        if not facebook.is_authenticated():
            raise ValueError, 'Facebook needs to be authenticated for connect flows'

        facebook_user_converter = FacebookUserConverter(facebook)

        from registration.forms import RegistrationFormUniqueEmail
        #get the backend on new registration systems, or none if we are on an older version
        backend = get_registration_backend()

        #get the form used for registration and fall back to uniqueemail version
        form_class = RegistrationFormUniqueEmail
        if backend:
            form_class = backend.get_form_class(request)

        facebook_data = facebook_user_converter.facebook_registration_data()

        data = self.request.POST.copy()
        for k, v in facebook_data.items():
            if not data.get(k):
                data[k] = v

        if self.request.REQUEST.get('force_registration_hard'):
            data['email'] = data['email'].replace('@',
                                                  '+%s@' % randint(0, 100000))

        form = form_class(data=data,
                          files=self.request.FILES,
                          initial={'ip': self.request.META['REMOTE_ADDR']})

        if not form.is_valid():
            error = facebook_exceptions.IncompleteProfileError(
                'Facebook data %s gave error %s' %
                (facebook_data, form.errors))
            error.form = form
            raise error

        #for new registration systems use the backends methods of saving
        if backend:
            new_user = backend.register(request, **form.cleaned_data)
        else:
            new_user = form.save(profile_callback=profile_callback)

        #update some extra data not yet done by the form
        new_user = self._update_user(new_user, facebook)

        #IS this the correct way for django 1.3? seems to require the backend attribute for some reason
        new_user.backend = 'django_facebook.auth_backends.FacebookBackend'
        auth.login(self.request, new_user)

        return new_user
Example #4
0
 def test_long_username(self):
     request = RequestMock().get('/')
     request.session = {}
     request.user = AnonymousUser()
     graph = get_persistent_graph(request, access_token='long_username')
     converter = FacebookUserConverter(graph)
     base_data = converter.facebook_registration_data()
     action, user = connect_user(self.request, facebook_graph=graph)
     self.assertEqual(len(base_data['username']), 30)
     self.assertEqual(len(user.username), 30)
     self.assertEqual(len(user.first_name), 30)
     self.assertEqual(len(user.last_name), 30)
Example #5
0
 def test_long_username(self):
     request = RequestMock().get('/')
     request.session = {}
     request.user = AnonymousUser()
     graph = get_persistent_graph(request, access_token='long_username')
     converter = FacebookUserConverter(graph)
     base_data = converter.facebook_registration_data()
     action, user = connect_user(self.request, facebook_graph=graph)
     self.assertEqual(len(base_data['username']), 30)
     self.assertEqual(len(user.username), 30)
     self.assertEqual(len(user.first_name), 30)
     self.assertEqual(len(user.last_name), 30)
Example #6
0
 def test_gender_matching(self):
     request = RequestMock().get('/')
     request.session = {}
     request.user = AnonymousUser()
     graph = get_persistent_graph(request, access_token='paul')
     converter = FacebookUserConverter(graph)
     base_data = converter.facebook_profile_data()
     self.assertEqual(base_data['gender'], 'male')
     data = converter.facebook_registration_data()
     self.assertEqual(data['gender'], 'm')
     action, user = connect_user(self.request, facebook_graph=graph)
     self.assertEqual(user.get_profile().gender, 'm')
Example #7
0
 def test_gender_matching(self):
     request = RequestMock().get('/')
     request.session = {}
     request.user = AnonymousUser()
     graph = get_persistent_graph(request, access_token='paul')
     converter = FacebookUserConverter(graph)
     base_data = converter.facebook_profile_data()
     self.assertEqual(base_data['gender'], 'male')
     data = converter.facebook_registration_data()
     self.assertEqual(data['gender'], 'm')
     action, user = connect_user(self.request, facebook_graph=graph)
     self.assertEqual(user.get_profile().gender, 'm')
Example #8
0
    def _register_user(self, facebook, profile_callback=None):
        '''
        Creates a new user and authenticates
        The registration form handles the registration and validation
        Other data on the user profile is updates afterwards
        '''
        if not facebook.is_authenticated():
            raise ValueError, 'Facebook needs to be authenticated for connect flows'

        facebook_user_converter = FacebookUserConverter(facebook)

        from registration.forms import RegistrationFormUniqueEmail
        #get the backend on new registration systems, or none if we are on an older version
        backend = get_registration_backend()

        #get the form used for registration and fall back to uniqueemail version
        form_class = RegistrationFormUniqueEmail
        if backend:
            form_class = backend.get_form_class(request)
            
        facebook_data = facebook_user_converter.facebook_registration_data()

        data = self.request.POST.copy()
        for k, v in facebook_data.items():
            if not data.get(k):
                data[k] = v

        if self.request.REQUEST.get('force_registration_hard'):
            data['email'] = data['email'].replace('@', '+%s@' % randint(0, 100000))

        form = form_class(data=data, files=self.request.FILES,
            initial={'ip': self.request.META['REMOTE_ADDR']})

        if not form.is_valid():
            error = facebook_exceptions.IncompleteProfileError('Facebook data %s gave error %s' % (facebook_data, form.errors))
            error.form = form
            raise error

        #for new registration systems use the backends methods of saving
        if backend:
            new_user = backend.register(request, **form.cleaned_data)
        else:
            new_user = form.save(profile_callback=profile_callback)

        #update some extra data not yet done by the form
        new_user = self._update_user(new_user, facebook)

        #IS this the correct way for django 1.3? seems to require the backend attribute for some reason
        new_user.backend = 'django_facebook.auth_backends.FacebookBackend'
        auth.login(self.request, new_user)

        return new_user
Example #9
0
    def _update_user(self, facebook):
        '''
        Updates the user and his/her profile with the data from facebook
        '''
        user = self.request.user
        #if you want to add fields to ur user model instead of the profile thats fine
        #partial support (everything except raw_data and facebook_id is included)

        facebook_user_converter = FacebookUserConverter(facebook)
        facebook_data = facebook_user_converter.facebook_registration_data()

        user_dirty = profile_dirty = False
        profile = user.get_profile()
        profile_field_names = [f.name for f in profile._meta.fields]
        user_field_names = [f.name for f in user._meta.fields]

        #set the facebook id and make sure we are the only user with this id
        if facebook_data['facebook_id'] != profile.facebook_id:
            profile.facebook_id = facebook_data['facebook_id']
            profile_dirty = True
            #like i said, me and only me
            profile_class = get_profile_class()
            profile_class.objects.filter(
                facebook_id=profile.facebook_id).exclude(
                    user__id=user.id).update(facebook_id=None)

        #update all fields on both user and profile
        for f in self.facebook_fields:
            facebook_value = facebook_data.get(f, False)
            if facebook_value:
                if f in profile_field_names and not getattr(profile, f, False):
                    setattr(profile, f, facebook_value)
                    profile_dirty = True
                elif f in user_field_names and not getattr(user, f, False):
                    setattr(user, f, facebook_value)
                    user_dirty = True

        #write the raw data in case we missed something
        if hasattr(profile, 'raw_data'):
            serialized_fb_data = json.dumps(
                facebook_user_converter.facebook_profile_data())
            profile.raw_data = serialized_fb_data
            profile_dirty = True

        #save both models if they changed
        if user_dirty:
            user.save()
        if profile_dirty:
            profile.save()

        return user
Example #10
0
    def _update_user(self, facebook):
        '''
        Updates the user and his/her profile with the data from facebook
        '''
        user = self.request.user
        #if you want to add fields to ur user model instead of the profile thats fine
        #partial support (everything except raw_data and facebook_id is included)

        facebook_user_converter = FacebookUserConverter(facebook)
        facebook_data = facebook_user_converter.facebook_registration_data()

        user_dirty = profile_dirty = False
        profile = user.get_profile()
        profile_field_names = [f.name for f in profile._meta.fields]
        user_field_names = [f.name for f in user._meta.fields]

        #set the facebook id and make sure we are the only user with this id
        if facebook_data['facebook_id'] != profile.facebook_id:
            profile.facebook_id = facebook_data['facebook_id']
            profile_dirty = True
            #like i said, me and only me
            profile_class = get_profile_class()
            profile_class.objects.filter(facebook_id=profile.facebook_id).exclude(user__id=user.id).update(facebook_id=None)

        #update all fields on both user and profile
        for f in self.facebook_fields:
            facebook_value = facebook_data.get(f, False)
            if facebook_value:
                if f in profile_field_names and not getattr(profile, f, False):
                    setattr(profile, f, facebook_value)
                    profile_dirty = True
                elif f in user_field_names and not getattr(user, f, False):
                    setattr(user, f, facebook_value)
                    user_dirty = True

        #write the raw data in case we missed something
        if hasattr(profile, 'raw_data'):
            serialized_fb_data = json.dumps(facebook_user_converter.facebook_profile_data())
            profile.raw_data = serialized_fb_data
            profile_dirty = True

        #save both models if they changed
        if user_dirty:
            user.save()
        if profile_dirty:
            profile.save()

        return user
Example #11
0
 def test_gender(self):
     graph = get_facebook_graph(access_token='new_user')
     facebook = FacebookUserConverter(graph)
     data = facebook.facebook_registration_data()
     self.assertEqual(data['gender'], 'm')
Example #12
0
 def test_gender(self):
     graph = get_facebook_graph(access_token='new_user')
     facebook = FacebookUserConverter(graph)
     data = facebook.facebook_registration_data()
     self.assertEqual(data['gender'], 'm')