diff --git a/addons/im_livechat/models/im_livechat_channel.py b/addons/im_livechat/models/im_livechat_channel.py index 4119b0d7652..dafc9040423 100644 --- a/addons/im_livechat/models/im_livechat_channel.py +++ b/addons/im_livechat/models/im_livechat_channel.py @@ -76,7 +76,7 @@ class ImLivechatChannel(models.Model): def _compute_nbr_channel(self): data = self.env['mail.channel'].read_group([ ('livechat_channel_id', 'in', self._ids), - ('message_ids', '!=', False)], ['__count'], ['livechat_channel_id'], lazy=False) + ('has_message', '=', True)], ['__count'], ['livechat_channel_id'], lazy=False) channel_count = {x['livechat_channel_id'][0]: x['__count'] for x in data} for record in self: record.nbr_channel = channel_count.get(record.id, 0) diff --git a/addons/im_livechat/views/mail_channel_views.xml b/addons/im_livechat/views/mail_channel_views.xml index b3245a8e270..a17845c4533 100644 --- a/addons/im_livechat/views/mail_channel_views.xml +++ b/addons/im_livechat/views/mail_channel_views.xml @@ -129,7 +129,7 @@ Sessions mail.channel tree,form - [('livechat_channel_id', 'in', [active_id]), ('message_ids', '!=', False)] + [('livechat_channel_id', 'in', [active_id]), ('has_message', '=', True)] { 'search_default_livechat_channel_id': [active_id], 'default_livechat_channel_id': active_id, diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 19271082b7d..7f7276b6b23 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -88,6 +88,7 @@ class MailThread(models.AbstractModel): message_ids = fields.One2many( 'mail.message', 'res_id', string='Messages', domain=lambda self: [('message_type', '!=', 'user_notification')], auto_join=True) + has_message = fields.Boolean(compute="_compute_has_message", search="_search_has_message", store=False) message_unread = fields.Boolean( 'Unread Messages', compute='_get_message_unread', help="If checked, new messages require your attention.") @@ -154,6 +155,25 @@ class MailThread(models.AbstractModel): # using read() below is much faster than followers.mapped('res_id') return [('id', 'not in', [res['res_id'] for res in followers.read(['res_id'])])] + def _compute_has_message(self): + self.flush() + self.env.cr.execute(""" + SELECT distinct res_id + FROM mail_message mm + WHERE res_id = any(%s) + AND mm.model=%s + """, [self.ids, self._name]) + channel_ids = [r[0] for r in self.env.cr.fetchall()] + for record in self: + record.has_message = record.id in channel_ids + + def _search_has_message(self, operator, value): + if (operator == '=' and value is True) or (operator == '!=' and value is False): + operator_new = 'inselect' + else: + operator_new = 'not inselect' + return [('id', operator_new, ("SELECT distinct res_id FROM mail_message WHERE model=%s", [self._name]))] + def _get_message_unread(self): partner_id = self.env.user.partner_id.id res = dict.fromkeys(self.ids, 0) @@ -888,7 +908,7 @@ class MailThread(models.AbstractModel): # 0. Handle bounce: verify whether this is a bounced email and use it to collect bounce data and update notifications for customers # Bounce regex: typical form of bounce is bounce_alias+128-crm.lead-34@domain - # group(1) = the mail ID; group(2) = the model (if any); group(3) = the record ID + # group(1) = the mail ID; group(2) = the model (if any); group(3) = the record ID # Bounce message (not alias) # See http://datatracker.ietf.org/doc/rfc3462/?include_text=1 # As all MTA does not respect this RFC (googlemail is one of them), @@ -1655,7 +1675,7 @@ class MailThread(models.AbstractModel): m2m_attachment_ids += [Command.link(id) for id in attachment_ids] # Handle attachments parameter, that is a dictionary of attachments - if attachments: # generate + if attachments: # generate cids_in_body = set() names_in_body = set() cid_list = [] @@ -1925,7 +1945,7 @@ class MailThread(models.AbstractModel): def message_notify(self, *, partner_ids=False, parent_id=False, model=False, res_id=False, author_id=None, email_from=None, body='', subject=False, **kwargs): - """ Shortcut allowing to notify partners of messages that shouldn't be + """ Shortcut allowing to notify partners of messages that shouldn't be displayed on a document. It pushes notifications on inbox or by email depending on the user configuration, like other notifications. """ if self: @@ -2480,7 +2500,7 @@ class MailThread(models.AbstractModel): 'button_access': {'title': 'View Simple Chatter Model', 'url': '/mail/view?model=mail.test.simple&res_id=1497'}, 'has_button_access': False, - 'recipients': [4, 5, 6] + 'recipients': [4, 5, 6] }, { 'actions': [], @@ -2706,7 +2726,7 @@ class MailThread(models.AbstractModel): new_partner_subtypes = dict() - # return data related to auto subscription based on subtype matching (aka: + # return data related to auto subscription based on subtype matching (aka: # default task subtypes or subtypes from project triggering task subtypes) updated_relation = dict() child_ids, def_ids, all_int_ids, parent, relation = self.env['mail.message.subtype']._get_auto_subscription_subtypes(self._name) diff --git a/addons/website_crm_livechat/models/crm_lead.py b/addons/website_crm_livechat/models/crm_lead.py index 9751c5bdb97..f218ab087a6 100644 --- a/addons/website_crm_livechat/models/crm_lead.py +++ b/addons/website_crm_livechat/models/crm_lead.py @@ -17,5 +17,5 @@ class Lead(models.Model): def action_redirect_to_livechat_sessions(self): visitors = self.visitor_ids action = self.env["ir.actions.actions"]._for_xml_id("website_livechat.website_visitor_livechat_session_action") - action['domain'] = [('livechat_visitor_id', 'in', visitors.ids), ('message_ids', '!=', False)] + action['domain'] = [('livechat_visitor_id', 'in', visitors.ids), ('has_message', '=', True)] return action diff --git a/addons/website_livechat/models/website.py b/addons/website_livechat/models/website.py index 95874357ecb..6bfe620a094 100644 --- a/addons/website_livechat/models/website.py +++ b/addons/website_livechat/models/website.py @@ -41,7 +41,7 @@ class Website(models.Model): ('livechat_visitor_id', '=', visitor.id), ('livechat_channel_id', '=', self.channel_id.id), ('livechat_active', '=', True), - ('message_ids', '!=', False) + ('has_message', '=', True) ], order='create_date desc', limit=1) if chat_request_channel: return { diff --git a/addons/website_livechat/views/website_visitor_views.xml b/addons/website_livechat/views/website_visitor_views.xml index 1787d1fdd21..d22b55decfa 100644 --- a/addons/website_livechat/views/website_visitor_views.xml +++ b/addons/website_livechat/views/website_visitor_views.xml @@ -5,7 +5,7 @@ mail.channel tree,form - [('livechat_visitor_id', '=', active_id), ('message_ids', '!=', False)] + [('livechat_visitor_id', '=', active_id), ('has_message', '=', True)] { 'search_default_livechat_visitor_id': [active_id], 'default_livechat_visitor_id': active_id,