Source code for sqlalchemy_mptt.tests.cases.move_node

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2015 uralbash <root@uralbash.ru>
#
# Distributed under terms of the MIT license.
import os


[docs] class MoveBefore(object):
[docs] def test_move_before_to_top_level(self): """ For example move node(4) before node(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level move 4 before 1 1 1(4)6 1(1)16 ^ _______|_______ 2(5)3 4(6)5 | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 4).one() node.move_before(1) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 16, _level + 0, None, 2), (2, 2, 5, _level + 1, 1, 2), (3, 3, 4, _level + 2, 2, 2), (4, 1, 6, _level + 0, None, 1), (5, 2, 3, _level + 1, 4, 1), (6, 4, 5, _level + 1, 4, 1), (7, 6, 15, _level + 1, 1, 2), (8, 7, 10, _level + 2, 7, 2), (9, 8, 9, _level + 3, 8, 2), (10, 11, 14, _level + 2, 7, 2), (11, 12, 13, _level + 3, 10, 2), (12, 1, 22, _level + 0, None, 3), (13, 2, 5, _level + 1, 12, 3), (14, 3, 4, _level + 2, 13, 3), (15, 6, 11, _level + 1, 12, 3), (16, 7, 8, _level + 2, 15, 3), (17, 9, 10, _level + 2, 15, 3), (18, 12, 21, _level + 1, 12, 3), (19, 13, 16, _level + 2, 18, 3), (20, 14, 15, _level + 3, 19, 3), (21, 17, 20, _level + 2, 18, 3), (22, 18, 19, _level + 3, 21, 3) ], self.result.all()) # flake8: noqa
[docs] def test_move_one_tree_before_another(self): """ For example move node(12) before node(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: <-------------------------------- | level Nested sets tree1 | 1 1(1)22 | _______________|___________________ | | | | | 2 2(2)5 6(4)11 12(7)21 | | ^ ^ | 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | | | 4 14(9)15 18(11)19 | | level Nested sets tree2 | 1 1(12)22 ---------------------------- _______________|___________________ | | | 2 2(13)5 6(15)11 12(18)21 | ^ ^ 3 3(14)4 7(16)8 9(17)10 13(19)16 17(21)20 | | 4 14(20)15 18(22)19 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 12).one() node.move_before("1") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 2), (2, 2, 5, _level + 1, 1, 2), (3, 3, 4, _level + 2, 2, 2), (4, 6, 11, _level + 1, 1, 2), (5, 7, 8, _level + 2, 4, 2), (6, 9, 10, _level + 2, 4, 2), (7, 12, 21, _level + 1, 1, 2), (8, 13, 16, _level + 2, 7, 2), (9, 14, 15, _level + 3, 8, 2), (10, 17, 20, _level + 2, 7, 2), (11, 18, 19, _level + 3, 10, 2), (12, 1, 22, _level + 0, None, 1), (13, 2, 5, _level + 1, 12, 1), (14, 3, 4, _level + 2, 13, 1), (15, 6, 11, _level + 1, 12, 1), (16, 7, 8, _level + 2, 15, 1), (17, 9, 10, _level + 2, 15, 1), (18, 12, 21, _level + 1, 12, 1), (19, 13, 16, _level + 2, 18, 1), (20, 14, 15, _level + 3, 19, 1), (21, 17, 20, _level + 2, 18, 1), (22, 18, 19, _level + 3, 21, 1) ], self.result.all())
[docs] def test_move_before_function(self): """ For example move node(8) before node(4) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level move 8 before 4 1 1(1)22 _______________|___________________ | | | | 2 2(2)5 6(8)9 10(4)15 16(7)21 | | ^ | 3 3(3)4 7(9)8 11(5)12 13(6)14 17(10)20 | 4 18(11)19 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 8).one() node.move_before("4") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 10, 15, _level + 1, 1, 1), (5, 11, 12, _level + 2, 4, 1), (6, 13, 14, _level + 2, 4, 1), (7, 16, 21, _level + 1, 1, 1), (8, 6, 9, _level + 1, 1, 1), (9, 7, 8, _level + 2, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all())
[docs] def test_move_one_tree_before_other_tree(self): self.fixture.add( self.model, os.path.join('fixtures', 'tree_3.json') ) self.session.commit() self.maxDiff = None node = self.session.query(self.model).\ filter(self.model.get_pk_column() == 12).one() node.move_before("1") _level = node.get_default_level() self.assertEqual( self.result.all(), [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 2), (2, 2, 5, _level + 1, 1, 2), (3, 3, 4, _level + 2, 2, 2), (4, 6, 11, _level + 1, 1, 2), (5, 7, 8, _level + 2, 4, 2), (6, 9, 10, _level + 2, 4, 2), (7, 12, 21, _level + 1, 1, 2), (8, 13, 16, _level + 2, 7, 2), (9, 14, 15, _level + 3, 8, 2), (10, 17, 20, _level + 2, 7, 2), (11, 18, 19, _level + 3, 10, 2), (12, 1, 22, _level + 0, None, 1), (13, 2, 5, _level + 1, 12, 1), (14, 3, 4, _level + 2, 13, 1), (15, 6, 11, _level + 1, 12, 1), (16, 7, 8, _level + 2, 15, 1), (17, 9, 10, _level + 2, 15, 1), (18, 12, 21, _level + 1, 12, 1), (19, 13, 16, _level + 2, 18, 1), (20, 14, 15, _level + 3, 19, 1), (21, 17, 20, _level + 2, 18, 1), (22, 18, 19, _level + 3, 21, 1), (23, 1, 22, _level + 0, None, 4), (24, 2, 5, _level + 1, 23, 4), (25, 3, 4, _level + 2, 24, 4), (26, 6, 11, _level + 1, 23, 4), (27, 7, 8, _level + 2, 26, 4), (28, 9, 10, _level + 2, 26, 4), (29, 12, 21, _level + 1, 23, 4), (30, 13, 16, _level + 2, 29, 4), (31, 14, 15, _level + 3, 30, 4), (32, 17, 20, _level + 2, 29, 4), (33, 18, 19, _level + 3, 32, 4) ] ) node = self.session.query(self.model).\ filter(self.model.get_pk_column() == 23).one() node.move_before("1") _level = node.get_default_level() self.assertEqual( self.result.all(), [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 3), (2, 2, 5, _level + 1, 1, 3), (3, 3, 4, _level + 2, 2, 3), (4, 6, 11, _level + 1, 1, 3), (5, 7, 8, _level + 2, 4, 3), (6, 9, 10, _level + 2, 4, 3), (7, 12, 21, _level + 1, 1, 3), (8, 13, 16, _level + 2, 7, 3), (9, 14, 15, _level + 3, 8, 3), (10, 17, 20, _level + 2, 7, 3), (11, 18, 19, _level + 3, 10, 3), (12, 1, 22, _level + 0, None, 1), (13, 2, 5, _level + 1, 12, 1), (14, 3, 4, _level + 2, 13, 1), (15, 6, 11, _level + 1, 12, 1), (16, 7, 8, _level + 2, 15, 1), (17, 9, 10, _level + 2, 15, 1), (18, 12, 21, _level + 1, 12, 1), (19, 13, 16, _level + 2, 18, 1), (20, 14, 15, _level + 3, 19, 1), (21, 17, 20, _level + 2, 18, 1), (22, 18, 19, _level + 3, 21, 1), (23, 1, 22, _level + 0, None, 2), (24, 2, 5, _level + 1, 23, 2), (25, 3, 4, _level + 2, 24, 2), (26, 6, 11, _level + 1, 23, 2), (27, 7, 8, _level + 2, 26, 2), (28, 9, 10, _level + 2, 26, 2), (29, 12, 21, _level + 1, 23, 2), (30, 13, 16, _level + 2, 29, 2), (31, 14, 15, _level + 3, 30, 2), (32, 17, 20, _level + 2, 29, 2), (33, 18, 19, _level + 3, 32, 2) ] ) node = self.session.query(self.model).\ filter(self.model.get_pk_column() == 1).one() node.move_before("12") _level = node.get_default_level() self.assertEqual( self.result.all(), [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 21, _level + 1, 1, 1), (8, 13, 16, _level + 2, 7, 1), (9, 14, 15, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2), (23, 1, 22, _level + 0, None, 3), (24, 2, 5, _level + 1, 23, 3), (25, 3, 4, _level + 2, 24, 3), (26, 6, 11, _level + 1, 23, 3), (27, 7, 8, _level + 2, 26, 3), (28, 9, 10, _level + 2, 26, 3), (29, 12, 21, _level + 1, 23, 3), (30, 13, 16, _level + 2, 29, 3), (31, 14, 15, _level + 3, 30, 3), (32, 17, 20, _level + 2, 29, 3), (33, 18, 19, _level + 3, 32, 3) ] )
[docs] def test_move_before_to_other_tree(self): """ For example move node(8) before node(15) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Move 8 before 15 1 1(1)18 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)17 | ^ | 3 3(3)4 7(5)8 9(6)10 13(10)16 | 4 14(11)15 level 1 1(12)26 _______________|______________________________ | | | | 2 2(13)5 6(8)9 10(15)15 16(18)25 | | ^ ^ 3 3(14)4 7(9)8 11(16)12 13(17)14 17(19)20 21(21)24 | | 4 18(20)19 22(22)23 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 8).one() node.move_before("15") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 18, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 17, _level + 1, 1, 1), (8, 6, 9, _level + 1, 12, 2), (9, 7, 8, _level + 2, 8, 2), (10, 13, 16, _level + 2, 7, 1), (11, 14, 15, _level + 3, 10, 1), (12, 1, 26, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 10, 15, _level + 1, 12, 2), (16, 11, 12, _level + 2, 15, 2), (17, 13, 14, _level + 2, 15, 2), (18, 16, 25, _level + 1, 12, 2), (19, 17, 20, _level + 2, 18, 2), (20, 18, 19, _level + 3, 19, 2), (21, 21, 24, _level + 2, 18, 2), (22, 22, 23, _level + 3, 21, 2) ], self.result.all() )
[docs] class MoveAfter(object):
[docs] def test_move_after_function(self): """ For example move node(8) after node(5) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Initial state 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 after 5 1 1(1)22 _______________|__________________ | | | 2 2(2)5 6(4)15 16(7)21 | ^ | 3 3(3)4 7(5)8 9(8)12 13(6)14 17(10)20 | | 4 10(9)11 18(11)19 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 8).one() node.move_after("5") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 15, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 13, 14, _level + 2, 4, 1), (7, 16, 21, _level + 1, 1, 1), (8, 9, 12, _level + 2, 4, 1), (9, 10, 11, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_move_to_toplevel_where_much_trees_from_right_side(self): """ Move 20 after 1 initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level tree_id = 1 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level tree_id = 2 1 1(15)6 ^ 2 2(16)3 4(17)5 level tree_id = 3 1 1(12)16 _______________| | | 2 2(13)5 6(18)15 | ^ 3 3(14)4 7(19)10 11(21)14 | | 4 8(20)9 12(22)13 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 15).one() node.move_after("1") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 21, _level + 1, 1, 1), (8, 13, 16, _level + 2, 7, 1), (9, 14, 15, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 16, _level + 0, None, 3), (13, 2, 5, _level + 1, 12, 3), (14, 3, 4, _level + 2, 13, 3), (15, 1, 6, _level + 0, None, 2), (16, 2, 3, _level + 1, 15, 2), (17, 4, 5, _level + 1, 15, 2), (18, 6, 15, _level + 1, 12, 3), (19, 7, 10, _level + 2, 18, 3), (20, 8, 9, _level + 3, 19, 3), (21, 11, 14, _level + 2, 18, 3), (22, 12, 13, _level + 3, 21, 3) ], self.result.all() ) node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 20).one() node.move_after("1") """ level tree_id = 1 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level tree_id = 2 1 1(20)2 level tree_id = 3 1 1(15)6 ^ 2 2(16)3 4(17)5 level tree_id = 4 1 1(12)14 _______________| | | 2 2(13)5 6(18)13 | ^ 3 3(14)4 7(19)8 9(21)12 | 4 10(22)11 """ _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 21, _level + 1, 1, 1), (8, 13, 16, _level + 2, 7, 1), (9, 14, 15, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 14, _level + 0, None, 4), (13, 2, 5, _level + 1, 12, 4), (14, 3, 4, _level + 2, 13, 4), (15, 1, 6, _level + 0, None, 3), (16, 2, 3, _level + 1, 15, 3), (17, 4, 5, _level + 1, 15, 3), (18, 6, 13, _level + 1, 12, 4), (19, 7, 8, _level + 2, 18, 4), (20, 1, 2, _level + 0, None, 2), (21, 9, 12, _level + 2, 18, 4), (22, 10, 11, _level + 3, 21, 4) ], self.result.all() )
[docs] def test_move_to_toplevel(self): """ Move node(8) to top level after node(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 after 1 1 1(1)18 1(8)4 _______________|______________ | | | | | 2 2(2)5 6(4)11 12(7)17 2(9)3 | ^ | 3 3(3)4 7(5)8 9(6)10 13(10)16 | 4 14(11)15 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 8).one() node.move_after("1") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 18, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 17, _level + 1, 1, 1), (8, 1, 4, _level + 0, None, 2), (9, 2, 3, _level + 1, 8, 2), (10, 13, 16, _level + 2, 7, 1), (11, 14, 15, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 3), (13, 2, 5, _level + 1, 12, 3), (14, 3, 4, _level + 2, 13, 3), (15, 6, 11, _level + 1, 12, 3), (16, 7, 8, _level + 2, 15, 3), (17, 9, 10, _level + 2, 15, 3), (18, 12, 21, _level + 1, 12, 3), (19, 13, 16, _level + 2, 18, 3), (20, 14, 15, _level + 3, 19, 3), (21, 17, 20, _level + 2, 18, 3), (22, 18, 19, _level + 3, 21, 3) ], self.result.all() )
[docs] def test_move_to_toplevel2(self): """ Move node(8) to top level after node(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 after 1 1 1(1)18 1(8)4 _______________|______________ | | | | | 2 2(2)5 6(4)11 12(7)17 2(9)3 | ^ | 3 3(3)4 7(5)8 9(6)10 13(10)16 | 4 14(11)15 id lft rgt lvl parent tree """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 8).one() node.parent_id = None self.session.add(node) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 18, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 17, _level + 1, 1, 1), (8, 1, 4, _level + 0, None, 3), (9, 2, 3, _level + 1, 8, 3), (10, 13, 16, _level + 2, 7, 1), (11, 14, 15, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_move_to_toplevel_big_subtree(self): """ Move node(7) (big subtree) to top level after node(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 7 to toplevel 1 1(1)12 1(7)10 _______________| ____|____ | | | | 2 2(2)5 6(4)11 2(8)5 6(10)9 | ^ | | 3 3(3)4 7(5)8 9(6)10 3(9)4 7(11)8 id lft rgt lvl parent tree """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 7).one() node.parent_id = None self.session.add(node) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 12, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 1, 10, _level + 0, None, 3), (8, 2, 5, _level + 1, 7, 3), (9, 3, 4, _level + 2, 8, 3), (10, 6, 9, _level + 1, 7, 3), (11, 7, 8, _level + 2, 10, 3), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_move_after_between_tree(self): """ Move node(7) (big subtree) to top level after node(1) and before node(12) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 7 to toplevel 1 1(1)12 1(7)10 _______________| ____|____ | | | | 2 2(2)5 6(4)11 2(8)5 6(10)9 | ^ | | 3 3(3)4 7(5)8 9(6)10 3(9)4 7(11)8 id lft rgt lvl parent tree """ node = self.session.query(self.model).\ filter(self.model.get_pk_column() == 7).one() node.move_after("1") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 12, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 1, 10, _level + 0, None, 2), (8, 2, 5, _level + 1, 7, 2), (9, 3, 4, _level + 2, 8, 2), (10, 6, 9, _level + 1, 7, 2), (11, 7, 8, _level + 2, 10, 2), (12, 1, 22, _level + 0, None, 3), (13, 2, 5, _level + 1, 12, 3), (14, 3, 4, _level + 2, 13, 3), (15, 6, 11, _level + 1, 12, 3), (16, 7, 8, _level + 2, 15, 3), (17, 9, 10, _level + 2, 15, 3), (18, 12, 21, _level + 1, 12, 3), (19, 13, 16, _level + 2, 18, 3), (20, 14, 15, _level + 3, 19, 3), (21, 17, 20, _level + 2, 18, 3), (22, 18, 19, _level + 3, 21, 3) ], self.result.all() )
[docs] class MoveInside(object):
[docs] def test_move_between_tree(self): """ Move node(4) to other tree inside node(15) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets tree1 1 1(1)16 _______________|_____________________ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13 level Nested sets tree2 1 1(12)28 ________________|_______________________ | | | 2 2(13)5 6(15)17 18(18)27 | ^ ^ 3 3(14)4 7(4)12 13(16)14 15(17)16 19(19)22 23(21)26 ^ | | 4 8(5)9 10(6)11 20(20)21 24(22)25 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 4).one() node.parent_id = 15 self.session.add(node) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 16, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 7, 12, _level + 2, 15, 2), (5, 8, 9, _level + 3, 4, 2), (6, 10, 11, _level + 3, 4, 2), (7, 6, 15, _level + 1, 1, 1), (8, 7, 10, _level + 2, 7, 1), (9, 8, 9, _level + 3, 8, 1), (10, 11, 14, _level + 2, 7, 1), (11, 12, 13, _level + 3, 10, 1), (12, 1, 28, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 17, _level + 1, 12, 2), (16, 13, 14, _level + 2, 15, 2), (17, 15, 16, _level + 2, 15, 2), (18, 18, 27, _level + 1, 12, 2), (19, 19, 22, _level + 2, 18, 2), (20, 20, 21, _level + 3, 19, 2), (21, 23, 26, _level + 2, 18, 2), (22, 24, 25, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_move_tree_to_another_tree(self): """ Move tree(2) inside tree(1) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Move tree2 to tree1 1 1(1)44 _______________|_________________________________ | | | 2 2(2)5 6(4)11 12(7)43 | ___|___ __|_____________________________________ | | | | | | 3 3(3)4 7(5)8 9(6)10 13(12)34 35(8)38 39(10)42 _______________|___________________ | | | | | 36(9)37 40(11)41 4 14(13)17 18(15)23 24(18)33 | ^ ^ 5 15(14)16 19(16)20 21(17)22 25(19)28 29(21)32 | | 6 26(20)27 30(22)31 """ # noqa node = self.session.query(self.model).\ filter(self.model.get_pk_column() == 12).one() node.parent_id = 7 self.session.add(node) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 44, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 43, _level + 1, 1, 1), (8, 35, 38, _level + 2, 7, 1), (9, 36, 37, _level + 3, 8, 1), (10, 39, 42, _level + 2, 7, 1), (11, 40, 41, _level + 3, 10, 1), (12, 13, 34, _level + 2, 7, 1), (13, 14, 17, _level + 3, 12, 1), (14, 15, 16, _level + 4, 13, 1), (15, 18, 23, _level + 3, 12, 1), (16, 19, 20, _level + 4, 15, 1), (17, 21, 22, _level + 4, 15, 1), (18, 24, 33, _level + 3, 12, 1), (19, 25, 28, _level + 4, 18, 1), (20, 26, 27, _level + 5, 19, 1), (21, 29, 32, _level + 4, 18, 1), (22, 30, 31, _level + 5, 21, 1) ], self.result.all() )
[docs] def test_move_inside_function(self): """ For example move node(4) inside node(15) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Nested sets tree1 1 1(1)16 _______________|_____________________ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13 level Nested sets tree2 1 1(12)28 ________________|_______________________ | | | 2 2(13)5 6(15)17 18(18)27 | ^ ^ 3 3(14)4 7(4)12 13(16)14 15(17)16 19(19)22 23(21)26 ^ | | 4 8(5)9 10(6)11 20(20)21 24(22)25 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 4).one() node.move_inside("15") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 16, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 7, 12, _level + 2, 15, 2), (5, 8, 9, _level + 3, 4, 2), (6, 10, 11, _level + 3, 4, 2), (7, 6, 15, _level + 1, 1, 1), (8, 7, 10, _level + 2, 7, 1), (9, 8, 9, _level + 3, 8, 1), (10, 11, 14, _level + 2, 7, 1), (11, 12, 13, _level + 3, 10, 1), (12, 1, 28, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 17, _level + 1, 12, 2), (16, 13, 14, _level + 2, 15, 2), (17, 15, 16, _level + 2, 15, 2), (18, 18, 27, _level + 1, 12, 2), (19, 19, 22, _level + 2, 18, 2), (20, 20, 21, _level + 3, 19, 2), (21, 23, 26, _level + 2, 18, 2), (22, 24, 25, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_tree_shorting(self): """ Try to move top level node(1) inside tree .. code:: level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Nested sets example __parent_id______________________ | | 1 1(1)22 | _______________|___________________ | | | | | 2 2(2)5 6(4)11 12(7)21 (X) | ^ ^ | 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | | | 4 14(9)15 18(11)19 | ↑ | ↑________| """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 1).one() node.parent_id = 11 self.session.add(node) _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 7, 8, _level + 2, 4, 1), (6, 9, 10, _level + 2, 4, 1), (7, 12, 21, _level + 1, 1, 1), (8, 13, 16, _level + 2, 7, 1), (9, 14, 15, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all() )
[docs] def test_move_inside_to_the_same_parent_function(self): """ For example move node(6) inside node(4) initial state of the tree :mod:`sqlalchemy_mptt.tests.add_mptt_tree` .. code:: level Initial state 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level move 6 inside 4 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(6)8 9(5)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 """ node = self.session.query(self.model)\ .filter(self.model.get_pk_column() == 6).one() node.move_inside("4") _level = node.get_default_level() self.assertEqual( [ # id lft rgt lvl parent tree (1, 1, 22, _level + 0, None, 1), (2, 2, 5, _level + 1, 1, 1), (3, 3, 4, _level + 2, 2, 1), (4, 6, 11, _level + 1, 1, 1), (5, 9, 10, _level + 2, 4, 1), (6, 7, 8, _level + 2, 4, 1), (7, 12, 21, _level + 1, 1, 1), (8, 13, 16, _level + 2, 7, 1), (9, 14, 15, _level + 3, 8, 1), (10, 17, 20, _level + 2, 7, 1), (11, 18, 19, _level + 3, 10, 1), (12, 1, 22, _level + 0, None, 2), (13, 2, 5, _level + 1, 12, 2), (14, 3, 4, _level + 2, 13, 2), (15, 6, 11, _level + 1, 12, 2), (16, 7, 8, _level + 2, 15, 2), (17, 9, 10, _level + 2, 15, 2), (18, 12, 21, _level + 1, 12, 2), (19, 13, 16, _level + 2, 18, 2), (20, 14, 15, _level + 3, 19, 2), (21, 17, 20, _level + 2, 18, 2), (22, 18, 19, _level + 3, 21, 2) ], self.result.all() )