Пример #1
0
def recalculate_views(start_key=None):
  def tx(key, incr):
    recipe = Recipe.get(db.Key(key))
    if recipe:
      recipe.views += incr
      
      to_db = [recipe]
      
      idx = RecipeIdx.get(db.Key.from_path('RecipeIdx', 'idx', parent=recipe.key()))
      if idx:
        idx.views = recipe.views
        to_db.append(idx)

      fri = RecipeFriends.get(db.Key.from_path('RecipeFriends', 'fri', parent=recipe.key()))
      if fri:
        fri.views = recipe.views
        to_db.append(fri)
      
      db.put(to_db)
    
    return True

  while (True):
    try:
      counters = Counter.all()
      if start_key:
        counters.filter('__key__ >', start_key)
      counters.order('__key__')
      counters = counters.fetch(20)
      
      if not counters:
        break
      else:
        start_key = None

      for counter in counters:
        _key = counter.key().name()
        if _key.startswith(SHARD_RECIPE_KEY % u''):
          if db.run_in_transaction(tx, _key.split('|')[1], counter.counter):
            key_tmp = counter.key()
            counter.delete()
            start_key = key_tmp
      
    except (DeadlineExceededError), e:
      deferred_lib.defer(recalculate_views, start_key)
    except (CapabilityDisabledError, Timeout), e:
      break # End if there is no more time...