Skip to content

Commit

Permalink
fixes #17
Browse files Browse the repository at this point in the history
bug with moving tree to another tree
  • Loading branch information
uralbash committed Jun 24, 2014
1 parent 63922f9 commit c526c06
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 14 deletions.
Empty file modified .coveragerc 100755 → 100644
Empty file.
Empty file modified .gitignore 100755 → 100644
Empty file.
Empty file modified .travis.yml 100755 → 100644
Empty file.
Empty file modified LICENSE.txt 100755 → 100644
Empty file.
Empty file modified Makefile 100755 → 100644
Empty file.
Empty file modified README.md 100755 → 100644
Empty file.
Empty file modified requirements.txt 100755 → 100644
Empty file.
Empty file modified setup.py 100755 → 100644
Empty file.
19 changes: 14 additions & 5 deletions sqlalchemy_mptt/events.py
Expand Up @@ -143,7 +143,6 @@ def mptt_before_update(mapper, connection, instance):
"""
table = mapper.mapped_table
node_id = instance.id

mptt_move_inside = None
left_sibling = None
left_sibling_tree_id = None
Expand Down Expand Up @@ -227,9 +226,20 @@ def mptt_before_update(mapper, connection, instance):
return

# fix tree shorting
if instance.parent_id and not node_parent_id and node_tree_id == instance.tree_id:
instance.parent_id = None
return
if instance.parent_id:
(parent_id,
parent_pos_right,
parent_pos_left,
parent_tree_id,
parent_level) = connection.execute(
select([table.c.id, table.c.rgt, table.c.lft, table.c.tree_id,
table.c.level])
.where(table.c.id == instance.parent_id)
).fetchone()
if not node_parent_id and node_tree_id == parent_tree_id:
instance.parent_id = None
# print "%s - %s" % (parent_tree_id, instance.tree_id)
return

# delete from old tree
mptt_before_delete(mapper, connection, instance, False)
Expand All @@ -247,7 +257,6 @@ def mptt_before_update(mapper, connection, instance):
table.c.level])
.where(table.c.id == instance.parent_id)
).fetchone()

# 'size' of moving node (including all it's sub nodes)
node_size = node_pos_right - node_pos_left + 1

Expand Down
64 changes: 55 additions & 9 deletions sqlalchemy_mptt/tests.py
Expand Up @@ -244,8 +244,6 @@ def test_update_wo_move_like_sacrud_save(self):
(22, 18, 19, 4, 21, 2)], self.result.all())

def test_insert_node(self):
node = Tree(parent_id=6)
self.session.add(node)
""" level Nested sets example
1 1(1)22
_______________|___________________
Expand All @@ -269,6 +267,8 @@ def test_insert_node(self):
id lft rgt lvl parent tree
"""
node = Tree(parent_id=6)
self.session.add(node)
self.assertEqual([(1, 1, 24, 1, None, 1),
(2, 2, 5, 2, 1, 1),
(3, 3, 4, 3, 2, 1),
Expand Down Expand Up @@ -296,8 +296,6 @@ def test_insert_node(self):
(23, 10, 11, 4, 6, 1)], self.result.all())

def test_insert_node_near_subtree(self):
node = Tree(parent_id=4)
self.session.add(node)
""" level Nested sets example
1 1(1)22
_______________|___________________
Expand All @@ -321,6 +319,8 @@ def test_insert_node_near_subtree(self):
id lft rgt lvl parent tree
"""
node = Tree(parent_id=4)
self.session.add(node)
self.assertEqual([(1, 1, 24, 1, None, 1),
(2, 2, 5, 2, 1, 1),
(3, 3, 4, 3, 2, 1),
Expand Down Expand Up @@ -351,7 +351,7 @@ def test_insert_after_node(self):
pass

def test_delete_node(self):
""" level Nested sets example
""" level Test delete node
1 1(1)22
_______________|___________________
| | |
Expand Down Expand Up @@ -397,7 +397,7 @@ def test_delete_node(self):
(22, 18, 19, 4, 21, 2)], self.result.all())

def test_update_node(self):
""" level Nested sets example
""" level Test update node
1 1(1)22
_______________|___________________
| | |
Expand Down Expand Up @@ -566,9 +566,6 @@ def test_update_node(self):
(22, 18, 19, 4, 21, 2)], self.result.all())

def test_move_between_tree(self):
node = self.session.query(Tree).filter(Tree.id == 4).one()
node.parent_id = 15
self.session.add(node)
""" 4 -> 15
level Nested sets tree1
1 1(1)16
Expand All @@ -591,6 +588,9 @@ def test_move_between_tree(self):
4 8(5)9 10(6)11 20(20)21 24(22)25
"""
node = self.session.query(Tree).filter(Tree.id == 4).one()
node.parent_id = 15
self.session.add(node)
self.assertEqual([(1, 1, 16, 1, None, 1),
(2, 2, 5, 2, 1, 1),
(3, 3, 4, 3, 2, 1),
Expand All @@ -617,6 +617,51 @@ def test_move_between_tree(self):
(21, 23, 26, 3, 18, 2),
(22, 24, 25, 4, 21, 2)], self.result.all())

def test_move_tree_to_another_tree(self):
""" 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
id lft rgt lvl parent tree
"""
node = self.session.query(Tree).filter(Tree.id == 12).one()
node.parent_id = 7
self.session.add(node)
self.assertEqual([(1, 1, 44, 1, None, 1),
(2, 2, 5, 2, 1, 1),
(3, 3, 4, 3, 2, 1),
(4, 6, 11, 2, 1, 1),
(5, 7, 8, 3, 4, 1),
(6, 9, 10, 3, 4, 1),
(7, 12, 43, 2, 1, 1),
(8, 35, 38, 3, 7, 1),
(9, 36, 37, 4, 8, 1),
(10, 39, 42, 3, 7, 1),
(11, 40, 41, 4, 10, 1),
(12, 13, 34, 3, 7, 1),
(13, 14, 17, 4, 12, 1),
(14, 15, 16, 5, 13, 1),
(15, 18, 23, 4, 12, 1),
(16, 19, 20, 5, 15, 1),
(17, 21, 22, 5, 15, 1),
(18, 24, 33, 4, 12, 1),
(19, 25, 28, 5, 18, 1),
(20, 26, 27, 6, 19, 1),
(21, 29, 32, 5, 18, 1),
(22, 30, 31, 6, 21, 1)], self.result.all())

def test_move_inside_function(self):
node = self.session.query(Tree).filter(Tree.id == 4).one()
node.move_inside("15")
Expand All @@ -641,6 +686,7 @@ def test_move_inside_function(self):
^ | |
4 8(5)9 10(6)11 20(20)21 24(22)25
id lft rgt lvl parent tree
"""
self.assertEqual([(1, 1, 16, 1, None, 1),
(2, 2, 5, 2, 1, 1),
Expand Down
Empty file modified tox.ini 100755 → 100644
Empty file.

0 comments on commit c526c06

Please sign in to comment.