Currently both incoming and outgoing emails are using the same 'email' message_type. However both flows are not linked in any way. Purpose of 'message_type' is to distinguish who generated the message. In this case incoming emails are generated by the mailgateway while outgoing emails are generated by mailins e.g. using the composer in mailing mode. We now distinguish outgoing emails from incoming emails by using a specific type for outgoing emails. Addons are updated accordingly. Default 'message_type' value when removing sms/snailmail/whatsapp is now 'comment' instead of 'email', as default value of messages should be comment as discuss is the main source of messages. Task-3285720 closes odoo/odoo#139814 Related: odoo/enterprise#49597 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
55 lines
2.4 KiB
Python
55 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from collections import defaultdict
|
|
from operator import itemgetter
|
|
|
|
from odoo import exceptions, fields, models
|
|
from odoo.tools import groupby
|
|
|
|
|
|
class MailMessage(models.Model):
|
|
""" Override MailMessage class in order to add a new type: SMS messages.
|
|
Those messages comes with their own notification method, using SMS
|
|
gateway. """
|
|
_inherit = 'mail.message'
|
|
|
|
message_type = fields.Selection(
|
|
selection_add=[('sms', 'SMS')],
|
|
ondelete={'sms': lambda recs: recs.write({'message_type': 'comment'})})
|
|
has_sms_error = fields.Boolean(
|
|
'Has SMS error', compute='_compute_has_sms_error', search='_search_has_sms_error')
|
|
|
|
def _compute_has_sms_error(self):
|
|
sms_error_from_notification = self.env['mail.notification'].sudo().search([
|
|
('notification_type', '=', 'sms'),
|
|
('mail_message_id', 'in', self.ids),
|
|
('notification_status', '=', 'exception')]).mapped('mail_message_id')
|
|
for message in self:
|
|
message.has_sms_error = message in sms_error_from_notification
|
|
|
|
def _search_has_sms_error(self, operator, operand):
|
|
if operator == '=' and operand:
|
|
return ['&', ('notification_ids.notification_status', '=', 'exception'), ('notification_ids.notification_type', '=', 'sms')]
|
|
raise NotImplementedError()
|
|
|
|
def message_format(self, format_reply=True, msg_vals=None):
|
|
""" Override in order to retrieves data about SMS (recipient name and
|
|
SMS status)
|
|
|
|
TDE FIXME: clean the overall message_format thingy
|
|
"""
|
|
message_values = super(MailMessage, self).message_format(format_reply=format_reply, msg_vals=msg_vals)
|
|
all_sms_notifications = self.env['mail.notification'].sudo().search([
|
|
('mail_message_id', 'in', [r['id'] for r in message_values]),
|
|
('notification_type', '=', 'sms')
|
|
])
|
|
msgid_to_notif = defaultdict(lambda: self.env['mail.notification'].sudo())
|
|
for notif in all_sms_notifications:
|
|
msgid_to_notif[notif.mail_message_id.id] += notif
|
|
|
|
for message in message_values:
|
|
customer_sms_data = [(notif.id, notif.res_partner_id.display_name or notif.sms_number, notif.notification_status) for notif in msgid_to_notif.get(message['id'], [])]
|
|
message['sms_ids'] = customer_sms_data
|
|
return message_values
|