Recursively set values on record for xxx2Many fields

The values for wizard may be a list of dictionaries for xxx2many fields.

Closes #14055
This commit is contained in:
Cédric Krier
2025-07-11 23:14:50 +02:00
parent 549370459d
commit d5e92b91d9
+10 -7
View File
@@ -974,8 +974,7 @@ class Model(object):
fields = [x for x, y in self._fields.items()
if y['loading'] == 'eager']
fields.append('_timestamp')
self._values.update(
self._proxy.read([self.id], fields, self._context)[0])
self._set(self._proxy.read([self.id], fields, self._context)[0])
def _default_get(self):
'Set default values'
@@ -983,13 +982,13 @@ class Model(object):
self._default_set(
self._proxy.default_get(fields, False, self._context))
def _default_set(self, values):
def _set(self, values, _default=False):
fieldnames = []
for field, value in values.items():
if '.' in field:
continue
definition = self._fields[field]
if definition['type'] in ('one2many', 'many2many'):
if ((definition := self._fields.get(field))
and definition['type'] in {'one2many', 'many2many'}):
if value and len(value) and isinstance(value[0], int):
self._values[field] = value
else:
@@ -998,13 +997,17 @@ class Model(object):
definition, [], self, field)
for vals in (value or []):
record = Relation()
record._default_set(vals)
record._set(vals, _default=_default)
records.append(record)
else:
self._values[field] = value
fieldnames.append(field)
if _default:
self._on_change(sorted(fieldnames))
def _default_set(self, values):
return self._set(values, _default=True)
def _get_eval(self):
values = dict((x, getattr(self, '__%s_eval' % x))
for x in self._fields if x != 'id')
@@ -1259,7 +1262,7 @@ class Wizard(object):
if 'defaults' in view:
self.form._default_set(view['defaults'])
if 'values' in view:
self.form._values.update(view['values'])
self.form._set(view['values'])
self.states = [b['state'] for b in view['buttons']]
self.form_state = view['state']
else: