def txn(): task = api.get_task(domain_identifier, task_identifier) if not task: logging.error("Task '%s/%s' does not exist", domain_identifier, task_identifier) return None parent_task = api.get_task(domain_identifier, task.parent_task_identifier()) if parent_task: parent_index = TaskIndex.get_by_key_name( parent_task.identifier(), parent=parent_task.key()) if not parent_index: logging.error("Missing index for parent task '%s/%s'", domain_identifier, parent_identifier) self.error(400) # Retry later return None hierarchy = list(parent_index.hierarchy) hierarchy.append(parent_task.identifier()) level = parent_task.derived_level + 1 else: # root task hierarchy = [] level = 0 index = TaskIndex.get_by_key_name(task_identifier, parent=task) if not index: index = TaskIndex(parent=task, key_name=task_identifier) index.hierarchy = hierarchy index.put() task.derived_level = level task.put() return task
def txn(): # Returns (task, changed) tuple, where changed is set if # the task index was updated. task = api.get_task(domain_identifier, task_identifier) if not task: logging.error("Task '%s/%s' does not exist", domain_identifier, task_identifier) return None, False index = TaskIndex.get_by_key_name(task_identifier, parent=task) new_index = False if not index: index = TaskIndex(parent=task, key_name=task_identifier, hierarchy=[], level=0) new_index = True parent_identifier = task.parent_task_identifier() parent_hierarchy = [] if parent_identifier: parent_key = task.parent_task_key() parent_index = TaskIndex.get_by_key_name(parent_identifier, parent=parent_key) if not parent_index: logging.error("Missing index for parent task '%s/%s'", domain_identifier, parent_identifier) self.error(500) # Retry return None, False parent_hierarchy = parent_index.hierarchy hierarchy = parent_hierarchy if parent_identifier: hierarchy.append(parent_identifier) if (force_update or new_index or set(index.hierarchy) ^ set(hierarchy)): index.hierarchy = hierarchy index.level = len(hierarchy) index.put() return task, True return task, False