mirror of https://github.com/OCA/social.git
124 lines
4.6 KiB
Python
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",
|
|
}
|