changeset 7cedd42a20a6 in proteus:default
details: https://hg.tryton.org/proteus?cmd=changeset&node=7cedd42a20a6
description:
        Ensure ModelList contains only unique records

        issue11230
        review435351003
diffstat:

 proteus/__init__.py         |   9 +++++----
 proteus/tests/test_model.py |  18 ++++++++++++++++++
 2 files changed, 23 insertions(+), 4 deletions(-)

diffs (61 lines):

diff -r 1a93808b1b9b -r 7cedd42a20a6 proteus/__init__.py
--- a/proteus/__init__.py       Mon May 02 16:26:35 2022 +0200
+++ b/proteus/__init__.py       Sat Jul 16 23:59:09 2022 +0200
@@ -531,6 +531,7 @@
         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 @@
 
     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 -r 1a93808b1b9b -r 7cedd42a20a6 proteus/tests/test_model.py
--- a/proteus/tests/test_model.py       Mon May 02 16:26:35 2022 +0200
+++ b/proteus/tests/test_model.py       Sat Jul 16 23:59:09 2022 +0200
@@ -73,6 +73,24 @@
         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):

Reply via email to