def _store_likes(self, user, likes): current_likes = inserted_likes = None if likes: from django_facebook.models import FacebookLike base_queryset = FacebookLike.objects.filter(user_id=user.id) global_defaults = dict(user_id=user.id) id_field = 'facebook_id' default_dict = {} for like in likes: name = like.get('name') created_time_string = like.get('created_time') created_time = None if created_time_string: created_time = parse_date(like['created_time']) default_dict[like['id']] = dict( created_time=created_time, category=like.get('category'), name=name ) current_likes, inserted_likes = mass_get_or_create( FacebookLike, base_queryset, id_field, default_dict, global_defaults) logger.debug('found %s likes and inserted %s new likes', len(current_likes), len(inserted_likes)) # fire an event, so u can do things like personalizing the users' account # based on the likes signals.facebook_post_store_likes.send(sender=get_profile_model(), user=user, likes=likes, current_likes=current_likes, inserted_likes=inserted_likes, ) return likes
def test_user_registered_signal(self): # Ensure user registered, pre update and post update signals fire def user_registered(sender, user, facebook_data, **kwargs): user.registered_signal = True def pre_update(sender, user, profile, facebook_data, **kwargs): user.pre_update_signal = True def post_update(sender, user, profile, facebook_data, **kwargs): user.post_update_signal = True Profile = get_profile_model() user_model = get_user_model() signals.facebook_user_registered.connect(user_registered, sender=user_model) signals.facebook_pre_update.connect(pre_update, sender=user_model) signals.facebook_post_update.connect(post_update, sender=user_model) graph = get_facebook_graph(access_token='short_username') facebook = FacebookUserConverter(graph) user = _register_user(self.request, facebook) self.assertEqual(hasattr(user, 'registered_signal'), True) self.assertEqual(hasattr(user, 'pre_update_signal'), True) self.assertEqual(hasattr(user, 'post_update_signal'), True)
def test_update_access_token(self): request = RequestMock().get('/') request.session = {} request.user = AnonymousUser() graph = get_persistent_graph(request, access_token='paul') action, user = connect_user(self.request, facebook_graph=graph) first_user_id = user.id # new token required should start out as False profile = try_get_profile(user) new_token_required = get_user_attribute(user, profile, 'new_token_required') self.assertEqual(new_token_required, False) # we manually set it to true update_user_attributes(user, profile, dict(new_token_required=True), save=True) if profile: profile = get_profile_model().objects.get(id=profile.id) user = get_user_model().objects.get(id=user.id) new_token_required = get_user_attribute(user, profile, 'new_token_required') self.assertEqual(new_token_required, True) # another update should however set it back to False request.facebook = None graph = get_facebook_graph(request, access_token='paul2') logger.info('and the token is %s', graph.access_token) action, user = connect_user(self.request, facebook_graph=graph) user = get_user_model().objects.get(id=user.id) self.assertEqual(user.id, first_user_id) if profile: profile = get_profile_model().objects.get(id=profile.id) user = get_user_model().objects.get(id=user.id) new_token_required = get_user_attribute(user, profile, 'new_token_required') self.assertEqual(new_token_required, False)
def test_fb_update_required(self): def pre_update(sender, user, profile, facebook_data, **kwargs): user.pre_update_signal = True Profile = get_profile_model() user_model = get_user_model() signals.facebook_pre_update.connect(pre_update, sender=user_model) facebook = get_facebook_graph(access_token='tschellenbach') facebook_settings.FACEBOOK_FORCE_PROFILE_UPDATE_ON_LOGIN = True action, user = connect_user(self.request, facebook_graph=facebook) self.assertEqual(action, CONNECT_ACTIONS.LOGIN) self.assertTrue(hasattr(user, 'pre_update_signal')) facebook_settings.FACEBOOK_FORCE_PROFILE_UPDATE_ON_LOGIN = False action, user = connect_user(self.request, facebook_graph=facebook) self.assertEqual(action, CONNECT_ACTIONS.LOGIN) self.assertFalse(hasattr(user, 'pre_update_signal'))
def registered_friends(self, user): ''' Returns all profile models which are already registered on your site and a list of friends which are not on your site ''' profile_class = get_profile_model() friends = self.get_friends(limit=1000) if friends: friend_ids = [f['id'] for f in friends] friend_objects = profile_class.objects.filter( facebook_id__in=friend_ids).select_related('user') registered_ids = [f.facebook_id for f in friend_objects] new_friends = [f for f in friends if f['id'] not in registered_ids] else: new_friends = [] friend_objects = profile_class.objects.none() return friend_objects, new_friends
def _store_friends(self, user, friends): from django_facebook.models import FacebookUser current_friends = inserted_friends = None # store the users for later retrieval if friends: # see which ids this user already stored base_queryset = FacebookUser.objects.filter(user_id=user.id) # if none if your friend have a gender clean the old data genders = FacebookUser.objects.filter( user_id=user.id, gender__in=('M', 'F')).count() if not genders: FacebookUser.objects.filter(user_id=user.id).delete() global_defaults = dict(user_id=user.id) default_dict = {} gender_map = dict(female='F', male='M') for f in friends: name = f.get('name') gender = None if f.get('sex'): gender = gender_map[f.get('sex')] default_dict[str(f['id'])] = dict(name=name, gender=gender) id_field = 'facebook_id' current_friends, inserted_friends = mass_get_or_create( FacebookUser, base_queryset, id_field, default_dict, global_defaults) logger.debug('found %s friends and inserted %s new ones', len(current_friends), len(inserted_friends)) # fire an event, so u can do things like personalizing suggested users # to follow signals.facebook_post_store_friends.send(sender=get_profile_model(), user=user, friends=friends, current_friends=current_friends, inserted_friends=inserted_friends, ) return friends
def test_send(error, expected_error_message, expected_new_token, has_permissions=False): user, profile, share = self.share_details update_user_attributes(user, profile, dict(new_token_required=False), save=True) with mock.patch('open_facebook.api.OpenFacebook') as mocked: instance = mocked.return_value instance.set = Mock(side_effect=error) instance.has_permissions = Mock(return_value=has_permissions) instance.access_token = get_user_attribute( user, profile, 'access_token') share.send(graph=instance) self.assertEqual(share.error_message, expected_error_message) self.assertFalse(share.completed_at) user = get_user_model().objects.get(id=user.id) if profile: profile = get_profile_model().objects.get(id=profile.id) new_token_required = get_user_attribute( user, profile, 'new_token_required') self.assertEqual(new_token_required, expected_new_token)