[REF] mail: better use and update 'auto_delete' composer field

RATIONALE

Improve usage of composer in comment or email mode: support batch-posting in
comment, support more configuration from templates, improve global model.

SPECIFICATIONS

Correctly update 'auto_delete' field

  * add missing update in onchange, to either take value from template, either
    fallback on default_get values as other fields;
  * in comment mode, actual value for 'auto_delete' is True by default. Composer
    value was not used and bypassed by a context value being True by default.
    Context key support is removed, correctly replaced by the composer field
    value itself;

Task-3035101 (Mail: Support batch-posting from composer)

Part-of: odoo/odoo#99482
This commit is contained in:
Thibault Delavallée
2023-01-17 20:58:41 +01:00
parent 9140ce06c3
commit 35762204a6
4 changed files with 28 additions and 27 deletions
+12 -2
View File
@@ -101,6 +101,10 @@ class MailComposer(models.TransientModel):
if 'create_uid' in fields_list and 'create_uid' not in result:
result['create_uid'] = self.env.uid
# comment mode by default removes emails
if 'auto_delete' in fields_list and 'auto_delete' not in result and result.get('composition_mode') == 'comment':
result['auto_delete'] = True
return {
fname: result[fname]
for fname in result if fname in fields_list
@@ -264,7 +268,8 @@ class MailComposer(models.TransientModel):
template = self.env['mail.template'].browse(template_id)
values = dict(
(field, template[field])
for field in ('email_from',
for field in ('auto_delete',
'email_from',
'reply_to',
'scheduled_date',
'subject',
@@ -285,6 +290,7 @@ class MailComposer(models.TransientModel):
self.env['mail.template'].browse(template_id),
template_res_ids,
('attachment_ids',
'auto_delete',
'body_html',
'email_cc',
'email_from',
@@ -318,6 +324,8 @@ class MailComposer(models.TransientModel):
default_model=model,
default_res_ids=res_ids
).default_get(['attachment_ids',
'auto_delete',
'auto_delete_keep_log',
'body',
'composition_mode',
'email_from',
@@ -333,6 +341,8 @@ class MailComposer(models.TransientModel):
values = dict(
(key, default_values[key])
for key in ('attachment_ids',
'auto_delete',
'auto_delete_keep_log',
'body',
'email_from',
'mail_server_id',
@@ -657,7 +667,7 @@ class MailComposer(models.TransientModel):
values.update(
email_add_signature=not bool(self.template_id) and self.email_add_signature,
email_layout_xmlid=self.email_layout_xmlid,
mail_auto_delete=self.template_id.auto_delete if self.template_id else True,
mail_auto_delete=self.auto_delete,
model_description=model_description,
)
return values
+1 -1
View File
@@ -1058,7 +1058,7 @@ class MassMailing(models.Model):
composer_values = {
'auto_delete': not mailing.keep_archives,
# email-mode: keep original message for routing
'auto_delete_message': not mailing.reply_to_mode == 'update',
'auto_delete_keep_log': mailing.reply_to_mode == 'update',
'author_id': author_id,
'attachment_ids': [(4, attachment.id) for attachment in mailing.attachment_ids],
'body': mailing._prepend_preview(mailing.body_html, mailing.preview),
@@ -53,9 +53,6 @@ class MailComposeMessage(models.TransientModel):
mail_values['body_html'] = body
mail_values.update({
'auto_delete': not self.mass_mailing_id.keep_archives,
# email-mode: keep original message for routing
'is_notification': self.mass_mailing_id.reply_to_mode == 'update',
'mailing_id': self.mass_mailing_id.id,
'mailing_trace_ids': [(0, 0, trace_values_all[res_id])] if res_id in trace_values_all else False,
})
+15 -21
View File
@@ -127,7 +127,7 @@ class TestComposerForm(TestMailComposer):
composer_form = Form(self.env['mail.compose.message'].with_context(
self._get_web_context(self.test_record, add_web=True)
))
self.assertFalse(composer_form.auto_delete)
self.assertTrue(composer_form.auto_delete, 'MailComposer: comment mode should remove notification emails by default')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertFalse(composer_form.body)
@@ -204,8 +204,7 @@ class TestComposerForm(TestMailComposer):
composer_form = Form(self.env['mail.compose.message'].with_context(
self._get_web_context(self.test_record, add_web=True, default_template_id=self.template.id)
))
# self.assertTrue(composer_form.auto_delete)
self.assertFalse(composer_form.auto_delete) # FIXME: currently not taking template value
self.assertTrue(composer_form.auto_delete, 'Should take template value')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertEqual(composer_form.body, '<p>TemplateBody %s</p>' % self.test_record.name)
@@ -234,8 +233,7 @@ class TestComposerForm(TestMailComposer):
default_composition_mode='comment',
default_template_id=self.template.id),
))
# self.assertTrue(composer_form.auto_delete)
self.assertFalse(composer_form.auto_delete) # FIXME: currently not taking template value
self.assertTrue(composer_form.auto_delete, 'Should take composer value')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertEqual(composer_form.body, self.template.body_html,
@@ -265,8 +263,7 @@ class TestComposerForm(TestMailComposer):
default_model='mail.test.ticket',
default_template_id=self.template.id,
))
# self.assertTrue(composer_form.auto_delete)
self.assertFalse(composer_form.auto_delete) # FIXME: currently not taking template value
self.assertTrue(composer_form.auto_delete, 'Should take composer value')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertEqual(composer_form.body, '<p>TemplateBody </p>')
@@ -315,8 +312,7 @@ class TestComposerForm(TestMailComposer):
composer_form = Form(self.env['mail.compose.message'].with_context(
self._get_web_context(self.test_records, add_web=True, default_template_id=self.template.id)
))
# self.assertTrue(composer_form.auto_delete)
self.assertFalse(composer_form.auto_delete) # FIXME: currently not taking template value
self.assertTrue(composer_form.auto_delete, 'Should take composer value')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertEqual(composer_form.body, self.template.body_html,
@@ -346,8 +342,7 @@ class TestComposerForm(TestMailComposer):
default_model='mail.test.ticket',
default_template_id=self.template.id,
))
# self.assertTrue(composer_form.auto_delete)
self.assertFalse(composer_form.auto_delete) # FIXME: currently not taking template value
self.assertTrue(composer_form.auto_delete, 'Should take composer value')
self.assertTrue(composer_form.auto_delete_keep_log)
self.assertEqual(composer_form.author_id, self.env.user.partner_id)
self.assertEqual(composer_form.body, self.template.body_html,
@@ -561,7 +556,10 @@ class TestComposerInternals(TestMailComposer):
})
# default creation values
self.assertFalse(composer.auto_delete)
if composition_mode == 'comment':
self.assertTrue(composer.auto_delete, 'By default, remove notification emails')
else:
self.assertFalse(composer.auto_delete, 'By default, keep mailing emails')
self.assertTrue(composer.auto_delete_keep_log)
self.assertTrue(composer.email_add_signature)
self.assertEqual(composer.email_layout_xmlid, 'mail.test_layout')
@@ -575,14 +573,14 @@ class TestComposerInternals(TestMailComposer):
# values come from template
if composition_mode == 'comment':
self.assertFalse(composer.auto_delete, 'TODO: should be updated with template')
self.assertTrue(composer.auto_delete)
self.assertTrue(composer.auto_delete_keep_log)
self.assertTrue(composer.email_add_signature, 'TODO: should be False as template negates this config')
self.assertEqual(composer.email_layout_xmlid, 'mail.test_layout')
self.assertEqual(composer.message_type, 'comment')
self.assertEqual(composer.subtype_id, self.env.ref('mail.mt_comment'))
else:
self.assertFalse(composer.auto_delete, 'TODO: should be updated with template')
self.assertTrue(composer.auto_delete)
self.assertTrue(composer.auto_delete_keep_log)
self.assertTrue(composer.email_add_signature, 'TODO: should be False as template negates this config')
self.assertEqual(composer.email_layout_xmlid, 'mail.test_layout')
@@ -598,10 +596,6 @@ class TestComposerInternals(TestMailComposer):
self.assertEqual(composer.subtype_id, self.env.ref('mail.mt_note'))
self.assertTrue(composer.subtype_is_log)
# force some composer values to see changes (due to previous bugs)
composer.write({
'auto_delete': True,
})
# update with template with void values: void value is forced for
# booleans, cannot distinguish
composer.write({'template_id': template_falsy.id})
@@ -1135,7 +1129,7 @@ class TestComposerResultsComment(TestMailComposer, CronMixinCase):
'body': '<p>Test Body</p>',
'partner_ids': [(4, self.partner_1.id), (4, self.partner_2.id)]
})
self.assertFalse(composer.auto_delete)
self.assertTrue(composer.auto_delete, 'Comment mode removes notification emails by default')
self.assertTrue(composer.auto_delete_keep_log)
with self.mock_mail_gateway(mail_unlink_sent=True):
composer._action_send_mail()
@@ -1169,7 +1163,7 @@ class TestComposerResultsComment(TestMailComposer, CronMixinCase):
# global outgoing
self.assertEqual(len(self._mails), 3, 'Should have sent an email each recipient')
self.assertEqual(len(self._new_mails), 2, 'Should have created 2 mail.mail (1 for users, 1 for customers)')
self.assertEqual(len(self._new_mails.exists()), 0, 'To fix: does not respect auto_delete')
self.assertEqual(len(self._new_mails.exists()), 2, 'Should not have deleted mail.mail records')
@users('employee')
@mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@@ -1534,7 +1528,7 @@ class TestComposerResultsMass(TestMailComposer):
default_template_id=self.template.id)
))
composer = composer_form.save()
self.assertFalse(composer.auto_delete, 'Fixme: should take composer value')
self.assertTrue(composer.auto_delete, 'Should take composer value')
self.assertTrue(composer.auto_delete_keep_log)
with self.mock_mail_gateway(mail_unlink_sent=True), self.mock_mail_app():
composer._action_send_mail()