[MERGE] forward port branch saas-14 up to fa26279014

This commit is contained in:
Christophe Simonis
2019-08-19 12:51:26 +02:00
5 changed files with 34 additions and 6 deletions
+1 -1
View File
@@ -1508,7 +1508,7 @@ class MailThread(models.AbstractModel):
# Very unusual situation, be we should be fault-tolerant here
message_id = "<%s@localhost>" % time.time()
_logger.debug('Parsing Message without message-id, generating a random one: %s', message_id)
msg_dict['message_id'] = message_id
msg_dict['message_id'] = message_id.strip()
if message.get('Subject'):
msg_dict['subject'] = tools.decode_smtp_header(message.get('Subject'))
@@ -17,3 +17,4 @@ access_test_new_api_company,access_test_new_api_company,model_test_new_api_compa
access_test_new_api_company_attr,access_test_new_api_company_attr,model_test_new_api_company_attr,,1,1,1,1
access_test_new_api_compute_inverse,access_test_new_api_compute_inverse,model_test_new_api_compute_inverse,,1,1,1,1
access_test_new_api_recursive,access_test_new_api_recursive,model_test_new_api_recursive,,1,1,1,1
access_test_new_api_cascade,access_test_new_api_cascade,model_test_new_api_cascade,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
17 access_test_new_api_company_attr access_test_new_api_company_attr model_test_new_api_company_attr 1 1 1 1
18 access_test_new_api_compute_inverse access_test_new_api_compute_inverse model_test_new_api_compute_inverse 1 1 1 1
19 access_test_new_api_recursive access_test_new_api_recursive model_test_new_api_recursive 1 1 1 1
20 access_test_new_api_cascade access_test_new_api_cascade model_test_new_api_cascade 1 1 1 1
+19 -1
View File
@@ -364,4 +364,22 @@ class ComputeRecursive(models.Model):
if rec.parent:
rec.display_name = rec.parent.display_name + " / " + rec.name
else:
rec.display_name = rec.name
rec.display_name = rec.name
class ComputeCascade(models.Model):
_name = 'test_new_api.cascade'
foo = fields.Char()
bar = fields.Char(compute='_compute_bar') # depends on foo
baz = fields.Char(compute='_compute_baz', store=True) # depends on bar
@api.depends('foo')
def _compute_bar(self):
for record in self:
record.bar = "[%s]" % (record.foo or "")
@api.depends('bar')
def _compute_baz(self):
for record in self:
record.baz = "<%s>" % (record.bar or "")
@@ -223,6 +223,11 @@ class TestFields(common.TransactionCase):
double_size = message.double_size
self.assertEqual(double_size, message.size)
record = self.env['test_new_api.cascade'].create({'foo': "Hi"})
self.assertEqual(record.baz, "<[Hi]>")
record.foo = "Ho"
self.assertEqual(record.baz, "<[Ho]>")
def test_13_inverse(self):
""" test inverse computation of fields """
Category = self.env['test_new_api.category']
+8 -4
View File
@@ -686,7 +686,7 @@ class Field(object):
# on ``path``. See method ``modified`` below for details.
#
def resolve_deps(self, model):
def resolve_deps(self, model, path0=[], seen=frozenset()):
""" Return the dependencies of ``self`` as tuples ``(model, field, path)``,
where ``path`` is an optional list of field names.
"""
@@ -697,11 +697,12 @@ class Field(object):
for dotnames in self.depends:
if dotnames == self.name:
_logger.warning("Field %s depends on itself; please fix its decorator @api.depends().", self)
model, path = model0, dotnames.split('.')
for i, fname in enumerate(path):
model, path = model0, path0
for fname in dotnames.split('.'):
field = model._fields[fname]
result.append((model, field, path[:i]))
result.append((model, field, path))
model = model0.env.get(field.comodel_name)
path = None if path is None else path + [fname]
# add self's model dependencies
for mname, fnames in model0._depends.iteritems():
@@ -711,11 +712,14 @@ class Field(object):
result.append((model, field, None))
# add indirect dependencies from the dependencies found above
seen = seen.union([self])
for model, field, path in list(result):
for inv_field in model._field_inverses[field]:
inv_model = model0.env[inv_field.model_name]
inv_path = None if path is None else path + [field.name]
result.append((inv_model, inv_field, inv_path))
if not field.store and field not in seen:
result += field.resolve_deps(model, path, seen)
return result