[IMP] mail: allow to link partners to logs

In this commit we allow to give 'partner_ids' when using '_message_log'.
This allows to link a message to recipients but those are not notified
in any way.

Main purpose is to link a message which has a side effect to the main record
customer. First usage will be in WhatsApp implementation to link a sent
WhatsApp to a recipient, easing finding it back when receiving replies.

Task-2377154 (Add WhatsApp Support)

Part-of: odoo/odoo#134377
This commit is contained in:
Thibault Delavallée
2023-09-07 11:46:11 +00:00
committed by Renaud Thiry
parent fe62bfeacb
commit cdae935731
2 changed files with 41 additions and 2 deletions
+8 -2
View File
@@ -2570,6 +2570,7 @@ class MailThread(models.AbstractModel):
body='', subject=False,
author_id=None, email_from=None,
message_type='notification',
partner_ids=False,
attachment_ids=False, tracking_value_ids=False):
""" Shortcut allowing to post note on a document. See ``_message_log_batch``
for more details. """
@@ -2579,12 +2580,14 @@ class MailThread(models.AbstractModel):
{self.id: body}, subject=subject,
author_id=author_id, email_from=email_from,
message_type=message_type,
partner_ids=partner_ids,
attachment_ids=attachment_ids, tracking_value_ids=tracking_value_ids
)
def _message_log_batch(self, bodies, subject=False,
author_id=None, email_from=None,
message_type='notification',
partner_ids=False,
attachment_ids=False, tracking_value_ids=False):
""" Shortcut allowing to post notes on a batch of documents. It does not
perform any notification and pre-computes some values to have a short code
@@ -2594,7 +2597,9 @@ class MailThread(models.AbstractModel):
access rights are already granted to avoid privilege escalation.
:param bodies: dict {record_id: body}
:param list partner_ids: optional partners, not used in any notification
mechanism. This is mainly used to link a log to a specific customer
like SMS or WhatsApp log;
:return: created messages (as sudo)
"""
# protect against side-effect prone usage
@@ -2620,6 +2625,7 @@ class MailThread(models.AbstractModel):
# recipients
'email_add_signature': False, # False as no notification -> no need to compute signature
'message_id': tools.generate_tracking_message_id('message-notify'), # why? this is all but a notify
'partner_ids': partner_ids,
'reply_to': self.env['mail.thread']._notify_get_reply_to(default=email_from)[False],
}
@@ -2713,7 +2719,7 @@ class MailThread(models.AbstractModel):
# Avoid warnings about non-existing fields
for x in ('from', 'to', 'cc', 'canned_response_ids'):
create_values.pop(x, None)
create_values['partner_ids'] = [Command.link(pid) for pid in create_values.get('partner_ids', [])]
create_values['partner_ids'] = [Command.link(pid) for pid in (create_values.get('partner_ids') or [])]
create_values_list.append(create_values)
# remove context, notably for default keys, as this thread method is not
@@ -546,6 +546,7 @@ class TestMessageLog(TestMessagePostCommon):
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'partner_ids': self.env['res.partner'],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
@@ -573,6 +574,38 @@ class TestMessageLog(TestMessagePostCommon):
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'partner_ids': self.env['res.partner'],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),
}
)
@users('employee')
def test_message_log_batch_with_partners(self):
""" Partners can be given to log, but this should not generate any
notification. """
test_records = self.test_records.with_env(self.env)
test_records.message_subscribe(self.partner_employee_2.ids)
new_notes = test_records._message_log_batch(
bodies={
test_record.id: Markup('<p>Test _message_log_batch</p>')
for test_record in test_records
},
partner_ids=self.test_partners[:5].ids,
)
for test_record, new_note in zip(test_records, new_notes):
self.assertMessageFields(
new_note,
{'author_id': self.partner_employee,
'body': '<p>Test _message_log_batch</p>',
'email_from': formataddr((self.partner_employee.name, self.partner_employee.email_normalized)),
'is_internal': True,
'message_type': 'notification',
'model': test_record._name,
'notified_partner_ids': self.env['res.partner'],
'partner_ids': self.test_partners[:5],
'reply_to': formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))),
'res_id': test_record.id,
'subtype_id': self.env.ref('mail.mt_note'),