sqlalchemy_mptt icon indicating copy to clipboard operation
sqlalchemy_mptt copied to clipboard

move_after moves node too far right

Open RafGb opened this issue 5 years ago • 2 comments

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()
        )

RafGb avatar Jan 21 '20 12:01 RafGb

Hi! Has any progress?

Goomba41 avatar Apr 07 '21 05:04 Goomba41