Example #1
0
    def authenticate(self, facebook_id=None, facebook_email=None):
        '''
        Authenticate the facebook user by id OR facebook_email
        We filter using an OR to allow existing members to connect with
        their facebook ID using email.
        '''
        from django_facebook.utils import get_profile_class
        if facebook_id or facebook_email:
            profile_class = get_profile_class()
            profile_query = profile_class.objects.all().order_by('user')
            profile_query = profile_query.select_related('user')
            profile = None

            #filter on email or facebook id, two queries for better
            #queryplan with large data sets
            if facebook_id:
                profiles = profile_query.filter(facebook_id=facebook_id)[:1]
                profile = profiles[0] if profiles else None
            if profile is None and facebook_email:
                try:
                    profiles = profile_query.filter(
                        user__email__iexact=facebook_email)[:1]
                    profile = profiles[0] if profiles else None
                except DatabaseError:
                    try:
                        user = models.User.objects.get(email=facebook_email)
                    except models.User.DoesNotExist:
                        user = None
                    profile = user.get_profile() if user else None

            if profile:
                # populate the profile cache while we're getting it anyway
                user = profile.user
                user._profile = profile
                return user
Example #2
0
    def random_facebook_friends(self, user, gender=None, limit=3):
        '''
        Returns a random sample of your FB friends

        Limit = Number of friends
        Gender = None, M or F
        '''
        assert gender in (
            None, 'M', 'F'), 'Gender %s wasnt recognized' % gender

        from django_facebook.utils import get_profile_class
        facebook_cache_key = 'facebook_users_%s' % user.id
        non_members = cache.get(facebook_cache_key)
        profile_class = get_profile_class()
        if not non_members:
            facebook_users = list(
                self.filter(user_id=user.id, gender=gender)[:50])
            facebook_ids = [u.facebook_id for u in facebook_users]
            members = list(profile_class.objects.filter(
                facebook_id__in=facebook_ids).select_related('user'))
            member_ids = [p.facebook_id for p in members]
            non_members = [
                u for u in facebook_users if u.facebook_id not in member_ids]

            cache.set(facebook_cache_key, non_members, 60 * 60)

        random_limit = min(len(non_members), 3)
        random_facebook_users = []
        if random_limit:
            random_facebook_users = random.sample(non_members, random_limit)

        return random_facebook_users
Example #3
0
    def _store_groups(self, user, groups):
        current_groups = inserted_groups = None

        if groups:
            from django_facebook.models import FacebookGroup
            base_queryset = FacebookGroup.objects.filter(user_id=user.id)
            global_defaults = dict(user_id=user.id)
            id_field = 'facebook_id'
            default_dict = {}
            for group in groups:
                name = group.get('name')
                bookmark_order = group.get('bookmark_order')
                description = group.get('description')
                default_dict[group['id']] = dict(bookmark_order=bookmark_order,
                                                 name=name)
            current_groups, inserted_groups = mass_get_or_create(
                FacebookGroup, base_queryset, id_field, default_dict,
                global_defaults)
            logger.debug('found %s groups and inserted %s new groups',
                         len(current_groups), len(inserted_groups))

        #fire an event, so u can do things like personalizing the users' account
        #based on the groups
        # NOT DONE YET
        signals.facebook_post_store_groups.send(
            sender=get_profile_class(),
            user=user,
            groups=groups,
            current_groups=current_groups,
            inserted_groups=inserted_groups,
        )

        return groups
Example #4
0
    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)
            global_defaults = dict(user_id=user.id)
            default_dict = {}
            for f in friends:
                name = f.get('name')
                default_dict[str(f['id'])] = dict(name=name)
            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_class(),
            user=user, friends=friends, current_friends=current_friends,
            inserted_friends=inserted_friends,
        )

        return friends
Example #5
0
    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 = datetime.datetime.strptime(like["created_time"], "%Y-%m-%dT%H:%M:%S+0000")
                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_class(),
            user=user,
            likes=likes,
            current_likes=current_likes,
            inserted_likes=inserted_likes,
        )

        return likes
Example #6
0
    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_class(),
                                               user=user, likes=likes, current_likes=current_likes,
                                               inserted_likes=inserted_likes,
                                               )

        return likes
Example #7
0
    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, profile, facebook_data, **kwargs):
            profile.pre_update_signal = True

        def post_update(sender, profile, facebook_data, **kwargs):
            profile.post_update_signal = True

        Profile = get_profile_class()
        signals.facebook_user_registered.connect(user_registered, sender=User)
        signals.facebook_pre_update.connect(pre_update, sender=Profile)
        signals.facebook_post_update.connect(post_update, sender=Profile)

        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.get_profile(),
                                 'pre_update_signal'), True)
        self.assertEqual(hasattr(user.get_profile(),
                                 'post_update_signal'), True)
    def random_facebook_friends(self, user, gender=None, limit=3):
        '''
        Returns a random sample of your FB friends

        Limit = Number of friends
        Gender = None, M or F
        '''
        assert gender in (
            None, 'M', 'F'), 'Gender %s wasnt recognized' % gender

        from django_facebook.utils import get_profile_class
        facebook_cache_key = 'facebook_users_%s' % user.id
        non_members = cache.get(facebook_cache_key)
        profile_class = get_profile_class()
        if not non_members:
            facebook_users = list(
                self.filter(user_id=user.id, gender=gender)[:50])
            facebook_ids = [u.facebook_id for u in facebook_users]
            members = list(profile_class.objects.filter(
                facebook_id__in=facebook_ids).select_related('user'))
            member_ids = [p.facebook_id for p in members]
            non_members = [
                u for u in facebook_users if u.facebook_id not in member_ids]

            cache.set(facebook_cache_key, non_members, 60 * 60)

        random_limit = min(len(non_members), 3)
        random_facebook_users = []
        if random_limit:
            random_facebook_users = random.sample(non_members, random_limit)

        return random_facebook_users
Example #9
0
    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, profile, facebook_data, **kwargs):
            profile.pre_update_signal = True

        def post_update(sender, profile, facebook_data, **kwargs):
            profile.post_update_signal = True

        Profile = get_profile_class()
        signals.facebook_user_registered.connect(user_registered, sender=User)
        signals.facebook_pre_update.connect(pre_update, sender=Profile)
        signals.facebook_post_update.connect(post_update, sender=Profile)

        graph = get_facebook_graph(access_token='short_username')
        klass = get_facebook_user_converter_class()
        facebook = klass(graph)
        user = _register_user(self.request, facebook)
        self.assertEqual(hasattr(user, 'registered_signal'), True)
        self.assertEqual(hasattr(user.get_profile(),
                                 'pre_update_signal'), True)
        self.assertEqual(hasattr(user.get_profile(),
                                 'post_update_signal'), True)
Example #10
0
    def authenticate(self, facebook_id=None, facebook_email=None):
        '''
        Authenticate the facebook user by id OR facebook_email
        
        We filter using an OR to allow existing members to connect with their facebook ID using email.
        
        '''
        if facebook_id or facebook_email:
            profile_class = get_profile_class()
            profile_query = profile_class.objects.all().order_by('user')
            profile_query = profile_query.select_related('user')
            profile = None

            #filter on email or facebook id, two queries for better
            #queryplan with large data sets
            if facebook_id:
                profiles = profile_query.filter(facebook_id=facebook_id)[:1]
                profile = profiles[0] if profiles else None
            if profile is None and facebook_email:
                try:
                    profiles = profile_query.filter(
                        user__email__iexact=facebook_email)[:1]
                    profile = profiles[0] if profiles else None
                except DatabaseError:
                    try:
                        user = models.User.objects.get(email=facebook_email)
                    except models.User.DoesNotExist:
                        user = None
                    profile = user.get_profile() if user else None

            if profile:
                # populate the profile cache while we're getting it anyway
                user = profile.user
                user._profile = profile
                return user
Example #11
0
    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_class(),
            user=user,
            likes=likes,
            current_likes=current_likes,
            inserted_likes=inserted_likes,
        )

        return likes
    def authenticate(self, facebook_id=None, facebook_email=None):
        '''
        Authenticate the facebook user by id OR facebook_email
        We filter using an OR to allow existing members to connect with
        their facebook ID using email.
        '''
        if facebook_id or facebook_email:
            profile_class = get_profile_class()
            profile_query = profile_class.objects.all().order_by('user')
            profile_query = profile_query.select_related('user')
            profile = None

            #filter on email or facebook id, two queries for better
            #queryplan with large data sets
            if facebook_id:
                profiles = profile_query.filter(facebook_id=facebook_id)[:1]
                profile = profiles[0] if profiles else None
            if profile is None and facebook_email:
                try:
                    user = models.User.objects.get(email=facebook_email)
                except models.User.DoesNotExist:
                    user = None
                profile = get_fb_profile(user) if user else None

            if profile:
                # populate the profile cache while we're getting it anyway
                user = profile.user
                user._profile = profile
                if facebook_settings.FACEBOOK_FORCE_PROFILE_UPDATE_ON_LOGIN:
                    user.fb_update_required = True
                return user
Example #13
0
    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)
            global_defaults = dict(user_id=user.id)
            default_dict = {}
            for f in friends:
                name = f.get('name')
                default_dict[str(f['id'])] = dict(name=name)
            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_class(),
            user=user,
            friends=friends,
            current_friends=current_friends,
            inserted_friends=inserted_friends,
        )

        return friends
    def authenticate(self, facebook_id=None, facebook_email=None):
        '''
        Authenticate the facebook user by id OR facebook_email
        
        We filter using an OR to allow existing members to connect with their facebook ID using email.
        
        '''
        if facebook_id or facebook_email:
            profile_class = get_profile_class()
            profile_query = profile_class.objects.all().order_by('user')
            profile_query = profile_query.select_related('user')
            profile = None
            
            #filter on email or facebook id, two queries for better
            #queryplan with large data sets
            if facebook_id:
                profiles = profile_query.filter(facebook_id=facebook_id)[:1]
                profile = profiles[0] if profiles else None
            if profile is None and facebook_email:
                profiles = profile_query.filter(user__email__iexact=facebook_email)[:1]
                profile = profiles[0] if profiles else None

            if profile:
                # populate the profile cache while we're getting it anyway
                user = profile.user
                user._profile = profile
                return user
Example #15
0
    def _store_friends(self, auth_user, friends):
        from django_facebook.models import FacebookUser
        from django_facebook.utils import get_profile_class
        profile_class = get_profile_class()
        current_friends = inserted_friends = None
        
        #store the users for later retrieval
        if friends:
            from django_facebook.models import FacebookProfileModel
            from django_facebook.models import FacebookUser
            base_object = profile_class.objects.get(user=auth_user.id)
            count = 0
            friends_list = list()
            gender_map = dict(female='F', male='M')
            if not len(base_object.friends):
                for f in friends:
                    count = count+1
                    friend = FacebookUser()
                    friend.facebook_id = f.get('id')
                    friend.name = f.get('name')
                    friend.gender = None
                    if f.get('sex'):
                        friend.gender = gender_map[f.get('sex')]
                    friend.timezone = f.get('timezone')
                    jsonDecoder = json.JSONDecoder()
                    if f.get('current_location'):
                        friend.current_location = f.get('current_location')
                    if f.get('hometown_location'):
                        friend.hometown_location = f.get('hometown_location')
                    friends_list.append(friend)

            base_object.friends = friends_list
            base_object.save()
            logger.debug('found %s friends and inserted',
                         count)
            
        #fire an event, so u can do things like personalizing suggested users
        #to follow
        signals.facebook_post_store_friends.send(sender=get_profile_class(),
            user=auth_user, friends=friends, current_friends=current_friends,
            inserted_friends=inserted_friends,
        )

        return friends
Example #16
0
def _get_old_connections(facebook_id, current_user_id=None):
    """
    Gets other accounts connected to this facebook id, which are not
    attached to the current user
    """
    profile_class = get_profile_class()
    other_facebook_accounts = profile_class.objects.filter(facebook_id=facebook_id)
    if current_user_id:
        other_facebook_accounts = other_facebook_accounts.exclude(user__id=current_user_id)
    return other_facebook_accounts
Example #17
0
def _remove_old_connections(facebook_id, current_user_id=None):
    """
    Removes the facebook id for profiles with the specified facebook id
    which arent the current user id
    """
    profile_class = get_profile_class()
    other_facebook_accounts = profile_class.objects.filter(facebook_id=facebook_id)
    if current_user_id:
        other_facebook_accounts = other_facebook_accounts.exclude(user__id=current_user_id)
    other_facebook_accounts.update(facebook_id=None)
Example #18
0
    def _store_likes(self, auth_user, likes):
        from django_facebook.utils import get_profile_class
        profile_class = get_profile_class()
        current_likes = inserted_likes = None
        
        if likes:
            from django_facebook.models import FacebookProfileModel
            from django_facebook.models import FacebookLike
            base_object = profile_class.objects.get(user=auth_user.id)
            count = 0
            likes_list = list()
            if not len(base_object.likes):
                for like in likes:
                    count = count+1
                    name = like.get('name')
                    created_time_string = like.get('created_time')
                    created_time = None
                    if created_time_string:
                        created_time = datetime.datetime.strptime(
                            like['created_time'], "%Y-%m-%dT%H:%M:%S+0000")
                
                    fbLike = FacebookLike()
                    fbLike.facebook_id = like.get('id')
                    fbLike.name = name
                    fbLike.category = like.get('category')
                    fbLike.created_time = created_time
                    likes_list.append(fbLike)
            
            base_object.likes = likes_list
            base_object.save()
            logger.debug('found %s likes and inserted',
                         count)

        #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_class(),
            user=auth_user, likes=likes, current_likes=current_likes,
            inserted_likes=inserted_likes,
        )
        
        return likes
Example #19
0
def _remove_old_connections(facebook_id, current_user_id=None):
    '''
    Removes the facebook id for profiles with the specified facebook id
    which arent the current user id
    '''
    profile_class = get_profile_class()
    other_facebook_accounts = profile_class.objects.filter(
        facebook_id=facebook_id)
    if current_user_id:
        other_facebook_accounts = other_facebook_accounts.exclude(
            user__id=current_user_id)
    other_facebook_accounts.update(facebook_id=None)
Example #20
0
def _get_old_connections(facebook_id, current_user_id=None):
    '''
    Gets other accounts connected to this facebook id, which are not
    attached to the current user
    '''
    profile_class = get_profile_class()
    other_facebook_accounts = profile_class.objects.filter(
        facebook_id=facebook_id)
    if current_user_id:
        other_facebook_accounts = other_facebook_accounts.exclude(
            user__id=current_user_id)
    return other_facebook_accounts
Example #21
0
    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
                birthday_date = None

                if f.get('sex'):
                    gender = gender_map[f.get('sex')]

                if f.get('birthday_date'):
                    birthday_date = f.get('birthday_date')

                default_dict[str(f['id'])] = dict(name=name,
                                                  gender=gender,
                                                  birthday=birthday_date)
            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_class(),
            user=user,
            friends=friends,
            current_friends=current_friends,
            inserted_friends=inserted_friends,
        )

        return friends
Example #22
0
 def get_and_store_friends(self, auth_user):
     '''
     Gets and stores your facebook friends to DB
     Both the get and the store run in a async task when
     FACEBOOK_CELERY_STORE = True
     '''
     from django_facebook.utils import get_profile_class
     profile_class = get_profile_class()
     base_object = profile_class.objects.get(user=auth_user.id)
     if not len(base_object.friends):
         if facebook_settings.FACEBOOK_CELERY_STORE:
             from django_facebook.tasks import get_and_store_friends
             get_and_store_friends.delay(auth_user, self)
         else:
             self._get_and_store_friends(auth_user)
Example #23
0
    def test_fb_update_required(self):
        def pre_update(sender, profile, facebook_data, **kwargs):
            profile.pre_update_signal = True

        Profile = get_profile_class()
        signals.facebook_pre_update.connect(pre_update, sender=Profile)
        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.get_profile(), '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.get_profile(), 'pre_update_signal'))
Example #24
0
    def test_fb_update_required(self):
        def pre_update(sender, profile, facebook_data, **kwargs):
            profile.pre_update_signal = True

        Profile = get_profile_class()
        signals.facebook_pre_update.connect(pre_update, sender=Profile)
        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.get_profile(), '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.get_profile(), 'pre_update_signal'))
Example #25
0
    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
                birthday_date = None

                if f.get('sex'):
                    gender = gender_map[f.get('sex')]

                if f.get('birthday_date'):
                    birthday_date = f.get('birthday_date')

                default_dict[str(f['id'])] = dict(name=name, gender=gender, birthday=birthday_date)
            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_class(),
                                                 user=user, friends=friends, current_friends=current_friends,
                                                 inserted_friends=inserted_friends,
                                                 )

        return friends
Example #26
0
 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
     '''
     from django_facebook.utils import get_profile_class
     profile_class = get_profile_class()
     friends = self.store_friends(user, 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
Example #27
0
    def _store_free_for_sale(self, user, items):
        current_items = inserted_items = None

        if items:
            from django_facebook.models import FreeForSaleItem
            base_queryset = FreeForSaleItem.objects.all()
            global_defaults = dict(user_id=user.id)
            id_field = 'facebook_id'
            default_dict = {}
            for item in items:
                seller_name = item.get('from').get('name')
                post_url = item.get('actions').get('link')
                try:
                    message = item.get('message')
                except:
                    continue

                created_time_string = item.get('created_time')
                created_time = None
                if created_time_string:
                    created_time = datetime.datetime.strptime(
                        item['created_time'], "%Y-%m-%dT%H:%M:%S+0000")

                default_dict[item['id']] = dict(created_time=created_time,
                                                seller_name=seller_name,
                                                post_url=post_url,
                                                message=message)
            current_items, inserted_items = mass_get_or_create(
                FreeForSaleItem, base_queryset, id_field, default_dict,
                global_defaults)
            logger.debug('found %s items and inserted %s new items',
                         len(current_items), len(inserted_items))

        #fire an event, so u can do things like personalizing the users' account
        #based on the likes
        signals.facebook_post_store_items.send(
            sender=get_profile_class(),
            user=user,
            items=items,
            current_items=current_items,
            inserted_items=inserted_items,
        )
        return items
Example #28
0
    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
        '''
        from django_facebook.utils import get_profile_class
        profile_class = get_profile_class()
        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 authenticate(self, facebook_id=None, facebook_email=None):
        """Authenticate the Facebook user by ``facebook_id`` or ``facebook_email``.
        
        We filter using an OR to allow existing members to connect with
        their Facebook ID using email.
        
        :param facebook_id: ID of the Facebook user.
        :param facebook_email: EMail the user is authenticated on Facebook
            with. We need to make sure the email was verified on Facebook,
            before trusting this!
        :returns: a ``django.contrib.auth.models.User`` or ``None``
        """
        if facebook_id or facebook_email:
            profile_class = get_profile_class()
            profile_query = profile_class.objects.all().order_by('user').select_related('user')
            profile = None

            ## Filter on email or ``facebook_id``, two queries for better
            ## queryplan with large data sets
            
            if facebook_id:
                profiles = profile_query.filter(facebook_id=facebook_id)[:1]
                profile = profiles[0] if profiles else None
            
            if profile is None and facebook_email:
                try:
                    ## WARNING! We assume that all the user emails are verified
                    profiles = profile_query.filter(user__email__iexact=facebook_email)[:1]
                    profile = profiles[0] if profiles else None
                except DatabaseError:
                    try:
                        user = models.User.objects.get(email=facebook_email)
                    except models.User.DoesNotExist:
                        user = None
                    profile = user.get_profile() if user else None

            if profile:
                ## Populate the profile cache while we're getting it anyway
                user = profile.user
                user._profile = profile
                return user
Example #30
0
    def _store_friends(self, user, friends):
        from django_facebook.models import FacebookUser
        current_friends = inserted_friends = None

        #store the users for later retrieval
        allppl = [x.facebook_id for x in FacebookProfile.objects.all()]

        friends_on_this_site = []

        for friend in friends:
            if friend['id'] in allppl:
                friends_on_this_site.append(friend)
                userid = FacebookProfile.objects.filter(
                    facebook_id=friend['id'])[0].user_id
                up = user.get_profile()
                FacebookUser(
                    user_id=userid,
                    facebook_id=up.facebook_id,
                    name=up.facebook_name).save(
                    )  #no gender for now, don't think we need that -rory

        friends = friends_on_this_site

        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_class(),
            user=user,
            friends=friends,
            current_friends=current_friends,
            inserted_friends=inserted_friends,
        )

        return friends
Example #31
0
def _update_user(user, facebook, overwrite=True):
    '''
    Updates the user and his/her profile with the data from facebook
    '''
    # 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_data = facebook.facebook_registration_data(username=False)
    facebook_fields = ['facebook_name', 'facebook_profile_url', 'gender',
        'date_of_birth', 'about_me', 'website_url', 'first_name', 'last_name']
    user_dirty = profile_dirty = False
    profile = user.get_profile()

    signals.facebook_pre_update.send(sender=get_profile_class(),
        profile=profile, facebook_data=facebook_data)

    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
    facebook_id_changed = facebook_data['facebook_id'] != profile.facebook_id
    overwrite_allowed = overwrite or not profile.facebook_id

    #update the facebook id and access token
    if facebook_id_changed and overwrite_allowed:
        #when not overwriting we only update if there is no profile.facebook_id
        logger.info('profile facebook id changed from %s to %s',
                    repr(facebook_data['facebook_id']),
                    repr(profile.facebook_id))
        profile.facebook_id = facebook_data['facebook_id']
        profile_dirty = True
        _remove_old_connections(profile.facebook_id, user.id)

    #update all fields on both user and profile
    for f in facebook_fields:
        facebook_value = facebook_data.get(f, False)
        if facebook_value:
            if (f in profile_field_names and hasattr(profile, f) and
                not getattr(profile, f, False)):
                logger.debug('profile field %s changed from %s to %s', f,
                             getattr(profile, f), facebook_value)
                setattr(profile, f, facebook_value)
                profile_dirty = True
            elif (f in user_field_names and hasattr(user, f) and
                  not getattr(user, f, False)):
                logger.debug('user field %s changed from %s to %s', f,
                             getattr(user, f), facebook_value)
                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.facebook_profile_data())
        if profile.raw_data != serialized_fb_data:
            logger.debug('profile raw data changed from %s to %s',
                         profile.raw_data, serialized_fb_data)
            profile.raw_data = serialized_fb_data
            profile_dirty = True

    image_url = facebook_data['image']
    #update the image if we are allowed and have to
    if facebook_settings.FACEBOOK_STORE_LOCAL_IMAGE:
        if hasattr(profile, 'image') and not profile.image:
            profile_dirty = _update_image(profile, image_url)

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

    signals.facebook_post_update.send(sender=get_profile_class(),
        profile=profile, facebook_data=facebook_data)

    return user