From 9f84bbddfb3abfc69cdb6b3dc126b7e2381cc452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 29 Nov 2012 15:42:53 +0100 Subject: [PATCH] [IMP] mail: message_unread searchable field now returns a domain. This domain is quite complex, because it bypasses limitations of the _auto_join feature used on message_ids. It should be: message_ids.read = False. However, it takes into account the one2many model, as well as to_read being a function field also searchable. Ths parsing is not capable to handle this kind of thing correctly now without using an ugly hack. Updated _search_to_read and _search_starred. bzr revid: tde@openerp.com-20121129144253-i9e7m2kqjteq8ajr --- addons/mail/mail_message.py | 19 +++---------------- addons/mail/mail_thread.py | 19 +++++++++++-------- addons/mail/mail_thread_view.xml | 2 +- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index c1df5edf906..28ac087edc0 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -98,8 +98,7 @@ class mail_message(osv.Model): def _search_to_read(self, cr, uid, obj, name, domain, context=None): """ Search for messages to read by the current user. Condition is inversed because we search unread message on a read column. """ - pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] - return ['&', ('notification_ids.partner_id', '=', pid), ('notification_ids.read', '=', not domain[0][2])] + return ['&', ('notification_ids.partner_id.user_ids', 'in', [uid]), ('notification_ids.read', '=', not domain[0][2])] def _get_starred(self, cr, uid, ids, name, arg, context=None): """ Compute if the message is unread by the current user. """ @@ -118,8 +117,7 @@ class mail_message(osv.Model): def _search_starred(self, cr, uid, obj, name, domain, context=None): """ Search for messages to read by the current user. Condition is inversed because we search unread message on a read column. """ - pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] - return ['&', ('notification_ids.partner_id', '=', pid), ('notification_ids.starred', '=', domain[0][2])] + return ['&', ('notification_ids.partner_id.user_ids', 'in', [uid]), ('notification_ids.starred', '=', domain[0][2])] def name_get(self, cr, uid, ids, context=None): # name_get may receive int id instead of an id list @@ -179,9 +177,7 @@ class mail_message(osv.Model): } def _needaction_domain_get(self, cr, uid, context=None): - if self._needaction: - return [('to_read', '=', True)] - return [] + return [('to_read', '=', True)] def _get_default_author(self, cr, uid, context=None): return self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] @@ -529,15 +525,6 @@ class mail_message(osv.Model): thread_level=thread_level, message_unload_ids=message_unload_ids, domain=domain, parent_id=parent_id, context=context) return message_list - # TDE Note: do we need this ? - # def user_free_attachment(self, cr, uid, context=None): - # attachment = self.pool.get('ir.attachment') - # attachment_list = [] - # attachment_ids = attachment.search(cr, uid, [('res_model', '=', 'mail.message'), ('create_uid', '=', uid)]) - # if len(attachment_ids): - # attachment_list = [{'id': attach.id, 'name': attach.name, 'date': attach.create_date} for attach in attachment.browse(cr, uid, attachment_ids, context=context)] - # return attachment_list - #------------------------------------------------------ # mail_message internals #------------------------------------------------------ diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 2240c91e4fa..40f13434717 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -122,14 +122,16 @@ class mail_thread(osv.AbstractModel): return res def _search_message_unread(self, cr, uid, obj=None, name=None, domain=None, context=None): - user_pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] - cr.execute(""" SELECT DISTINCT m.res_id FROM mail_message m - JOIN mail_notification n - ON (n.message_id = m.id AND n.partner_id = %s AND (n.read = False or n.read IS NULL)) - WHERE m.model = %s""", - (user_pid, self._name,)) - res_ids = [result[0] for result in cr.fetchall()] - return [('id', 'in', res_ids)] + """ TDE FIXME in 7.1: searching unread messages + _auto_join is currently a very limited feature; therefore the returned + domain to search for unread messages take into acount the following + limitations of this feature : + - does not take into account the domain on the one2many field + (i.e. message_ids.model = self._name is needed) + - does not correctly handle function field on relational table + (i.e. message_ids.read crashes) + """ + return ['&', '&', ('message_ids.model', '=', self._name), ('message_ids.notification_ids.partner_id.user_ids', 'in', [uid]), ('message_ids.notification_ids.read', '=', False)] def _get_followers(self, cr, uid, ids, name, arg, context=None): fol_obj = self.pool.get('mail.followers') @@ -200,6 +202,7 @@ class mail_thread(osv.AbstractModel): 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, string='Messages', help="Messages and communication history"), 'message_unread': fields.function(_get_message_data, diff --git a/addons/mail/mail_thread_view.xml b/addons/mail/mail_thread_view.xml index 80b9800f7ec..d5c111573ea 100644 --- a/addons/mail/mail_thread_view.xml +++ b/addons/mail/mail_thread_view.xml @@ -11,7 +11,7 @@ }