From 0d07dea2acbd74773a375ae4ac0ee6528286299f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 24 Jun 2018 16:48:27 +0200 Subject: [PATCH] Return new records from copy following the input order issue7512 review58291002 --- doc/ref/models/models.rst | 1 + trytond/model/modelstorage.py | 12 +++++++----- trytond/tests/test_modelstorage.py | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/doc/ref/models/models.rst b/doc/ref/models/models.rst index c806862d63..a49ac3d25b 100644 --- a/doc/ref/models/models.rst +++ b/doc/ref/models/models.rst @@ -285,6 +285,7 @@ Class methods: Duplicate the records. ``default`` is a dictionary of default value for the created records. + New records are returned following the input order. .. classmethod:: ModelStorage.search(domain[, offset[, limit[, order[, count]]]]) diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py index 2bfbde24e9..9d62378e39 100644 --- a/trytond/model/modelstorage.py +++ b/trytond/model/modelstorage.py @@ -338,7 +338,7 @@ class ModelStorage(Model): data = convert_data(field_defs, datas[id]) to_create.append(data) new_records = cls.create(to_create) - new_ids = dict(izip(ids, map(int, new_records))) + id2new_record = dict(izip(ids, new_records)) fields_translate = {} for field_name, field in field_defs.iteritems(): @@ -358,11 +358,13 @@ class ModelStorage(Model): fuzzy_translation=False): datas = cls.read(ids, fields_names=fields_translate.keys() + ['id']) + to_write = [] for data in datas: - data_id = data['id'] - data = convert_data(fields_translate, data) - cls.write([cls(new_ids[data_id])], data) - return cls.browse(new_ids.values()) + to_write.append([id2new_record[data['id']]]) + to_write.append( + convert_data(fields_translate, data)) + cls.write(*to_write) + return new_records @classmethod def search(cls, domain, offset=0, limit=None, order=None, count=False): diff --git a/trytond/tests/test_modelstorage.py b/trytond/tests/test_modelstorage.py index 17c05c46b2..f22e9b4e16 100644 --- a/trytond/tests/test_modelstorage.py +++ b/trytond/tests/test_modelstorage.py @@ -36,6 +36,26 @@ class ModelStorageTestCase(unittest.TestCase): self.assertTrue( all(x['name'] >= y['name'] for x, y in zip(rows, rows[1:]))) + @with_transaction() + def test_copy_order(self): + "Test copy order" + pool = Pool() + ModelStorage = pool.get('test.modelstorage') + + # Use both order to avoid false positive by chance + records = ModelStorage.create( + [{'name': n} for n in ['foo', 'bar', 'test']]) + new_records = ModelStorage.copy(records) + reversed_records = list(reversed(records)) + new_reversed_records = ModelStorage.copy(reversed_records) + + self.assertListEqual( + [r.name for r in records], + [r.name for r in new_records]) + self.assertListEqual( + [r.name for r in reversed_records], + [r.name for r in new_reversed_records]) + @with_transaction() def test_search_count(self): "Test search_count"