[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:
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)]"/>
|
||||
|
||||
Reference in New Issue
Block a user