def load_users(user_ids, allow_cache=True, **kwargs):
    allow_cache_arg = (allow_cache and '1' or '0')
    for fb_uid in user_ids:
        taskqueue.add(method='GET',
                      url='/tasks/load_users?' + urls.urlencode(
                          dict(user_id=fb_uid,
                               user_ids=fb_uid,
                               allow_cache=allow_cache_arg)),
                      queue_name='slow-queue',
                      **kwargs)
def load_sources(fb_source_ids, allow_cache=True, fb_uid='random', **kwargs):
    task_size = 10
    allow_cache_arg = (allow_cache and '1' or '0')
    for i in range(0, len(fb_source_ids), task_size):
        taskqueue.add(
            method='GET',
            url='/sources/scrape?' + urls.urlencode(
                dict(user_id=fb_uid,
                     source_ids=','.join(fb_source_ids[i:i + task_size]),
                     allow_cache=allow_cache_arg)),
            queue_name='slow-queue',
            **kwargs)
def load_events(fb_event_ids, allow_cache=True, fb_uid='701004', **kwargs):
    task_size = 10
    allow_cache_arg = (allow_cache and '1' or '0')
    for i in range(0, len(fb_event_ids), task_size):
        taskqueue.add(
            method='GET',
            url='/tasks/load_events?' + urls.urlencode(
                dict(user_id=fb_uid,
                     event_ids=','.join(fb_event_ids[i:i + task_size]),
                     allow_cache=allow_cache_arg)),
            queue_name='slow-queue',
            **kwargs)
def load_potential_events_for_users(fb_uids, allow_cache=True, **kwargs):
    #OPT: support more than one fbuser context per request in BaseTaskFacebookRequestHandler.initialize()
    task_size = 1
    allow_cache_arg = (allow_cache and '1' or '0')
    for i in range(0, len(fb_uids), task_size):
        taskqueue.add(method='GET',
                      url='/tasks/load_potential_events_for_user?' +
                      urls.urlencode(
                          dict(user_id=','.join(fb_uids[i:i + task_size]),
                               user_ids=','.join(fb_uids[i:i + task_size]),
                               allow_cache=allow_cache_arg)),
                      queue_name='slow-queue',
                      **kwargs)
def setup_reminders(fb_uid, fb_user_events):
    event_results_json = fb_user_events['events']['data']
    event_ids = [x['id'] for x in event_results_json]
    existing_events = [
        x.string_id()
        for x in eventdata.DBEvent.get_by_ids(event_ids, keys_only=True) if x
    ]
    logging.info("For user %s's %s events, %s are real dance events", fb_uid,
                 len(event_ids), len(existing_events))
    for event in event_results_json:
        if event['id'] not in existing_events:
            continue
        logging.info("%s is dance event, checking dates..", event['id'])
        start_time = parser.parse(event['start_time'])
        # Otherwise it's at a specific time (we need the time with the timezone info included)
        # Also try to get it ten minutes before the Facebook event comes in, so that we aren't seen as the "dupe".
        start_notify_window = start_time - datetime.timedelta(hours=1,
                                                              minutes=10)

        # I think 30 days is the limit for appengine tasks with ETA set, but it gets trickier with all the timezones.
        # And really, we run this code multiple times a day, so don't need to plan out more than a day or two.
        now = datetime.datetime.now(start_time.tzinfo)
        future_cutoff = now + datetime.timedelta(days=2)

        # Any time after start_notify_window, we could have sent a notification.
        # If we try to re-add the taskqueue after that timestamp has passed,
        # we may re-add a task that has already completed, and re-notify a user.
        # Double-check in our logs that this does not occur....(it shouldn't!)
        end_notify_window = start_notify_window

        # Ignore events that started in the past
        if end_notify_window < now:
            continue
        # And ignore events that are too far in the future to care about yet
        if start_notify_window > future_cutoff:
            continue
        logging.info("For event %s, sending notifications at %s", event['id'],
                     start_notify_window)
        try:
            taskqueue.add(
                method='GET',
                name='notify_user-%s-%s' % (fb_uid, event['id']),
                queue_name='mobile-notify-queue',
                eta=start_notify_window,
                url='/tasks/remind_user?' +
                urls.urlencode(dict(user_id=fb_uid, event_id=event['id'])),
            )
        except (taskqueue.TaskAlreadyExistsError,
                taskqueue.TombstonedTaskError) as e:
            logging.info("Error adding task: %s", e)
Exemplo n.º 6
0
def create_user_with_fbuser(fb_uid, fb_user, access_token, access_token_expires, location, ip, send_email=True, referer=None, client=None):
    user = users.User(id=fb_uid)
    user.ip = ip
    user.fb_access_token = access_token
    user.fb_access_token_expires = access_token_expires
    user.expired_oauth_token = False
    user.expired_oauth_token_reason = None
    user.location = location

    # grab the cookie to figure out who referred this user
    logging.info("Referer was: %s", referer)
    if referer:
        #STR_ID_MIGRATE
        user.inviting_fb_uid = long(referer)
    user.clients = [client]

    user.send_email = send_email
    user.distance = '50'
    user.distance_units = 'miles'
    user.min_attendees = 0

    user.creation_time = datetime.datetime.now()

    user.login_count = 1
    user.last_login_time = user.creation_time

    user.compute_derived_properties(fb_user)
    logging.info("Saving user with name %s", user.full_name)
    user.put()

    logging.info("Requesting background load of user's friends")
    # Must occur after User is put with fb_access_token
    taskqueue.add(method='GET', url='/tasks/track_newuser_friends?' + urls.urlencode({'user_id': fb_uid}), queue_name='slow-queue')
    # Now load their potential events, to make "add event page" faster (and let us process/scrape their events)
    backgrounder.load_potential_events_for_users([fb_uid])

    return user