summaryrefslogtreecommitdiff
path: root/addons/test_mail
diff options
context:
space:
mode:
authorKevin Baptiste <kba@odoo.com>2019-10-18 11:43:32 +0000
committerKevin Baptiste <kba@odoo.com>2019-11-19 07:50:34 +0000
commit2c6cd81f30a991fd21b0f93fe41ed25736943e79 (patch)
tree2f1489c17f823e44ce3cd38bb70ad53de7652d15 /addons/test_mail
parentabd9d1506ea4af29a98278c4cbd514e2cf4c54f3 (diff)
[IMP] mail: track fields based on ir_model_fields
The tracked field is now a relation to the corresponding ir.model.field. This prevents potential privacy issues should the field be deleted or renamed. closes odoo/odoo#39232 Taskid: 2088634 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
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.py2
-rw-r--r--addons/test_mail/tests/test_message_track.py1
-rw-r--r--addons/test_mail/tests/test_performance.py29
5 files changed, 41 insertions, 3 deletions
diff --git a/addons/test_mail/models/test_mail_models.py b/addons/test_mail/models/test_mail_models.py
index e9c0eaa81f3..e84c6d3ee5e 100644
--- a/addons/test_mail/models/test_mail_models.py
+++ b/addons/test_mail/models/test_mail_models.py
@@ -159,3 +159,14 @@ class MailMultiCompany(models.Model):
name = fields.Char()
company_id = fields.Many2one('res.company')
+
+
+class MailTrackingModel(models.Model):
+ _description = 'Test Tracking Model'
+ _name = 'mail.test.tracking'
+ _inherit = ['mail.thread']
+
+ name = fields.Char(required=True, tracking=True)
+ field_0 = fields.Char(tracking=True)
+ field_1 = fields.Char(tracking=True)
+ field_2 = fields.Char(tracking=True)
diff --git a/addons/test_mail/security/ir.model.access.csv b/addons/test_mail/security/ir.model.access.csv
index 90b56e67703..2753e2fbd72 100644
--- a/addons/test_mail/security/ir.model.access.csv
+++ b/addons/test_mail/security/ir.model.access.csv
@@ -16,3 +16,4 @@ access_mail_test_cc_portal,mail.test.cc.portal,model_mail_test_cc,base.group_por
access_mail_test_cc_user,mail.test.cc.user,model_mail_test_cc,base.group_user,1,1,1,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
diff --git a/addons/test_mail/tests/common.py b/addons/test_mail/tests/common.py
index d73a091b7b2..bda876d61ef 100644
--- a/addons/test_mail/tests/common.py
+++ b/addons/test_mail/tests/common.py
@@ -176,7 +176,7 @@ class BaseFunctionalTest(common.SavepointCase):
def assertTracking(self, message, data):
tracking_values = message.sudo().tracking_value_ids
for field_name, value_type, old_value, new_value in data:
- tracking = tracking_values.filtered(lambda track: track.field == field_name)
+ tracking = tracking_values.filtered(lambda track: track.field.name == field_name)
self.assertEqual(len(tracking), 1)
if value_type in ('char', 'integer'):
self.assertEqual(tracking.old_value_char, old_value)
diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py
index c4482be9e9d..05f375e3b3b 100644
--- a/addons/test_mail/tests/test_message_track.py
+++ b/addons/test_mail/tests/test_message_track.py
@@ -162,6 +162,7 @@ class TestTracking(common.BaseFunctionalTest, common.MockEmails):
def test_unlinked_field(self):
record_sudo = self.record.sudo()
record_sudo.write({'email_from': 'X'}) # create a tracking value
+ record_sudo.flush()
self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1)
ir_model_field = self.env['ir.model.fields'].search([
('model', '=', 'mail.test.full'),
diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py
index c26fe1a81f4..d4a32557eff 100644
--- a/addons/test_mail/tests/test_performance.py
+++ b/addons/test_mail/tests/test_performance.py
@@ -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__=86, emp=87):
+ with self.assertQueryCount(__system__=87, emp=88):
rec.write({
'name': 'Test2',
'umbrella_id': self.umbrella.id,
@@ -646,13 +646,14 @@ 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__=94, emp=95):
+ with self.assertQueryCount(__system__=95, 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'))
@@ -837,3 +838,27 @@ class TestMailHeavyPerformancePost(BaseMailPerformance):
self.assertEqual(self.attachements.mapped('res_model'), [record._name for i in range(3)])
self.assertEqual(self.attachements.mapped('res_id'), [record.id for i in range(3)])
# self.assertEqual(record.message_ids[0].notified_partner_ids, [])
+
+
+@tagged('mail_performance')
+class TestTrackingPerformance(BaseMailPerformance):
+
+ @users('__system__', 'demo')
+ @warmup
+ def test_tracking_multiple_fields(self):
+ """ Check that tracking multiple fields is scalable """
+
+ record = self.env['mail.test.tracking'].create({'name': 'Zizizatestname'})
+ with self.assertQueryCount(__system__=3, demo=3):
+ record.write({'name': 'Zizizanewtestname'})
+ record.flush()
+
+ with self.assertQueryCount(__system__=5, demo=5):
+ record.write({'field_%s' % (i): 'Tracked Char Fields %s' % (i) for i in range(3)})
+ record.flush()
+
+ with self.assertQueryCount(__system__=10, demo=10):
+ record.write({'field_%s' % (i): 'Field Without Cache %s' % (i) for i in range(3)})
+ record.flush()
+ record.write({'field_%s' % (i): 'Field With Cache %s' % (i) for i in range(3)})
+ record.flush()