diff --git a/odoo/models.py b/odoo/models.py index 6b82a115f55c044b7436bf44144f056d0096ef04..fb20a4bfbd0f093d8e4f658eb8e9a56d3b808f49 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -4950,7 +4950,7 @@ class BaseModel(object): vals = [func(rec) for rec in self] if isinstance(vals[0], BaseModel): # return the union of all recordsets in O(n) - ids = set(itertools.chain(*[rec._ids for rec in vals])) + ids = OrderedSet(itertools.chain(*[rec._ids for rec in vals])) return vals[0].browse(ids) return vals else: @@ -5117,7 +5117,7 @@ class BaseModel(object): """ if not isinstance(other, BaseModel) or self._name != other._name: raise TypeError("Mixing apples and oranges: %s & %s" % (self, other)) - return self.browse(set(self._ids) & set(other._ids)) + return self.browse(OrderedSet(self._ids) & OrderedSet(other._ids)) def __or__(self, other): """ Return the union of two recordsets. @@ -5125,7 +5125,7 @@ class BaseModel(object): """ if not isinstance(other, BaseModel) or self._name != other._name: raise TypeError("Mixing apples and oranges: %s | %s" % (self, other)) - return self.browse(set(self._ids) | set(other._ids)) + return self.browse(OrderedSet(self._ids) | OrderedSet(other._ids)) def __eq__(self, other): """ Test whether two recordsets are equivalent (up to reordering). """ diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py index b69ad469e8c543ebb93dcd192acde0f494491ed6..ecc0193c10803ef1c1fb192abddafbf3ef0933d3 100644 --- a/odoo/tools/misc.py +++ b/odoo/tools/misc.py @@ -1091,6 +1091,12 @@ class OrderedSet(OrderedDict): def discard(self, elem): self.pop(elem, None) + def __or__(self, other): + return OrderedSet(self.keys() + list(other)) + + def __and__(self, other): + return OrderedSet(e for e in self.keys() if e in other) + class LastOrderedSet(OrderedSet): """ A set collection that remembers the elements last insertion order. """ def add(self, elem):