From 1fdf64b309eaf33c7e0a2219db8224b5093ebdf2 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 2 May 2013 14:39:45 +0200 Subject: [PATCH] [IMP] search on field message_is_follower bzr revid: mat@openerp.com-20130502123945-z3sg64sotgd5q98n --- addons/mail/mail_thread.py | 49 +++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index de960d02aec..573e0cffd1a 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -237,21 +237,42 @@ class mail_thread(osv.AbstractModel): fol_obj.create(cr, SUPERUSER_ID, {'res_model': self._name, 'res_id': id, 'partner_id': partner_id}) def _search_followers(self, cr, uid, obj, name, args, context): + """Search function for message_follower_ids + + Do not use with operator 'not in'. Use instead message_is_followers + """ fol_obj = self.pool.get('mail.followers') res = [] for field, operator, value in args: assert field == name + # TOFIX make it work with not in + assert operator != "not in", "Do not search message_follower_ids with 'not in'" fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('partner_id', operator, value)]) res_ids = [fol.res_id for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids)] res.append(('id', 'in', res_ids)) return res + def _search_is_follower(self, cr, uid, obj, name, args, context): + """Search function for message_is_follower""" + fol_obj = self.pool.get('mail.followers') + res = [] + for field, operator, value in args: + assert field == name + partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + if (operator == '=' and value) or (operator == '!=' and not value): # is a follower + res_ids = self.search(cr, uid, [('message_follower_ids', 'in', [partner_id])], context=context) + else: # is not a follower or unknown domain + mail_ids = self.search(cr, uid, [('message_follower_ids', 'in', [partner_id])], context=context) + res_ids = self.search(cr, uid, [('id', 'not in', mail_ids)], context=context) + res.append(('id', 'in', res_ids)) + return res + _columns = { - 'message_is_follower': fields.function(_get_followers, - type='boolean', string='Is a Follower', multi='_get_followers,'), + 'message_is_follower': fields.function(_get_followers, type='boolean', + fnct_search=_search_is_follower, string='Is a Follower', multi='_get_followers,'), 'message_follower_ids': fields.function(_get_followers, fnct_inv=_set_followers, - fnct_search=_search_followers, type='many2many', - obj='res.partner', string='Followers', multi='_get_followers'), + fnct_search=_search_followers, type='many2many', + obj='res.partner', string='Followers', multi='_get_followers'), 'message_ids': fields.one2many('mail.message', 'res_id', domain=lambda self: [('model', '=', self._name)], auto_join=True, @@ -1362,10 +1383,16 @@ class mail_thread(osv.AbstractModel): threads = [] if removed_suggested_threads is None: removed_suggested_threads = [] - threads_ids = self.search(cr, uid, [('id', 'not in', removed_suggested_threads)], context=context) - for data in self.read(cr, uid, threads_ids, ['message_is_follower', 'message_ids', 'name', 'image_small'], context): - if not data['message_is_follower']: - data['popularity'] = len(data['message_ids']) - threads.append(data) - sorted_threads = sorted(threads, key=lambda x: (x['popularity'], x['id']), reverse=True)[:3] - return sorted_threads + + thread_ids = self.search(cr, uid, [('id', 'not in', removed_suggested_threads), ('message_is_follower', '=', False)], context=context) + print(thread_ids) + for thread in self.browse(cr, uid, thread_ids, context=context): + data = { + 'id': thread.id, + 'popularity': len(thread.message_follower_ids), + 'name': thread.name, + 'image_small': thread.image_small + } + print(data['id'], data['name'], data['popularity']) + threads.append(data) + return sorted(threads, key=lambda x: (x['popularity'], x['id']), reverse=True)[:3] \ No newline at end of file