Exemplo n.º 1
0
def connect_uids(*args, **kwargs):    
    """Connect foursquare userids to our user profiles"""
    api = FSQ(HEADERS)
    approve_pending_friends(api)
    resp = api.get_friends(_USER, _PASS)
    _log.debug("4sq friends resp:\n%s", resp)
    if 'friends' not in resp:
        return
    friends = resp['friends']    
    n = 0
    connected = 0
    uid = []
    email = []
    twitter = []
    fb = []
    uid_map = {}
    for f in friends:
        uidx = unicode(f['id'])
        uid.append(uidx)
        emx = f.get('email', None)
        fbx = f.get('facebook', None)
        twx = f.get('twitter', None)
        if emx:
            emx = unicode(emx.lower())
            email.append(emx)
            uid_map[u'email-%s' % emx] = uidx
        if fbx:             
            fbx = unicode(fbx)
            fb.append(fbx)
            uid_map[u'fb-%s' % fbx] = uidx
        if twx:
            twx = twx.lower()
            twitter.append(twx)        
            uid_map[u'tw-%s' % twx] = uidx
    uids_done = {}        
    q = UserProfile.objects.active().filter(fsq_userid=u'') # only include profiles not yet connected to 4sq
    
    for email_chunk in chunks(email, 50):
        if not email_chunk:
            break
        qx = q.filter(user__email__in=email_chunk)
        for up in qx:
            key = u'email-%s' % up.user.email
            uid = uid_map.get(key, None)
            if uid and not uid in uids_done:
                up.fsq_userid = uid
                up.save()
                uids_done[uid] = up
            
    for fb_chunk in chunks(fb, 50):
        if not fb_chunk:
            break
        qx = q.filter(fb_userid__in=fb_chunk)
        for up in qx:
            key = u'fb-%s' % up.fb_userid
            uid = uid_map.get(key, None)
            if uid and not uid in uids_done:
                up.fsq_userid = uid
                up.save()
                uids_done[uid] = up
            
    q = TwitterProfile.objects.active().filter(user_profile__fsq_userid=u'')
    for tw_chunk in chunks(twitter, 50):
        if not tw_chunk:
            break
        qx = q.filter(screen_name_lower__in=tw_chunk)
        for t in qx:
            up = t.user_profile
            key = u'tw-%s' % t.screen_name_lower
            uid = uid_map.get(key, None)
            if uid and not uid in uids_done:
                up.fsq_userid = uid
                up.save()
                uids_done[uid] = up
                
    checkin_uids = uids_done.keys()
    # connect user_profiles to past checkins
    EventCheckin.objects.connect_profiles_to_checkins(checkin_uids, uids_done)
    if uids_done:
        _log.warn("Foursquare IDs connected (%s):\n%s", len(uids_done), uids_done)