social/mail_gateway/models/mail_message.py

124 lines
4.6 KiB
Python

# Copyright 2024 Dixmit
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class MailMessage(models.Model):
_inherit = "mail.message"
gateway_type = fields.Selection(
selection=lambda r: r.env["mail.gateway"]._fields["gateway_type"].selection
)
gateway_notification_ids = fields.One2many(
"mail.notification",
inverse_name="mail_message_id",
domain=[("notification_type", "=", "gateway")],
)
gateway_channel_ids = fields.Many2many(
"res.partner.gateway.channel", compute="_compute_gateway_channel_ids"
)
gateway_channel_data = fields.Json(compute="_compute_gateway_channel_ids")
gateway_message_ids = fields.One2many(
"mail.message",
inverse_name="gateway_message_id",
string="Child gateway messages",
)
gateway_message_id = fields.Many2one(
"mail.message", string="Original gateway message"
)
gateway_thread_data = fields.Json(compute="_compute_gateway_thread_data")
@api.depends("gateway_message_id")
def _compute_gateway_thread_data(self):
for record in self:
gateway_thread_data = {}
if record.gateway_message_id:
gateway_thread_data.update(
{
"name": record.gateway_message_id.record_name,
"id": record.gateway_message_id.res_id,
"model": record.gateway_message_id.model,
}
)
record.gateway_thread_data = gateway_thread_data
@api.depends("notification_ids", "gateway_message_ids")
def _compute_gateway_channel_ids(self):
for record in self:
if self.env.user.has_group("mail_gateway.gateway_user"):
channels = record.notification_ids.res_partner_id.gateway_channel_ids.filtered(
lambda r: (r.gateway_token, r.gateway_id.id)
not in [
(
notification.gateway_channel_id.gateway_channel_token,
notification.gateway_channel_id.gateway_id.id,
)
for notification in record.gateway_message_ids.gateway_notification_ids
]
)
else:
channels = self.env["res.partner.gateway.channel"]
record.gateway_channel_ids = channels
record.gateway_channel_data = {
"channels": channels.ids,
"partners": channels.partner_id.ids,
}
@api.depends("gateway_notification_ids")
def _compute_gateway_channel_id(self):
for rec in self:
if rec.gateway_notification_ids:
rec.gateway_channel_id = rec.gateway_notification_ids[
0
].gateway_channel_id
def _get_message_format_fields(self):
result = super()._get_message_format_fields()
result.append("gateway_type")
result.append("gateway_channel_data")
result.append("gateway_thread_data")
return result
def _send_to_gateway_thread(self, gateway_channel_id):
chat_id = gateway_channel_id.gateway_id._get_channel_id(
gateway_channel_id.gateway_token
)
channel = self.env["mail.channel"].browse(chat_id)
channel.message_post(**self._get_gateway_thread_message_vals())
if not self.gateway_type:
self.gateway_type = gateway_channel_id.gateway_id.gateway_type
self.env["mail.notification"].create(
{
"notification_status": "sent",
"mail_message_id": self.id,
"gateway_channel_id": channel.id,
"notification_type": "gateway",
"gateway_type": gateway_channel_id.gateway_id.gateway_type,
}
)
self.env["bus.bus"]._sendone(
self.env.user.partner_id,
"mail.message/insert",
{
"id": self.id,
"gateway_type": self.gateway_type,
"notifications": self.sudo()
.notification_ids._filtered_for_web_client()
._notification_format(),
},
)
return {}
def _get_gateway_thread_message_vals(self):
return {
"body": self.body,
"attachment_ids": self.attachment_ids.ids,
"subtype_id": self.subtype_id.id,
"author_id": self.env.user.partner_id.id,
"gateway_message_id": self.id,
"message_type": "comment",
}