logging.info("No data fetched for event id %s: %s", db_event.fb_event_id, e) # Now trigger off a background reloading of empty fb_events if empty_fb_event_ids: deferred.defer(load_fb_events_using_backup_tokens, empty_fb_event_ids, allow_cache=fbl.allow_cache, only_if_updated=only_if_updated, update_geodata=update_geodata) # And then re-save all the events in here event_updates.update_and_save_fb_events(events_to_update, update_geodata=update_geodata) map_load_fb_event = fb_mapreduce.mr_wrap(yield_load_fb_event) load_fb_event = fb_mapreduce.nomr_wrap(yield_load_fb_event) def yield_load_fb_event_attending(fbl, all_events): db_events = [x for x in all_events if x.is_fb_event] fbl.get_multi(fb_api.LookupEventAttending, [x.fb_event_id for x in db_events]) map_load_fb_event_attending = fb_mapreduce.mr_wrap( yield_load_fb_event_attending) load_fb_event_attending = fb_mapreduce.nomr_wrap(yield_load_fb_event_attending) def mr_load_fb_events(fbl, load_attending=False,
if real_fb_event['empty'] == fb_api.EMPTY_CAUSE_INSUFFICIENT_PERMISSIONS and db_event.visible_to_fb_uids: empty_fb_event_ids.append(db_event.fb_event_id) else: # Otherwise if it's visible to our main token, or there are no other tokens to try, deal with it here. add_event_tuple_if_updating(events_to_update, fbl, db_event, only_if_updated) except fb_api.NoFetchedDataException as e: logging.info("No data fetched for event id %s: %s", db_event.fb_event_id, e) # Now trigger off a background reloading of empty fb_events if empty_fb_event_ids: logging.info("Couldn't fetch, using backup tokens for events: %s", empty_fb_event_ids) deferred.defer(load_fb_events_using_backup_tokens, empty_fb_event_ids, allow_cache=fbl.allow_cache, only_if_updated=only_if_updated, update_geodata=update_geodata) logging.info("Updating events: %s", [x[0].id for x in events_to_update]) # And then re-save all the events in here event_updates.update_and_save_fb_events(events_to_update, update_geodata=update_geodata) map_load_fb_event = fb_mapreduce.mr_wrap(yield_load_fb_event) load_fb_event = fb_mapreduce.nomr_wrap(yield_load_fb_event) def yield_load_fb_event_attending(fbl, all_events): db_events = [x for x in all_events if x.is_fb_event] fbl.get_multi(fb_api.LookupEventAttending, [x.fb_event_id for x in db_events], allow_fail=True) map_load_fb_event_attending = fb_mapreduce.mr_wrap(yield_load_fb_event_attending) load_fb_event_attending = fb_mapreduce.nomr_wrap(yield_load_fb_event_attending) def mr_load_fb_events(fbl, load_attending=False, time_period=None, update_geodata=True, only_if_updated=True, queue='slow-queue'): if load_attending: event_or_attending = 'Event Attendings' mr_func = 'map_load_fb_event_attending' else: event_or_attending = 'Events'
def get(self): # this calls a map function wrapped by mr_user_wrap, so it works correctly on a per-user basis fb_mapreduce.start_map( fbl=self.fbl, name='Load Users', handler_spec='users.user_tasks.map_load_fb_user', entity_kind='users.users.User', ) post = get def yield_load_fb_user(fbl, user): if user.expired_oauth_token: logging.info("Skipping user %s (%s) due to expired access_token", user.fb_uid, user.full_name) return if not fbl.access_token: logging.info("Skipping user %s (%s) due to not having an access_token", user.fb_uid, user.full_name) try: fb_user = fbl.get(fb_api.LookupUser, user.fb_uid) except fb_api.ExpiredOAuthToken as e: logging.info("Auth token now expired, mark as such: %s", e) user.expired_oauth_token_reason = e.args[0] user.expired_oauth_token = True user.put() return else: user.compute_derived_properties(fb_user) user.put() map_load_fb_user = fb_mapreduce.mr_user_wrap(yield_load_fb_user) load_fb_user = fb_mapreduce.nomr_wrap(yield_load_fb_user)
if user.expired_oauth_token: logging.info('Skipping user %s (%s) due to expired access_token', user.fb_uid, user.full_name) user.put() elif not fbl.access_token: logging.info('Skipping user %s (%s) due to not having an access_token', user.fb_uid, user.full_name) user.put() else: fetch_and_save_fb_user(fbl, user) # The above function calls user.put(), so no need for: # users.update_mailchimp(user) def fetch_and_save_fb_user(fbl, user): try: fb_user = fbl.get(fb_api.LookupUser, user.fb_uid) except fb_api.ExpiredOAuthToken as e: logging.info('Auth token now expired, mark as such: %s', e) user.expired_oauth_token_reason = e.args[0] user.expired_oauth_token = True user.put() return else: user.compute_derived_properties(fb_user) user.put() map_load_fb_user = fb_mapreduce.mr_user_wrap(yield_load_fb_user) load_fb_user = fb_mapreduce.nomr_wrap(yield_load_fb_user)
fbl.batch_fetch() except fb_api.ExpiredOAuthToken as e: logging.info("Auth token now expired, mark as such: %s", e) user.expired_oauth_token_reason = e.args[0] user.expired_oauth_token = True user.put() return None try: email = email_for_user(user, fbl, should_send=True) return email except NoEmailException as e: logging.info("Not sending email for user %s: %s", user.fb_uid, e) return None except Exception as e: logging.exception("Error sending email for user %s", user.fb_uid) return None map_email_user = fb_mapreduce.mr_user_wrap(yield_email_user) email_user = fb_mapreduce.nomr_wrap(yield_email_user) def mr_email_user(fbl): fb_mapreduce.start_map( fbl=fbl, name='Email Users', #TODO: MOVE handler_spec='search.email_events.map_email_user', entity_kind='users.users.User', )
#TODO(lambert): do we really want yield on this one? def yield_email_user(fbl, user): fbl.request(fb_api.LookupUser, user.fb_uid) fbl.request(fb_api.LookupUserEvents, user.fb_uid) try: fbl.batch_fetch() except fb_api.ExpiredOAuthToken as e: logging.info("Auth token now expired, mark as such: %s", e) user.expired_oauth_token_reason = e.args[0] user.expired_oauth_token = True user.put() return None try: email = email_for_user(user, fbl, should_send=True) return email except Exception as e: logging.exception("Error sending email for user %s", user.fb_uid) return None map_email_user = fb_mapreduce.mr_user_wrap(yield_email_user) email_user = fb_mapreduce.nomr_wrap(yield_email_user) def mr_email_user(fbl): fb_mapreduce.start_map( fbl=fbl, name='Email Users', #TODO: MOVE handler_spec='search.email_events.map_email_user', entity_kind='users.users.User', )
logging.info("Couldn't fetch, using backup tokens for events: %s", empty_fb_event_ids) deferred.defer( load_fb_events_using_backup_tokens, empty_fb_event_ids, allow_cache=fbl.allow_cache, only_if_updated=only_if_updated, disable_updates=disable_updates ) logging.info("Updating events: %s", [x[0].id for x in events_to_update]) # And then re-save all the events in here if events_to_update: event_updates.update_and_save_fb_events(events_to_update, disable_updates=disable_updates) map_load_fb_event = fb_mapreduce.mr_wrap(yield_load_fb_event) load_fb_event = fb_mapreduce.nomr_wrap(yield_load_fb_event) def mr_load_fb_events( fbl, display_event=False, load_attending=False, time_period=None, disable_updates=None, only_if_updated=True, queue='slow-queue' ): if display_event: event_or_attending = 'Display Events' mr_func = 'map_resave_display_event' else: event_or_attending = 'Events' mr_func = 'map_load_fb_event' filters = [] if time_period: filters.append(('search_time_period', '=', time_period)) name = 'Load %s %s' % (time_period, event_or_attending)