diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index ba652d9ce48..8b7522afa61 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -63,7 +63,8 @@ class MailThread(models.AbstractModel): _mail_post_access = 'write' # access required on the document to post on it _mail_mass_mailing = False # enable mass mailing on this model - message_is_follower = fields.Boolean('Is Follower', compute='_compute_is_follower') + message_is_follower = fields.Boolean( + 'Is Follower', compute='_compute_is_follower', search='_search_is_follower') message_follower_ids = fields.One2many( 'mail.followers', 'res_id', string='Followers', domain=lambda self: [('res_model', '=', self._name)]) @@ -135,6 +136,18 @@ class MailThread(models.AbstractModel): for record in self: record.message_is_follower = record.id in following_ids + @api.model + def _search_is_follower(self, operator, operand): + followers = self.env['mail.followers'].sudo().search([ + ('res_model', '=', self._name), + ('partner_id', '=', self.env.user.partner_id.id), + ]) + # Cases ('message_is_follower', '=', True) or ('message_is_follower', '!=', False) + if (operator == '=' and operand) or (operator == '!=' and not operand): + return [('id', 'in', followers.mapped('res_id'))] + else: + return [('id', 'not in', followers.mapped('res_id'))] + @api.multi def _get_message_unread(self): res = dict((res_id, 0) for res_id in self.ids) diff --git a/addons/mail/tests/test_mail_followers.py b/addons/mail/tests/test_mail_followers.py index 3342dcced8b..d987feb59e7 100644 --- a/addons/mail/tests/test_mail_followers.py +++ b/addons/mail/tests/test_mail_followers.py @@ -57,9 +57,12 @@ class TestMailFollowers(TestMail): self.assertEqual(set(specific[self.group_public.id][0][2]['subtype_ids'][0][2]), set([self.mt_mg_nodef.id])) def test_message_is_follower(self): + qty_followed_before = len(self.group_pigs.sudo(self.user_employee).search([('message_is_follower', '=', True)])) self.assertFalse(self.group_pigs.sudo(self.user_employee).message_is_follower) self.group_pigs.message_subscribe_users(user_ids=[self.user_employee.id]) + qty_followed_after = len(self.group_pigs.sudo(self.user_employee).search([('message_is_follower', '=', True)])) self.assertTrue(self.group_pigs.sudo(self.user_employee).message_is_follower) + self.assertEqual(qty_followed_before + 1, qty_followed_after) def test_followers_subtypes_default(self): self.group_pigs.message_subscribe_users(user_ids=[self.user_employee.id]) diff --git a/addons/project/project.py b/addons/project/project.py index 5df4a247037..bfd4d1d679a 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -326,13 +326,6 @@ class project(osv.osv): tasks.write({'active': vals['active']}) return res - def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): - context = dict(context or {}) - if context.get('message_is_follower', False): - res = super(project, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=count) - return [proj.id for proj in self.browse(cr, uid, res, context=context) if proj.message_is_follower] - return super(project, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=count) - class task(osv.osv): _name = "project.task" diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a0d7ffb96fb..fb1f242e853 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -162,7 +162,7 @@ - +