[FIX] mail, project: define search method for message_is_follower

In order to be able to search on a non-stored computed field, a search
method must be defined.

This also reverts commit fd38fc0a02.

Fixes #8920
This commit is contained in:
Nicolas Martinelli
2015-10-13 10:15:21 +02:00
parent 1458575c68
commit db68f9c4be
4 changed files with 18 additions and 9 deletions
+14 -1
View File
@@ -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)
+3
View File
@@ -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])
-7
View File
@@ -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"
+1 -1
View File
@@ -162,7 +162,7 @@
<filter string="Pending" name="Pending" domain="[('state', '=','pending')]"/>
<separator/>
<filter string="Manager" domain="[('user_id','=',uid)]"/>
<filter string="Followed by Me" context="{'message_is_follower': True}"/>
<filter string="Followed by Me" domain="[('message_is_follower','=',True)]"/>
<separator/>
<filter string="Important Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>