[IMP] mail.message: added an 'unread' functional searchable field. This field is used to replace the buggy needaction_domain_get on mail.message (having 2 notifications with 1/ correct partner 2/ unread could lead to false needaction, because of verified domain. The domain is now based on the unread field, that computes unread messages for the user. To avoid having too much overhead, it has been implemented directly in sql.

bzr revid: tde@openerp.com-20120828095323-3tb01d7vaoa0m9rb
This commit is contained in:
Thibault Delavallée 2012-08-28 11:53:23 +02:00
parent aa20e32fba
commit 481bdd269f
2 changed files with 39 additions and 7 deletions

View File

@ -53,7 +53,7 @@ class mail_message(osv.Model):
else:
return name[:18] + '...'
def get_record_name(self, cr, uid, ids, name, arg, context=None):
def _get_record_name(self, cr, uid, ids, name, arg, context=None):
""" Return the related document name, using get_name. """
result = dict.fromkeys(ids, '')
for message in self.browse(cr, uid, ids, context=context):
@ -62,6 +62,36 @@ class mail_message(osv.Model):
result[message.id] = self._shorten_name(self.pool.get(message.model).name_get(cr, uid, [message.res_id], context=context)[0][1])
return result
def _get_unread(self, cr, uid, ids, name, arg, context=None):
""" Compute if the message is unread by the current user. """
res = dict.fromkeys(id, False)
partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
notif_obj = self.pool.get('mail.notification')
notif_ids = notif_obj.search(cr, uid, [
('partner_id', 'in', [partner_id]),
('message_id', 'in', ids),
('read', '=', False)
], context=context)
for notif in notif_obj.browse(cr, uid, notif_ids, context=context):
res[notif.message_id.id]['unread'] = True
return res
def _search_unread(self, cr, uid, obj, name, domain, context=None):
""" Search for messages unread by the current user. """
read_value = not domain[0][2]
partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
cr.execute(""" SELECT mail_message.id \
FROM mail_message \
JOIN mail_notification ON ( \
mail_notification.message_id = mail_message.id ) \
WHERE mail_notification.partner_id = %s AND \
mail_notification.read = %s \
""" % (partner_id, read_value) )
res = cr.fetchall()
message_ids = [r[0] for r in res]
return [('id', 'in', message_ids)]
def name_get(self, cr, uid, ids, context=None):
# name_get may receive int id instead of an id list
if isinstance(ids, (int, long)):
@ -89,7 +119,7 @@ class mail_message(osv.Model):
'child_ids': fields.one2many('mail.message', 'parent_id', 'Child Messages'),
'model': fields.char('Related Document Model', size=128, select=1),
'res_id': fields.integer('Related Document ID', select=1),
'record_name': fields.function(get_record_name, type='string',
'record_name': fields.function(_get_record_name, type='string',
string='Message Record Name',
help="Name get of the related document."),
'notification_ids': fields.one2many('mail.notification', 'message_id', 'Notifications'),
@ -97,15 +127,17 @@ class mail_message(osv.Model):
'date': fields.datetime('Date'),
'message_id': fields.char('Message-Id', help='Message unique identifier', select=1, readonly=1),
'body': fields.html('Content'),
'unread': fields.function(_get_unread, fnct_search=_search_unread,
type='boolean', string='Unread',
help='Functional field to search for unread messages linked to uid'),
}
def _needaction_domain_get(self, cr, uid, context={}):
def _needaction_domain_get(self, cr, uid, context=None):
if self._needaction:
partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
return [('notification_ids.partner_id','=',partner_id),('notification_ids.read','=',False)]
return [('unread', '=', True)]
return []
def _get_default_author(self, cr, uid, context={}):
def _get_default_author(self, cr, uid, context=None):
return self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
_defaults = {

View File

@ -220,7 +220,7 @@ class mail_thread(osv.Model):
def _needaction_domain_get(self, cr, uid, context={}):
if self._needaction:
return [('message_unread','=',True)]
return [('message_unread', '=', True)]
return []
#------------------------------------------------------