[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:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user