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...