From 337eb7169ebbf638bb950b1abc7a8218d0229215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 16 Jul 2022 23:59:09 +0200 Subject: [PATCH] Ensure ModelList contains only unique records issue11230 review435351003 --- proteus/__init__.py | 9 +++++---- proteus/tests/test_model.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/proteus/__init__.py b/proteus/__init__.py index 2c6db56857..c6959144ca 100644 --- a/proteus/__init__.py +++ b/proteus/__init__.py @@ -531,6 +531,7 @@ class ModelList(list): self.record_removed = set() self.record_deleted = set() result = super(ModelList, self).__init__(sequence) + assert len(self) == len(set(self)) self.__check(self, on_change=False) return result __init__.__doc__ = list.__init__.__doc__ @@ -577,17 +578,17 @@ class ModelList(list): def append(self, record): self.__check([record]) - res = super(ModelList, self).append(record) + if record not in self: + super().append(record) self._changed() - return res append.__doc__ = list.append.__doc__ def extend(self, iterable): iterable = list(iterable) self.__check(iterable) - res = super(ModelList, self).extend(iterable) + set_ = set(self) + super().extend(r for r in iterable if r not in set_) self._changed() - return res extend.__doc__ = list.extend.__doc__ def insert(self, index, record): diff --git a/proteus/tests/test_model.py b/proteus/tests/test_model.py index 1a5188e3f3..fe8d5da023 100644 --- a/proteus/tests/test_model.py +++ b/proteus/tests/test_model.py @@ -73,6 +73,24 @@ class TestModel(ProteusTestCase): except AttributeError: pass + def test_many2many_append_unique(self): + User = Model.get('res.user') + Group = Model.get('res.group') + admin, = User.find([('login', '=', 'admin')]) + group = Group(admin.groups[0].id) + admin.groups.append(group) + + self.assertEqual(admin.groups.count(group), 1) + + def test_many2many_extend_unique(self): + User = Model.get('res.user') + Group = Model.get('res.group') + admin, = User.find([('login', '=', 'admin')]) + group = Group(admin.groups[0].id) + admin.groups.extend([group]) + + self.assertEqual(admin.groups.count(group), 1) + # TODO test date def test_reference(self):