diff --git a/odoo/models.py b/odoo/models.py index 3dcfeb74315..9a5fb28218e 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -3025,7 +3025,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): record._cache.update(record._convert_to_cache(inverse_vals, update=True)) # in case several fields use the same inverse method, call it once - for fields in groupby(attrgetter('inverse'), inverse_fields): + for _inv, fields in groupby(inverse_fields, attrgetter('inverse')): fields[0].determine_inverse(self) self.modified(set(inverse_vals) - set(store_vals)) @@ -3218,7 +3218,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): record._cache.update(record._convert_to_cache(inverse_vals)) # in case several fields use the same inverse method, call it once - for fields in groupby(attrgetter('inverse'), inverse_fields): + for _inv, fields in groupby(inverse_fields, attrgetter('inverse')): fields[0].determine_inverse(record) record.modified(set(inverse_vals) - set(store_vals)) diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py index 5fc1f18e1b2..09ad85d278b 100644 --- a/odoo/tools/misc.py +++ b/odoo/tools/misc.py @@ -26,7 +26,7 @@ import unicodedata import werkzeug.utils import zipfile from collections import defaultdict, Iterable, Mapping, MutableMapping, MutableSet, OrderedDict -from itertools import islice, groupby, repeat +from itertools import islice, groupby as itergroupby, repeat from lxml import etree from .which import which @@ -869,7 +869,7 @@ def stripped_sys_argv(*strip_args): assert all(config.parser.has_option(s) for s in strip_args) takes_value = dict((s, config.parser.get_option(s).takes_value()) for s in strip_args) - longs, shorts = list(tuple(y) for _, y in groupby(strip_args, lambda x: x.startswith('--'))) + longs, shorts = list(tuple(y) for _, y in itergroupby(strip_args, lambda x: x.startswith('--'))) longs_eq = tuple(l + '=' for l in longs if takes_value[l]) args = sys.argv[:] @@ -1062,12 +1062,18 @@ class LastOrderedSet(OrderedSet): OrderedSet.discard(self, elem) OrderedSet.add(self, elem) -def groupby(key, elems): - """ Return a partition of ``elems`` based on ``key(elem)``. """ +def groupby(iterable, key=None): + """ Return a collection of pairs ``(key, elements)`` from ``iterable``. The + ``key`` is a function computing a key value for each element. This + function is similar to ``itertools.groupby``, but aggregates all + elements under the same key, not only consecutive elements. + """ + if key is None: + key = lambda arg: arg groups = defaultdict(list) - for elem in elems: + for elem in iterable: groups[key(elem)].append(elem) - return groups.values() + return groups.items() def unique(it): """ "Uniquifier" for the provided iterable: will output each element of