[FIX] models: callable in api.depends() sees valid _rec_name
Determine `model._rec_name` before the dependencies of the fields. The compute method of the automatic field `display_name` uses a callable depends that retrieves `model._rec_name`. closes odoo/odoo#36476 Signed-off-by: Christophe Simonis <chs@odoo.com>
This commit is contained in:
@@ -80,6 +80,13 @@ class TestFields(common.TransactionCase):
|
||||
field = self.env['test_new_api.message']._fields['x_bool_false_computed']
|
||||
self.assertFalse(field.depends)
|
||||
|
||||
def test_10_display_name(self):
|
||||
""" test definition of automatic field 'display_name' """
|
||||
field = type(self.env['test_new_api.discussion']).display_name
|
||||
self.assertTrue(field.automatic)
|
||||
self.assertTrue(field.compute)
|
||||
self.assertEqual(field.depends, ('name',))
|
||||
|
||||
def test_10_non_stored(self):
|
||||
""" test non-stored fields """
|
||||
# a field declared with store=False should not have a column
|
||||
|
||||
+6
-6
@@ -490,6 +490,10 @@ class Field(MetaField('DummyField', (object,), {})):
|
||||
|
||||
def _setup_regular_base(self, model):
|
||||
""" Setup the attributes of a non-related field. """
|
||||
pass
|
||||
|
||||
def _setup_regular_full(self, model):
|
||||
""" Determine the dependencies and inverse field(s) of ``self``. """
|
||||
if self.depends is not None:
|
||||
return
|
||||
|
||||
@@ -507,10 +511,6 @@ class Field(MetaField('DummyField', (object,), {})):
|
||||
else:
|
||||
self.depends = tuple(get_depends(self.compute))
|
||||
|
||||
def _setup_regular_full(self, model):
|
||||
""" Setup the inverse field(s) of ``self``. """
|
||||
pass
|
||||
|
||||
#
|
||||
# Setup of related fields
|
||||
#
|
||||
@@ -2428,8 +2428,8 @@ class _RelationalMulti(_Relational):
|
||||
for record in records:
|
||||
record[self.name] = record[self.name].filtered(accessible)
|
||||
|
||||
def _setup_regular_base(self, model):
|
||||
super(_RelationalMulti, self)._setup_regular_base(model)
|
||||
def _setup_regular_full(self, model):
|
||||
super(_RelationalMulti, self)._setup_regular_full(model)
|
||||
if isinstance(self.domain, list):
|
||||
self.depends += tuple(
|
||||
self.name + '.' + arg[0]
|
||||
|
||||
+15
-9
@@ -2622,6 +2622,15 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
|
||||
cls._setup_done = True
|
||||
|
||||
# 5. determine and validate rec_name
|
||||
if cls._rec_name:
|
||||
assert cls._rec_name in cls._fields, \
|
||||
"Invalid rec_name %s for model %s" % (cls._rec_name, cls._name)
|
||||
elif 'name' in cls._fields:
|
||||
cls._rec_name = 'name'
|
||||
elif 'x_name' in cls._fields:
|
||||
cls._rec_name = 'x_name'
|
||||
|
||||
@api.model
|
||||
def _setup_fields(self):
|
||||
""" Setup the fields, except for recomputation triggers. """
|
||||
@@ -2646,6 +2655,12 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
del cls._fields[name]
|
||||
delattr(cls, name)
|
||||
|
||||
# fix up _rec_name
|
||||
if 'x_name' in bad_fields and cls._rec_name == 'x_name':
|
||||
cls._rec_name = None
|
||||
field = cls._fields['display_name']
|
||||
field.depends = tuple(name for name in field.depends if name != 'x_name')
|
||||
|
||||
# map each field to the fields computed with the same method
|
||||
groups = defaultdict(list)
|
||||
for field in cls._fields.values():
|
||||
@@ -2674,15 +2689,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
# register constraints and onchange methods
|
||||
cls._init_constraints_onchanges()
|
||||
|
||||
# validate rec_name
|
||||
if cls._rec_name:
|
||||
assert cls._rec_name in cls._fields, \
|
||||
"Invalid rec_name %s for model %s" % (cls._rec_name, cls._name)
|
||||
elif 'name' in cls._fields:
|
||||
cls._rec_name = 'name'
|
||||
elif 'x_name' in cls._fields:
|
||||
cls._rec_name = 'x_name'
|
||||
|
||||
@api.model
|
||||
def fields_get(self, allfields=None, attributes=None):
|
||||
""" fields_get([fields][, attributes])
|
||||
|
||||
Reference in New Issue
Block a user