def delete_item(self, item_id): from app.notes.model import Note from app.tasks.model import Task # from app.milestones.model import Milestone # from app.worklog.model import Worklog # --- delete -> merge all the stuff to its parents category = None try: category = self.read_item(item_id) # if category.parent: # parent = self.read_item(category.parent) except Category.DoesNotExist: raise components.ResourceNotFoundError() parent = category.parent # merge # We need to have an event dispatch-thingy to notify all the depending modules to move around user_id = components.current_user_id() with components.DB.atomic(): for clazz in [Note, Task # , Milestone ]: # Why can't you just simply update? # clazz.update( # category=parent, # parent.id if parent else None, # edited=datetime.now() # ).where( # clazz.category == category, # under normal circumstances, it can't be None # ).execute() for obj in clazz.select(clazz).join( components.BaseUser, on=(clazz.owner == components.BaseUser.id) ).join(Category, on=(clazz.category == Category.id)).where( clazz.category.id == category. id, # under normal circumstances, it can't be None clazz.owner.id == user_id): obj.category = parent obj.changed() obj.save() # :/ # Why can't you simply update? # Category.update( # parent_id=parent.id, # edited=datetime.now() # ).where( # Category.parent == category, # ).execute() Parent = Category.alias() for child in Category.select(Category).join( components.BaseUser, on=(Category.owner == components.BaseUser.id)).join( Parent, on=(Category.parent == Parent.id)).where( Parent.id == category. id, # under normal circumstances, it can't be None Category.owner.id == user_id): child.parent = parent child.changed() child.save() category.is_deleted = True category.changed() category.save() # TODO: recalculate path for parent # self._flatten_tree_order(user_id) return category
def fetch_all_items(self): return Category.select().where(Category.is_deleted == False).order_by( Category.order)