summaryrefslogtreecommitdiff
path: root/addons/test_mail
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2019-11-26 09:27:50 +0000
committerRaphael Collet <rco@odoo.com>2020-02-05 15:14:58 +0000
commit020e2a5e85036976b309b439582d70b5b775e54f (patch)
tree92717dfde8fb3e84e546aaf290a485ff9de6816c /addons/test_mail
parent0bd14547a7f6389192f522da08527a2c8a13f1a8 (diff)
[IMP] mail: add tracking on computed stored fields
Also delay the tracking until pre-commit, so that several updates on a record generate a single tracking message.
Diffstat (limited to 'addons/test_mail')
-rw-r--r--addons/test_mail/models/test_mail_models.py11
-rw-r--r--addons/test_mail/security/ir.model.access.csv1
-rw-r--r--addons/test_mail/tests/common.py5
-rw-r--r--addons/test_mail/tests/test_discuss.py9
-rw-r--r--addons/test_mail/tests/test_message_track.py81
-rw-r--r--addons/test_mail/tests/test_performance.py11
6 files changed, 111 insertions, 7 deletions
diff --git a/addons/test_mail/models/test_mail_models.py b/addons/test_mail/models/test_mail_models.py
index e84c6d3ee5e..340bcbcb9c5 100644
--- a/addons/test_mail/models/test_mail_models.py
+++ b/addons/test_mail/models/test_mail_models.py
@@ -170,3 +170,14 @@ class MailTrackingModel(models.Model):
field_0 = fields.Char(tracking=True)
field_1 = fields.Char(tracking=True)
field_2 = fields.Char(tracking=True)
+
+
+class MailCompute(models.Model):
+ _name = 'mail.test.compute'
+ _description = "Test model with several tracked computed fields"
+ _inherit = ['mail.thread']
+
+ partner_id = fields.Many2one('res.partner', tracking=True)
+ partner_name = fields.Char(related='partner_id.name', store=True, tracking=True)
+ partner_email = fields.Char(related='partner_id.email', store=True, tracking=True)
+ partner_phone = fields.Char(related='partner_id.phone', tracking=True)
diff --git a/addons/test_mail/security/ir.model.access.csv b/addons/test_mail/security/ir.model.access.csv
index 2753e2fbd72..95a4e84e98e 100644
--- a/addons/test_mail/security/ir.model.access.csv
+++ b/addons/test_mail/security/ir.model.access.csv
@@ -17,3 +17,4 @@ access_mail_test_cc_user,mail.test.cc.user,model_mail_test_cc,base.group_user,1,
access_mail_test_multi_company_user,mail.test.multi.company.user,model_mail_test_multi_company,base.group_user,1,1,1,1
access_mail_test_multi_company_portal,mail.test.multi.company.portal,model_mail_test_multi_company,base.group_portal,1,0,0,0
access_mail_test_tracking_user,mail.test.tracking,model_mail_test_tracking,base.group_user,1,1,1,1
+access_mail_test_compute,mail.test.compute,model_mail_test_compute,base.group_user,1,1,1,1
diff --git a/addons/test_mail/tests/common.py b/addons/test_mail/tests/common.py
index d7e63584814..77cef2ce183 100644
--- a/addons/test_mail/tests/common.py
+++ b/addons/test_mail/tests/common.py
@@ -52,6 +52,11 @@ class TestMailCommon(common.SavepointCase, mail_common.MailCase):
cls.email_template = cls.env['mail.template'].create(create_values)
return cls.email_template
+ def flush_tracking(self):
+ """ Force the creation of tracking values. """
+ self.env['base'].flush()
+ self.cr.precommit()
+
class TestMailMultiCompanyCommon(TestMailCommon):
diff --git a/addons/test_mail/tests/test_discuss.py b/addons/test_mail/tests/test_discuss.py
index e2bda7dc8d9..86b9a7de0cb 100644
--- a/addons/test_mail/tests/test_discuss.py
+++ b/addons/test_mail/tests/test_discuss.py
@@ -38,24 +38,29 @@ class TestChatterTweaks(TestMailCommon, TestRecipients):
def test_chatter_mail_create_nolog(self):
""" Test disable of automatic chatter message at create """
rec = self.env['mail.test.simple'].with_user(self.user_employee).with_context({'mail_create_nolog': True}).create({'name': 'Test'})
+ self.flush_tracking()
self.assertEqual(rec.message_ids, self.env['mail.message'])
rec = self.env['mail.test.simple'].with_user(self.user_employee).with_context({'mail_create_nolog': False}).create({'name': 'Test'})
+ self.flush_tracking()
self.assertEqual(len(rec.message_ids), 1)
def test_chatter_mail_notrack(self):
""" Test disable of automatic value tracking at create and write """
rec = self.env['mail.test.track'].with_user(self.user_employee).create({'name': 'Test', 'user_id': self.user_employee.id})
+ self.flush_tracking()
self.assertEqual(len(rec.message_ids), 1,
"A creation message without tracking values should have been posted")
self.assertEqual(len(rec.message_ids.sudo().tracking_value_ids), 0,
"A creation message without tracking values should have been posted")
rec.with_context({'mail_notrack': True}).write({'user_id': self.user_admin.id})
+ self.flush_tracking()
self.assertEqual(len(rec.message_ids), 1,
"No new message should have been posted with mail_notrack key")
rec.with_context({'mail_notrack': False}).write({'user_id': self.user_employee.id})
+ self.flush_tracking()
self.assertEqual(len(rec.message_ids), 2,
"A tracking message should have been posted")
self.assertEqual(len(rec.message_ids.sudo().mapped('tracking_value_ids')), 1,
@@ -64,16 +69,20 @@ class TestChatterTweaks(TestMailCommon, TestRecipients):
def test_chatter_tracking_disable(self):
""" Test disable of all chatter features at create and write """
rec = self.env['mail.test.track'].with_user(self.user_employee).with_context({'tracking_disable': True}).create({'name': 'Test', 'user_id': self.user_employee.id})
+ self.flush_tracking()
self.assertEqual(rec.sudo().message_ids, self.env['mail.message'])
self.assertEqual(rec.sudo().mapped('message_ids.tracking_value_ids'), self.env['mail.tracking.value'])
rec.write({'user_id': self.user_admin.id})
+ self.flush_tracking()
self.assertEqual(rec.sudo().mapped('message_ids.tracking_value_ids'), self.env['mail.tracking.value'])
rec.with_context({'tracking_disable': False}).write({'user_id': self.user_employee.id})
+ self.flush_tracking()
self.assertEqual(len(rec.sudo().mapped('message_ids.tracking_value_ids')), 1)
rec = self.env['mail.test.track'].with_user(self.user_employee).with_context({'tracking_disable': False}).create({'name': 'Test', 'user_id': self.user_employee.id})
+ self.flush_tracking()
self.assertEqual(len(rec.sudo().message_ids), 1,
"Creation message without tracking values should have been posted")
self.assertEqual(len(rec.sudo().mapped('message_ids.tracking_value_ids')), 0,
diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py
index 1c5d19aded4..20ee3d74c4b 100644
--- a/addons/test_mail/tests/test_message_track.py
+++ b/addons/test_mail/tests/test_message_track.py
@@ -14,6 +14,7 @@ class TestTracking(TestMailCommon):
record = self.env['mail.test.full'].with_user(self.user_employee).with_context(self._test_context).create({
'name': 'Test',
})
+ self.flush_tracking()
self.record = record.with_context(mail_notrack=False)
def test_message_track_no_tracking(self):
@@ -22,6 +23,7 @@ class TestTracking(TestMailCommon):
'name': 'Tracking or not',
'count': 32,
})
+ self.flush_tracking()
self.assertEqual(self.record.message_ids, self.env['mail.message'])
def test_message_track_no_subtype(self):
@@ -32,6 +34,7 @@ class TestTracking(TestMailCommon):
'name': 'Test2',
'customer_id': customer.id,
})
+ self.flush_tracking()
# one new message containing tracking; without subtype linked to tracking, a note is generated
self.assertEqual(len(self.record.message_ids), 1)
@@ -61,6 +64,7 @@ class TestTracking(TestMailCommon):
'email_from': 'noone@example.com',
'umbrella_id': umbrella.id,
})
+ self.flush_tracking()
# one new message containing tracking; subtype linked to tracking
self.assertEqual(len(self.record.message_ids), 1)
self.assertEqual(self.record.message_ids.subtype_id, self.env.ref('test_mail.st_mail_test_full_umbrella_upd'))
@@ -85,6 +89,7 @@ class TestTracking(TestMailCommon):
'name': 'Test2',
'customer_id': self.user_admin.partner_id.id,
})
+ self.flush_tracking()
self.assertEqual(len(self.record.message_ids), 2, 'should have 2 new messages: one for tracking, one for template')
@@ -113,6 +118,7 @@ class TestTracking(TestMailCommon):
'customer_id': self.user_admin.partner_id.id,
'mail_template': self.env.ref('test_mail.mail_test_full_tracking_tpl').id,
})
+ self.flush_tracking()
self.assertEqual(len(record.message_ids), 1, 'should have 1 new messages for template')
# one new message containing the template linked to tracking
@@ -129,6 +135,7 @@ class TestTracking(TestMailCommon):
'user_id': self.user_admin.id,
'umbrella_id': self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'}).id
})
+ self.flush_tracking()
self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message')
tracking_values = self.env['mail.tracking.value'].search([('mail_message_id', '=', self.record.message_ids.id)])
@@ -143,6 +150,7 @@ class TestTracking(TestMailCommon):
field.groups = 'base.group_erp_manager'
self.record.sudo().write({'email_from': 'X'})
+ self.flush_tracking()
msg_emp = self.record.message_ids.message_format()
msg_sudo = self.record.sudo().message_ids.message_format()
@@ -156,6 +164,7 @@ class TestTracking(TestMailCommon):
field.groups = 'base.group_erp_manager'
self.record.sudo().write({'email_from': 'X'})
+ self.flush_tracking()
msg_emp = self.record._notify_prepare_template_context(self.record.message_ids, {})
msg_sudo = self.record.sudo()._notify_prepare_template_context(self.record.message_ids, {})
@@ -165,7 +174,7 @@ class TestTracking(TestMailCommon):
def test_unlinked_field(self):
record_sudo = self.record.sudo()
record_sudo.write({'email_from': 'X'}) # create a tracking value
- record_sudo.flush()
+ self.flush_tracking()
self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1)
ir_model_field = self.env['ir.model.fields'].search([
('model', '=', 'mail.test.full'),
@@ -202,6 +211,7 @@ class TestTracking(TestMailCommon):
'company_id': company1.id,
'user_id': self.env.user.id, # trigger track template
})
+ self.flush_tracking()
new_partner = Partner.search([('email', '=', email_new_partner)])
self.assertTrue(new_partner)
@@ -255,3 +265,72 @@ class TestTracking(TestMailCommon):
'description': 'Zizizatestmaildescription',
})
test_mail_record.with_context(default_parent_id=2147483647).write({'name': magic_code})
+
+ def test_message_track_multiple(self):
+ """ check that multiple updates generate a single tracking message """
+ umbrella = self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'})
+ self.record.name = 'Zboub'
+ self.record.customer_id = self.user_admin.partner_id
+ self.record.user_id = self.user_admin
+ self.record.umbrella_id = umbrella
+ self.flush_tracking()
+
+ # should have a single message with all tracked fields
+ self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message')
+ self.assertTracking(self.record.message_ids[0], [
+ ('customer_id', 'many2one', False, self.user_admin.partner_id),
+ ('user_id', 'many2one', False, self.user_admin),
+ ('umbrella_id', 'many2one', False, umbrella),
+ ])
+
+ def test_tracked_compute(self):
+ # no tracking at creation
+ record = self.env['mail.test.compute'].create({})
+ self.flush_tracking()
+ self.assertEqual(len(record.message_ids), 1)
+ self.assertEqual(len(record.message_ids[0].tracking_value_ids), 0)
+
+ # assign partner_id: one tracking message for the modified field and all
+ # the stored and non-stored computed fields on the record
+ partner = self.env['res.partner'].create({
+ 'name': 'Foo',
+ 'email': 'foo@example.com',
+ 'phone': '1234567890',
+ })
+ record.partner_id = partner
+ self.flush_tracking()
+ self.assertEqual(len(record.message_ids), 2)
+ self.assertEqual(len(record.message_ids[0].tracking_value_ids), 4)
+ self.assertTracking(record.message_ids[0], [
+ ('partner_id', 'many2one', False, partner),
+ ('partner_name', 'char', False, 'Foo'),
+ ('partner_email', 'char', False, 'foo@example.com'),
+ ('partner_phone', 'char', False, '1234567890'),
+ ])
+
+ # modify partner: one tracking message for the only recomputed field
+ partner.write({'name': 'Fool'})
+ self.flush_tracking()
+ self.assertEqual(len(record.message_ids), 3)
+ self.assertEqual(len(record.message_ids[0].tracking_value_ids), 1)
+ self.assertTracking(record.message_ids[0], [
+ ('partner_name', 'char', 'Foo', 'Fool'),
+ ])
+
+ # modify partner: one tracking message for both stored computed fields;
+ # the non-stored computed fields have no tracking
+ partner.write({
+ 'name': 'Bar',
+ 'email': 'bar@example.com',
+ 'phone': '0987654321',
+ })
+ # force recomputation of 'partner_phone' to make sure it does not
+ # generate tracking values
+ self.assertEqual(record.partner_phone, '0987654321')
+ self.flush_tracking()
+ self.assertEqual(len(record.message_ids), 4)
+ self.assertEqual(len(record.message_ids[0].tracking_value_ids), 2)
+ self.assertTracking(record.message_ids[0], [
+ ('partner_name', 'char', 'Fool', 'Bar'),
+ ('partner_email', 'char', 'foo@example.com', 'bar@example.com'),
+ ])
diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py
index 79058b69b6a..d9a722ed63b 100644
--- a/addons/test_mail/tests/test_performance.py
+++ b/addons/test_mail/tests/test_performance.py
@@ -560,7 +560,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
})
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id)
- with self.assertQueryCount(__system__=39, emp=40):
+ with self.assertQueryCount(__system__=40, emp=41):
rec.write({'user_id': self.user_portal.id})
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
# write tracking message
@@ -580,7 +580,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
customer_id = self.customer.id
user_id = self.user_portal.id
- with self.assertQueryCount(__system__=123, emp=124):
+ with self.assertQueryCount(__system__=121, emp=122):
rec = self.env['mail.test.full'].create({
'name': 'Test',
'umbrella_id': umbrella_id,
@@ -609,7 +609,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
self.assertEqual(len(rec1.message_ids), 1)
- with self.assertQueryCount(__system__=87, emp=88):
+ with self.assertQueryCount(__system__=87, emp=87):
rec.write({
'name': 'Test2',
'umbrella_id': self.umbrella.id,
@@ -646,14 +646,13 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
- with self.assertQueryCount(__system__=95, emp=96):
+ with self.assertQueryCount(__system__=96, emp=96):
rec.write({
'name': 'Test2',
'umbrella_id': umbrella_id,
'customer_id': customer_id,
})
-
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
# write tracking message
self.assertEqual(rec1.message_ids[0].subtype_id, self.env.ref('test_mail.st_mail_test_full_umbrella_upd'))
@@ -680,7 +679,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
- with self.assertQueryCount(__system__=34, emp=36):
+ with self.assertQueryCount(__system__=35, emp=36):
rec.write({
'name': 'Test2',
'customer_id': customer_id,