diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 3d645bca794..af5929429dc 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -176,44 +176,42 @@ class MailThread(models.AbstractModel): @api.multi def _get_message_unread(self): - res = dict((res_id, 0) for res_id in self.ids) partner_id = self.env.user.partner_id.id - - # search for unread messages, directly in SQL to improve performances - self._cr.execute(""" SELECT msg.res_id FROM mail_message msg - RIGHT JOIN mail_message_mail_channel_rel rel - ON rel.mail_message_id = msg.id - RIGHT JOIN mail_channel_partner cp - ON (cp.channel_id = rel.mail_channel_id AND cp.partner_id = %s AND - (cp.seen_message_id IS NULL OR cp.seen_message_id < msg.id)) - WHERE msg.model = %s AND msg.res_id = ANY(%s) AND - (msg.author_id IS NULL OR msg.author_id != %s) AND - (msg.message_type != 'notification' OR msg.model != 'mail.channel')""", - (partner_id, self._name, list(self.ids), partner_id,)) - for result in self._cr.fetchall(): - res[result[0]] += 1 + res = dict.fromkeys(self.ids, 0) + if self.ids: + # search for unread messages, directly in SQL to improve performances + self._cr.execute(""" SELECT msg.res_id FROM mail_message msg + RIGHT JOIN mail_message_mail_channel_rel rel + ON rel.mail_message_id = msg.id + RIGHT JOIN mail_channel_partner cp + ON (cp.channel_id = rel.mail_channel_id AND cp.partner_id = %s AND + (cp.seen_message_id IS NULL OR cp.seen_message_id < msg.id)) + WHERE msg.model = %s AND msg.res_id = ANY(%s) AND + (msg.author_id IS NULL OR msg.author_id != %s) AND + (msg.message_type != 'notification' OR msg.model != 'mail.channel')""", + (partner_id, self._name, list(self.ids), partner_id,)) + for result in self._cr.fetchall(): + res[result[0]] += 1 for record in self: - record.message_unread_counter = res.get(record.id, 0) + record.message_unread_counter = res.get(record._origin.id, 0) record.message_unread = bool(record.message_unread_counter) @api.multi def _get_message_needaction(self): - res = dict((res_id, 0) for res_id in self.ids) - if not res: - return - - # search for unread messages, directly in SQL to improve performances - self._cr.execute(""" SELECT msg.res_id FROM mail_message msg - RIGHT JOIN mail_message_res_partner_needaction_rel rel - ON rel.mail_message_id = msg.id AND rel.res_partner_id = %s AND (rel.is_read = false OR rel.is_read IS NULL) - WHERE msg.model = %s AND msg.res_id in %s""", - (self.env.user.partner_id.id, self._name, tuple(self.ids),)) - for result in self._cr.fetchall(): - res[result[0]] += 1 + res = dict.fromkeys(self.ids, 0) + if self.ids: + # search for unread messages, directly in SQL to improve performances + self._cr.execute(""" SELECT msg.res_id FROM mail_message msg + RIGHT JOIN mail_message_res_partner_needaction_rel rel + ON rel.mail_message_id = msg.id AND rel.res_partner_id = %s AND (rel.is_read = false OR rel.is_read IS NULL) + WHERE msg.model = %s AND msg.res_id in %s""", + (self.env.user.partner_id.id, self._name, tuple(self.ids),)) + for result in self._cr.fetchall(): + res[result[0]] += 1 for record in self: - record.message_needaction_counter = res.get(record.id, 0) + record.message_needaction_counter = res.get(record._origin.id, 0) record.message_needaction = bool(record.message_needaction_counter) @api.model @@ -222,18 +220,18 @@ class MailThread(models.AbstractModel): @api.multi def _compute_message_has_error(self): - self._cr.execute(""" SELECT msg.res_id, COUNT(msg.res_id) FROM mail_message msg - RIGHT JOIN mail_message_res_partner_needaction_rel rel - ON rel.mail_message_id = msg.id AND rel.email_status in ('exception','bounce') - WHERE msg.author_id = %s AND msg.model = %s AND msg.res_id in %s - GROUP BY msg.res_id""", - (self.env.user.partner_id.id, self._name, tuple(self.ids),)) - res = dict() - for result in self._cr.fetchall(): - res[result[0]] = result[1] + res = {} + if self.ids: + self._cr.execute(""" SELECT msg.res_id, COUNT(msg.res_id) FROM mail_message msg + RIGHT JOIN mail_message_res_partner_needaction_rel rel + ON rel.mail_message_id = msg.id AND rel.email_status in ('exception','bounce') + WHERE msg.author_id = %s AND msg.model = %s AND msg.res_id in %s + GROUP BY msg.res_id""", + (self.env.user.partner_id.id, self._name, tuple(self.ids),)) + res.update(self._cr.fetchall()) for record in self: - record.message_has_error_counter = res.get(record.id, 0) + record.message_has_error_counter = res.get(record._origin.id, 0) record.message_has_error = bool(record.message_has_error_counter) @api.model