sqlalchemy_mptt
sqlalchemy_mptt copied to clipboard
move_after moves node too far right
move_after moves element one position further than expected.
I think it's because after we called mptt_before_delete
here, lft and rgt of left sibling has changed, but variable left_sibling
still has old values which lead to incorrect values of delta_lft
and delta_rgt
in _insert_subtree
Here's test code:
class MoveRight(object):
def test_move_right(self):
self.session.query(self.model).delete()
_level = self.model.get_default_level()
pk_column = self.model.get_pk_column()
self.session.add_all([
self.model(**{pk_column.name: 1}),
self.model(**{pk_column.name: 2, 'parent_id': 1}),
self.model(**{pk_column.name: 3, 'parent_id': 1}),
self.model(**{pk_column.name: 4, 'parent_id': 1}),
])
# initial tree:
# 1
# / | \
# 2 3 4
self.assertEqual(
[
(1, 1, 8, _level + 0, None, 1),
(2, 2, 3, _level + 1, 1, 1),
(3, 4, 5, _level + 1, 1, 1),
(4, 6, 7, _level + 1, 1, 1)
],
self.result.all()
)
# move 2 to right
node2 = self.session.query(self.model).filter(pk_column == 2).one()
node2.move_after("3")
# expected result:
# 1
# / | \
# 3 2 4
self.assertEqual(
[
(1, 1, 8, _level + 0, None, 1),
(2, 4, 5, _level + 1, 1, 1),
(3, 2, 3, _level + 1, 1, 1),
(4, 6, 7, _level + 1, 1, 1)
],
self.result.all()
)
Hi! Has any progress?