Change _changed_values and _save_values properties to method

Closes #13317
This commit is contained in:
Cédric Krier
2024-06-09 19:54:52 +02:00
parent 95f9a21426
commit 575d1d0132
11 changed files with 56 additions and 39 deletions
+1 -1
View File
@@ -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())))
+1 -1
View File
@@ -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_'
+1 -1
View File
@@ -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())))
+1 -1
View File
@@ -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
+1
View File
@@ -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
+30
View File
@@ -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 '<model
name>,<record id>'.
- 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``),
+2 -2
View File
@@ -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
+3 -4
View File
@@ -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(
+2 -15
View File
@@ -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:
+1 -1
View File
@@ -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)
+13 -13
View File
@@ -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"})],