summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-08-19 13:54:40 +0200
committerChristophe Simonis <chs@odoo.com>2019-08-19 13:54:40 +0200
commit1e4de19cd49c005ebe3b14558e8eca6a1f55e72f (patch)
treef53023c576ca37ba7cb9a4bfe533738409f3fe4f
parent855447fc77fdbe2972be043b7ba9131567d21b9f (diff)
parentc43de33643ab8fd7a26b943a3325272fbcda19d2 (diff)
[MERGE] forward port branch saas-15 up to c43de33643a
-rw-r--r--addons/mail/models/mail_thread.py2
-rw-r--r--odoo/addons/test_new_api/ir.model.access.csv1
-rw-r--r--odoo/addons/test_new_api/models.py18
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py5
-rw-r--r--odoo/fields.py12
5 files changed, 33 insertions, 5 deletions
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index 1220026c0b2..0322eeecd27 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -1527,7 +1527,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'))
diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv
index 4db53199c26..a88e202a86d 100644
--- a/odoo/addons/test_new_api/ir.model.access.csv
+++ b/odoo/addons/test_new_api/ir.model.access.csv
@@ -18,3 +18,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
diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py
index 7acc132f1db..5b77d876b1f 100644
--- a/odoo/addons/test_new_api/models.py
+++ b/odoo/addons/test_new_api/models.py
@@ -380,3 +380,21 @@ class ComputeRecursive(models.Model):
rec.display_name = rec.parent.display_name + " / " + rec.name
else:
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 "") \ No newline at end of file
diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py
index 06ca2aa9ee4..343e184e5ca 100644
--- a/odoo/addons/test_new_api/tests/test_new_fields.py
+++ b/odoo/addons/test_new_api/tests/test_new_fields.py
@@ -228,6 +228,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']
diff --git a/odoo/fields.py b/odoo/fields.py
index 04312dd43fe..f86bf938d33 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -661,7 +661,7 @@ class Field(MetaField('DummyField', (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.
"""
@@ -672,11 +672,12 @@ class Field(MetaField('DummyField', (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.items():
@@ -686,11 +687,14 @@ class Field(MetaField('DummyField', (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