oca-technical/odoo-bringout-oca-automation-automation_oca/automation_oca/models/mail_thread.py
2025-08-29 15:43:03 +02:00

70 lines
2.6 KiB
Python

# Copyright 2024 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, models, tools
class MailThread(models.AbstractModel):
_inherit = "mail.thread"
@api.model
def _routing_handle_bounce(self, email_message, message_dict):
"""We want to mark the bounced email"""
result = super(MailThread, self)._routing_handle_bounce(
email_message, message_dict
)
bounced_msg_id = message_dict.get("bounced_msg_id")
if bounced_msg_id:
self.env["automation.record.step"].search(
[("message_id", "in", bounced_msg_id)]
)._set_mail_bounced()
return result
@api.model
def _message_route_process(self, message, message_dict, routes):
"""Override to update the parent mailing traces. The parent is found
by using the References header of the incoming message and looking for
matching message_id in automation.record.step."""
if routes:
thread_references = (
message_dict["references"] or message_dict["in_reply_to"]
)
msg_references = tools.mail_header_msgid_re.findall(thread_references)
if msg_references:
records = self.env["automation.record.step"].search(
[("message_id", "in", msg_references)]
)
records._set_mail_open()
records._set_mail_reply()
return super(MailThread, self)._message_route_process(
message, message_dict, routes
)
@api.model
def get_automation_access(self, doc_ids, operation, model_name=False):
"""Retrieve access policy.
The behavior is similar to `mail.thread` and `mail.message`
and it relies on the access rules defines on the related record.
The behavior can be customized on the related model
by defining `_automation_record_access`.
By default `write`, otherwise the custom permission is returned.
"""
DocModel = self.env[model_name] if model_name else self
create_allow = getattr(DocModel, "_automation_record_access", "write")
if operation in ["write", "unlink"]:
check_operation = "write"
elif operation == "create" and create_allow in [
"create",
"read",
"write",
"unlink",
]:
check_operation = create_allow
elif operation == "create":
check_operation = "write"
else:
check_operation = operation
return check_operation