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