diff --git a/modules/purchase/purchase.py b/modules/purchase/purchase.py index 480da93d6d..2ee31b2a7a 100644 --- a/modules/purchase/purchase.py +++ b/modules/purchase/purchase.py @@ -2334,7 +2334,7 @@ class ModifyHeader(Wizard): Line = pool.get('purchase.line') purchase = self.get_purchase() - values = self.start._save_values + values = self.start._save_values() self.model.write([purchase], values) self.model.log([purchase], 'write', ','.join(sorted(values.keys()))) diff --git a/modules/quality/quality.py b/modules/quality/quality.py index c0b3d10153..bc626b1454 100644 --- a/modules/quality/quality.py +++ b/modules/quality/quality.py @@ -830,7 +830,7 @@ class Inspect(Wizard): pool = Pool() Inspection = pool.get('quality.inspection') inspection = self.store.inspections[0] - Inspection.write([inspection], self.inspection._save_values) + Inspection.write([inspection], self.inspection._save_values()) inspection.process() return 'next_' diff --git a/modules/sale/sale.py b/modules/sale/sale.py index 2b2299fcc7..130a1cef22 100644 --- a/modules/sale/sale.py +++ b/modules/sale/sale.py @@ -2411,7 +2411,7 @@ class ModifyHeader(Wizard): Line = pool.get('sale.line') sale = self.get_sale() - values = self.start._save_values + values = self.start._save_values() self.model.write([sale], values) self.model.log([sale], 'write', ','.join(sorted(values.keys()))) diff --git a/modules/web_shop_shopify/web.py b/modules/web_shop_shopify/web.py index be83be7638..b8fc1ce1aa 100644 --- a/modules/web_shop_shopify/web.py +++ b/modules/web_shop_shopify/web.py @@ -566,7 +566,7 @@ class Shop(metaclass=PoolMeta): shop = sale.web_shop with shop.shopify_session(): sale = Sale.get_from_shopify(shop, order, sale=sale) - if sale._changed_values: + if sale._changed_values(): sale.untaxed_amount_cache = None sale.tax_amount_cache = None sale.total_amount_cache = None diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index f62611a247..d718ade873 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Change _changed_values and _save_values properties to method * Add configuration for report convert command * Use process pool to run cron * Lock only running cron record diff --git a/trytond/doc/ref/models.rst b/trytond/doc/ref/models.rst index 3551c5733a..1859fd2173 100644 --- a/trytond/doc/ref/models.rst +++ b/trytond/doc/ref/models.rst @@ -216,6 +216,31 @@ Class methods: Instance methods: +.. method:: ModelView._changed_values() + + Return the values changed since the instantiation. + By default, the value of a field is its internal representation except: + + - for :class:`~trytond.model.fields.Many2One` and + :class:`~trytond.model.fields.One2One` field: the + :attr:`~trytond.model.Model.id`. + + - for :class:`~trytond.model.fields.Reference` field: the string ','. + + - for :class:`~trytond.model.fields.One2Many` and + :class:`~trytond.model.fields.Many2Many`: a dictionary composed of + three keys: + + - ``add``: a list of tuple, the first element is the index where the + new line is added, the second element is default values. + + - ``update``: a list of dictionary of changed values including the + ``id``. + + - ``remove``: a list of ids. + + .. method:: ModelView.on_change(fieldnames) Return the list of changes by calling ``on_change`` method of each field. @@ -523,6 +548,11 @@ Dual methods: Instance methods: +.. method:: ModelStorage._save_values() + + Returns the modified values from the saved one, which can be used with + :meth:`~ModelStorage.create` or :meth:`~ModelStorage.write`. + .. method:: ModelStorage.resources() Return a dictionary with the number of attachments (``attachment_count``), diff --git a/trytond/trytond/model/fields/field.py b/trytond/trytond/model/fields/field.py index ed1b338758..9f6d2a6249 100644 --- a/trytond/trytond/model/fields/field.py +++ b/trytond/trytond/model/fields/field.py @@ -192,7 +192,7 @@ def instantiate_context(field, record): def on_change_result(record): - return record._changed_values + return record._changed_values() def on_change_with_result(fieldname): @@ -201,7 +201,7 @@ def on_change_with_result(fieldname): def wrapper(self, *args, **kwargs): value = func(self, *args, **kwargs) setattr(self, fieldname, value) - return self._changed_values + return self._changed_values() return wrapper return decorator diff --git a/trytond/trytond/model/modelstorage.py b/trytond/trytond/model/modelstorage.py index 606f3cbed8..4b41d7e33c 100644 --- a/trytond/trytond/model/modelstorage.py +++ b/trytond/trytond/model/modelstorage.py @@ -1881,7 +1881,6 @@ class ModelStorage(Model): **{k: v for k, v in data.items() if k not in to_delete}) return value - @property def _save_values(self): values = {} if not self._values: @@ -1923,13 +1922,13 @@ class ModelStorage(Model): t_values = None try: if target.id is None or target.id < 0: - to_create.append(target._save_values) + to_create.append(target._save_values()) else: if target.id in previous: previous.remove(target.id) else: to_add.append(target.id) - target_values = target._save_values + target_values = target._save_values() if target_values: to_write.append( ('write', [target.id], target_values)) @@ -1987,7 +1986,7 @@ class ModelStorage(Model): continue while True: try: - save_values[record] = record._save_values + save_values[record] = record._save_values() break except _UnsavedRecordError as e: warnings.warn( diff --git a/trytond/trytond/model/modelview.py b/trytond/trytond/model/modelview.py index e0d33d1007..8d223b5301 100644 --- a/trytond/trytond/model/modelview.py +++ b/trytond/trytond/model/modelview.py @@ -840,20 +840,7 @@ class ModelView(Model): for r in result] return result - @property def _changed_values(self): - """Return the values changed since the instantiation. - By default, the value of a field is its internal representation except: - - for Many2One and One2One field: the id. - - for Reference field: the string model,id - - for One2Many and Many2Many: a dictionary composed of three keys: - - add: a list of tuple, the first element is the index where - the new line is added, the second element is - `_default_values` - - update: a list of dictionary of `_changed_values` including - the `id` - - remove: a list of ids - """ from .modelstorage import ModelStorage changed = {} init_values = self._init_values or self._record() @@ -905,7 +892,7 @@ class ModelView(Model): if target.id in previous: previous.remove(target.id) if isinstance(target, ModelView): - target_changed = target._changed_values + target_changed = target._changed_values() if target_changed: target_changed['id'] = target.id value['update'].append(target_changed) @@ -916,7 +903,7 @@ class ModelView(Model): target_init_values = target._init_values target._init_values = None try: - added_values = target._changed_values + added_values = target._changed_values() finally: target._init_values = target_init_values else: diff --git a/trytond/trytond/tests/test_modelstorage.py b/trytond/trytond/tests/test_modelstorage.py index 755cdbe9a8..7d515346ed 100644 --- a/trytond/trytond/tests/test_modelstorage.py +++ b/trytond/trytond/tests/test_modelstorage.py @@ -164,7 +164,7 @@ class ModelStorageTestCase(TestCase): record.target = target = Target() with self.assertRaises(_UnsavedRecordError) as cm: - record._save_values + record._save_values() self.assertEqual(cm.exception.record, target) diff --git a/trytond/trytond/tests/test_modelview.py b/trytond/trytond/tests/test_modelview.py index 2ac3459994..d6b45b11c4 100644 --- a/trytond/trytond/tests/test_modelview.py +++ b/trytond/trytond/tests/test_modelview.py @@ -187,7 +187,7 @@ class ModelView(TestCase): record = Model(targets=[], m2m_targets=[], m2m_function=[]) - self.assertEqual(record._changed_values, {}) + self.assertEqual(record._changed_values(), {}) record.name = 'foo' record.target = Target(1) @@ -195,7 +195,7 @@ class ModelView(TestCase): record.targets = [Target(name='bar')] record.multiselection = ['a'] record.dictionary = {'key': 'value'} - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'name': 'foo', 'target': 1, 'ref_target': 'test.modelview.changed_values.target,2', @@ -217,7 +217,7 @@ class ModelView(TestCase): dictionary={'key': 'value'}, ) - self.assertEqual(record._changed_values, {}) + self.assertEqual(record._changed_values(), {}) target = record.targets[0] target.name = 'bar' @@ -229,7 +229,7 @@ class ModelView(TestCase): dico = record.dictionary.copy() dico['key'] = 'another value' record.dictionary = dico - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'targets': { 'update': [{'id': 1, 'name': 'bar'}], 'delete': [2], @@ -244,12 +244,12 @@ class ModelView(TestCase): # change only one2many record record = Model(targets=[{'id': 1, 'name': 'foo'}]) - self.assertEqual(record._changed_values, {}) + self.assertEqual(record._changed_values(), {}) target, = record.targets target.name = 'bar' record.targets = record.targets - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'targets': { 'update': [{'id': 1, 'name': 'bar'}], }, @@ -261,7 +261,7 @@ class ModelView(TestCase): target = Target(id=1) record._values['targets'] = [target] target.name = 'foo' - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'targets': { 'add': [(0, {'id': 1, 'name': 'foo'})], }, @@ -279,7 +279,7 @@ class ModelView(TestCase): record = Model() record.m2m_function = record.on_change_with_m2m_function() - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'm2m_function': {'add': [(0, {'id': 42})]}, }) @@ -299,7 +299,7 @@ class ModelView(TestCase): target1.name = "test" record.targets = [target1, Target(name="baz")] - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'targets': { 'delete': [target2.id], 'update': [{'id': target1.id, 'name': "test"}], @@ -318,7 +318,7 @@ class ModelView(TestCase): record = Model(targets=[target]) Model.targets.remove(record, [target]) - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'targets': { 'remove': [1], }, @@ -335,7 +335,7 @@ class ModelView(TestCase): record = Model(m2m_targets=[target]) Model.m2m_targets.delete(record, [target]) - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'm2m_targets': { 'delete': [1], }, @@ -352,7 +352,7 @@ class ModelView(TestCase): record = Model() record.stored_target = target - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'stored_target': target.id, 'stored_target.': { 'rec_name': "Target", @@ -372,7 +372,7 @@ class ModelView(TestCase): target.name = "Target" record.targets = [target] - self.assertEqual(record._changed_values, { + self.assertEqual(record._changed_values(), { 'name': "Record", 'targets': { 'add': [(0, {'id': None, 'name': "Target"})],