def moving_node(sender, to_save): with lock_tables(sender._meta.db_table): current = sender.objects.get(id=to_save.id) size = current.highestchildnodenumber - current.nodenumber + 1 new_parent = sender.objects.get(id=to_save.parent.id) insertion_point = open_interval(sender, new_parent.nodenumber, size) # node interval will have moved if it is to the right of the insertion point # so fetch again current = sender.objects.get(id=current.id) move_interval(sender, current.nodenumber, current.highestchildnodenumber, insertion_point) close_interval(sender, current.nodenumber, size) # update the nodenumbers in to_save so the new values are not overwritten. current = sender.objects.get(id=current.id) to_save.nodenumber = current.nodenumber to_save.highestchildnodenumber = current.highestchildnodenumber
def adding_node(sender, obj): with lock_tables(obj._meta.db_table): parent = sender.objects.get(id=obj.parent.id) insertion_point = open_interval(sender, parent.nodenumber, 1) obj.highestchildnodenumber = obj.nodenumber = insertion_point