diff --git a/addons/mail/models/mail_mail.py b/addons/mail/models/mail_mail.py
index 752ac2b0744..8750641682b 100644
--- a/addons/mail/models/mail_mail.py
+++ b/addons/mail/models/mail_mail.py
@@ -148,6 +148,7 @@ class MailMail(models.Model):
if notif_emails:
notifications = self.env['mail.notification'].search([
('mail_message_id', 'in', notif_emails.mapped('mail_message_id').ids),
+ ('res_partner_id', 'in', notif_emails.mapped('recipient_ids').ids),
('is_email', '=', True)])
if mail_sent:
notifications.write({
@@ -322,6 +323,7 @@ class MailMail(models.Model):
notifs = self.env['mail.notification'].search([
('is_email', '=', True),
('mail_message_id', 'in', mail.mapped('mail_message_id').ids),
+ ('res_partner_id', 'in', mail.mapped('recipient_ids').ids),
('email_status', 'not in', ('sent', 'canceled'))
])
if notifs:
diff --git a/odoo/addons/test_convert/__init__.py b/odoo/addons/test_convert/__init__.py
index e69de29bb2d..0650744f6bc 100644
--- a/odoo/addons/test_convert/__init__.py
+++ b/odoo/addons/test_convert/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/odoo/addons/test_convert/__manifest__.py b/odoo/addons/test_convert/__manifest__.py
index af6cd1af6e4..a9c67447615 100644
--- a/odoo/addons/test_convert/__manifest__.py
+++ b/odoo/addons/test_convert/__manifest__.py
@@ -5,4 +5,5 @@
'name': 'test_convert',
'description': "Data for xml conversion tests",
'version': '0.0.1',
+ 'data': ['ir.model.access.csv'],
}
diff --git a/odoo/addons/test_convert/ir.model.access.csv b/odoo/addons/test_convert/ir.model.access.csv
new file mode 100644
index 00000000000..014e4d1c827
--- /dev/null
+++ b/odoo/addons/test_convert/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_test_convert_test_model,access_test_convert_test_model,model_test_convert_test_model,,1,1,1,1
\ No newline at end of file
diff --git a/odoo/addons/test_convert/models.py b/odoo/addons/test_convert/models.py
new file mode 100644
index 00000000000..0f059e56e86
--- /dev/null
+++ b/odoo/addons/test_convert/models.py
@@ -0,0 +1,16 @@
+from odoo import api, models
+
+class TestModel(models.Model):
+ _name = 'test_convert.test_model'
+
+ @api.model
+ def action_test_date(self, today_date):
+ return True
+
+ @api.model
+ def action_test_time(self, cur_time):
+ return True
+
+ @api.model
+ def action_test_timezone(self, timezone):
+ return True
diff --git a/odoo/addons/test_convert/tests/test_convert.py b/odoo/addons/test_convert/tests/test_convert.py
index e81526dd43c..1bb79619c21 100644
--- a/odoo/addons/test_convert/tests/test_convert.py
+++ b/odoo/addons/test_convert/tests/test_convert.py
@@ -4,8 +4,10 @@
import collections
import unittest
+from lxml import etree as ET
from lxml.builder import E
+import odoo
from odoo.tests import common
from odoo.tools.convert import _eval_xml
@@ -16,6 +18,25 @@ class TestEvalXML(common.TransactionCase):
def eval_xml(self, node, obj=None):
return _eval_xml(obj, node, self.env)
+ def test_function_eval(self):
+ def id_get(): pass
+ Obj = collections.namedtuple('Obj', ['module', 'idref', 'id_get'])
+ obj = Obj('test_convert', {}, id_get)
+
+ try:
+ test_datetime = ET.XML("")
+ self.eval_xml(node=test_datetime, obj=obj)
+ test_time = ET.XML("")
+ self.eval_xml(node=test_time, obj=obj)
+ test_timedelta = ET.XML("")
+ self.eval_xml(node=test_timedelta, obj=obj)
+ test_relativedelta = ET.XML("")
+ self.eval_xml(node=test_relativedelta, obj=obj)
+ test_timezone = ET.XML("")
+ self.eval_xml(node=test_timezone, obj=obj)
+ except ValueError as e:
+ self.fail(e.message)
+
def test_char(self):
self.assertEqual(
self.eval_xml(Field("foo")),
diff --git a/odoo/tools/convert.py b/odoo/tools/convert.py
index c2c25f55fad..13ef5bb5d99 100644
--- a/odoo/tools/convert.py
+++ b/odoo/tools/convert.py
@@ -177,15 +177,16 @@ def _eval_xml(self, node, env):
elif node.tag == "function":
args = []
a_eval = node.get('eval','')
+ model_str = node.get('model', '')
# FIXME: should probably be exclusive
if a_eval:
- self.idref['ref'] = self.id_get
- args = safe_eval(a_eval, self.idref)
+ idref2 = _get_idref(self, env, model_str, self.idref)
+ args = safe_eval(a_eval, idref2)
for n in node:
return_val = _eval_xml(self, n, env)
if return_val is not None:
args.append(return_val)
- model = env[node.get('model', '')]
+ model = env[model_str]
method = node.get('name')
# this one still depends on the old API
return odoo.api.call_kw(model, method, args, {})