def get_score_by_screen_name(screen_name, depth):
# Gets the most recently updated copy, if duplicated.
key_name = (
'.' + screen_name if screen_name.startswith('__') else screen_name)
try:
score = yield ndb.Key(Score, key_name).get_async()
except OverQuotaError:
logging.critical('We are over quota.')
raise ndb.Return(None)
if score is None or (
score.last_updated < datetime.datetime.now()
- datetime.timedelta(days=MAX_AGE_DAYS)):
# If we don't have one, or if we have one that's too old, we need
# to calculate one.
if score is not None:
logging.info('Refreshing {}'.format(screen_name))
else:
logging.info('Fetching {} for the first time'.format(screen_name))
task_name = '{}_{}'.format(
screen_name,
os.environ['CURRENT_VERSION_ID'].split('.')[0])
queue_name = 'scoring-direct' if depth == 0 else 'scoring-indirect'
try:
_ = yield taskqueue.Task(
name=task_name,
params={
'screen_name': screen_name,
'depth': depth
}).add_async(queue_name)
# If this is a direct query, schedule an analysis of the profile
# picture.
if depth == 0:
_ = yield taskqueue.Task(
name=task_name,
params={
'screen_name': screen_name,
}).add_async('profile-pic')
# If we add it to the scoring-direct queue, we should remove
# the corresponding task from the scoring-indirect queue at this
# point.
if queue_name == 'scoring-direct':
delete_from_scoring_indirect(task_name)
except taskqueue.TaskAlreadyExistsError:
# We already are going to check this person. There is nothing
# to do here.
logging.warning(
'Fetch for {} already scheduled on queue {}'.format(
task_name, queue_name))
except taskqueue.TombstonedTaskError:
# This task is too recent. We shouldn't try again so
# soon. Thombstoning won't happen across different deploys, as the
# task name has the deploy timestamp on it.
logging.warning('Fetch for {} tombstoned'.format(task_name))
else:
logging.info('No need to refresh {}'.format(screen_name))
raise ndb.Return(score)
评论列表
文章目录