Purpose of this commit is to add tests for language-based tweaks of email notification layouts and composer usage. Purpose is to assess current behavior before going into some cleaning or refactoring. Notably * check layout content is translated; * check "view document" button is translated; * check action buttons are translated; * check content based on templates is translated; This is currently mainly available through the "lang" context key being correctly set. Partial support of translations when posting based on template is tested (content and model description but not notification layout). Failing support in mass mail mode is tested. Future improvements will be done in order to improve language support. Note that ``MailTemplate.send_mail()`` email sending method language support is tested in ``test_mail_template`` file. Those tests are updated to share a common base with new tests about language setup. Task-2712450 (Mail/Sale: Improve 'Pay Now' notification template) Part-of: odoo/odoo#82167
156 lines
7.3 KiB
Python
156 lines
7.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import base64
|
|
|
|
from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients
|
|
from odoo.tests import tagged
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
@tagged('mail_template', 'multi_lang')
|
|
class TestMailTemplate(TestMailCommon, TestRecipients):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestMailTemplate, cls).setUpClass()
|
|
cls.test_record = cls.env['mail.test.lang'].with_context(cls._test_context).create({
|
|
'email_from': 'ignasse@example.com',
|
|
'name': 'Test',
|
|
})
|
|
|
|
cls.user_employee.write({
|
|
'groups_id': [(4, cls.env.ref('base.group_partner_manager').id)],
|
|
})
|
|
|
|
cls._attachments = [{
|
|
'name': 'first.txt',
|
|
'datas': base64.b64encode(b'My first attachment'),
|
|
'res_model': 'res.partner',
|
|
'res_id': cls.user_admin.partner_id.id
|
|
}, {
|
|
'name': 'second.txt',
|
|
'datas': base64.b64encode(b'My second attachment'),
|
|
'res_model': 'res.partner',
|
|
'res_id': cls.user_admin.partner_id.id
|
|
}]
|
|
|
|
cls.email_1 = 'test1@example.com'
|
|
cls.email_2 = 'test2@example.com'
|
|
cls.email_3 = cls.partner_1.email
|
|
|
|
# create a complete test template
|
|
cls.test_template = cls._create_template('mail.test.lang', {
|
|
'attachment_ids': [(0, 0, cls._attachments[0]), (0, 0, cls._attachments[1])],
|
|
'body_html': '<p>EnglishBody for <t t-out="object.name"/></p>',
|
|
'lang': '{{ object.customer_id.lang or object.lang }}',
|
|
'email_to': '%s, %s' % (cls.email_1, cls.email_2),
|
|
'email_cc': '%s' % cls.email_3,
|
|
'partner_to': '%s,%s' % (cls.partner_2.id, cls.user_admin.partner_id.id),
|
|
'subject': 'EnglishSubject for {{ object.name }}',
|
|
})
|
|
|
|
# activate translations
|
|
cls._activate_multi_lang(
|
|
layout_arch_db='<body><t t-out="message.body"/> English Layout for <t t-esc="model_description"/></body>',
|
|
test_record=cls.test_record, test_template=cls.test_template
|
|
)
|
|
|
|
# admin should receive emails
|
|
cls.user_admin.write({'notification_type': 'email'})
|
|
# Force the attachments of the template to be in the natural order.
|
|
cls.test_template.invalidate_cache(['attachment_ids'], ids=cls.test_template.ids)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_template_send_email(self):
|
|
mail_id = self.test_template.send_mail(self.test_record.id)
|
|
mail = self.env['mail.mail'].sudo().browse(mail_id)
|
|
self.assertEqual(mail.email_cc, self.test_template.email_cc)
|
|
self.assertEqual(mail.email_to, self.test_template.email_to)
|
|
self.assertEqual(mail.recipient_ids, self.partner_2 | self.user_admin.partner_id)
|
|
self.assertEqual(mail.subject, 'EnglishSubject for %s' % self.test_record.name)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_template_translation_lang(self):
|
|
test_record = self.env['mail.test.lang'].browse(self.test_record.ids)
|
|
test_record.write({
|
|
'lang': 'es_ES',
|
|
})
|
|
test_template = self.env['mail.template'].browse(self.test_template.ids)
|
|
|
|
mail_id = test_template.send_mail(test_record.id, email_layout_xmlid='mail.test_layout')
|
|
mail = self.env['mail.mail'].sudo().browse(mail_id)
|
|
self.assertEqual(mail.body_html,
|
|
'<body><p>SpanishBody for %s</p> Spanish Layout para Spanish description</body>' % self.test_record.name)
|
|
self.assertEqual(mail.subject, 'SpanishSubject for %s' % self.test_record.name)
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
def test_template_translation_partner_lang(self):
|
|
test_record = self.env['mail.test.lang'].browse(self.test_record.ids)
|
|
customer = self.env['res.partner'].create({
|
|
'email': 'robert.carlos@test.example.com',
|
|
'lang': 'es_ES',
|
|
'name': 'Roberto Carlos',
|
|
})
|
|
test_record.write({
|
|
'customer_id': customer.id,
|
|
})
|
|
test_template = self.env['mail.template'].browse(self.test_template.ids)
|
|
|
|
mail_id = test_template.send_mail(test_record.id, email_layout_xmlid='mail.test_layout')
|
|
mail = self.env['mail.mail'].sudo().browse(mail_id)
|
|
self.assertEqual(mail.body_html,
|
|
'<body><p>SpanishBody for %s</p> Spanish Layout para Spanish description</body>' % self.test_record.name)
|
|
self.assertEqual(mail.subject, 'SpanishSubject for %s' % self.test_record.name)
|
|
|
|
def test_template_add_context_action(self):
|
|
self.test_template.create_action()
|
|
|
|
# check template act_window has been updated
|
|
self.assertTrue(bool(self.test_template.ref_ir_act_window))
|
|
|
|
# check those records
|
|
action = self.test_template.ref_ir_act_window
|
|
self.assertEqual(action.name, 'Send Mail (%s)' % self.test_template.name)
|
|
self.assertEqual(action.binding_model_id.model, 'mail.test.lang')
|
|
|
|
# def test_template_scheduled_date(self):
|
|
# from unittest.mock import patch
|
|
|
|
# self.email_template_in_2_days = self.email_template.copy()
|
|
|
|
# with patch('odoo.addons.mail.tests.test_mail_template.datetime', wraps=datetime) as mock_datetime:
|
|
# mock_datetime.now.return_value = datetime(2017, 11, 15, 11, 30, 28)
|
|
# mock_datetime.side_effect = lambda *args, **kw: datetime(*args, **kw)
|
|
|
|
# self.email_template_in_2_days.write({
|
|
# 'scheduled_date': "{{ (datetime.datetime.now() + relativedelta(days=2)).strftime('%s') }}" % DEFAULT_SERVER_DATETIME_FORMAT,
|
|
# })
|
|
|
|
# mail_now_id = self.email_template.send_mail(self.test_record.id)
|
|
# mail_in_2_days_id = self.email_template_in_2_days.send_mail(self.test_record.id)
|
|
|
|
# mail_now = self.env['mail.mail'].browse(mail_now_id)
|
|
# mail_in_2_days = self.env['mail.mail'].browse(mail_in_2_days_id)
|
|
|
|
# # mail preparation
|
|
# self.assertEqual(mail_now.exists() | mail_in_2_days.exists(), mail_now | mail_in_2_days)
|
|
# self.assertEqual(bool(mail_now.scheduled_date), False)
|
|
# self.assertEqual(mail_now.state, 'outgoing')
|
|
# self.assertEqual(mail_in_2_days.state, 'outgoing')
|
|
# scheduled_date = datetime.strptime(mail_in_2_days.scheduled_date, DEFAULT_SERVER_DATETIME_FORMAT)
|
|
# date_in_2_days = datetime.now() + timedelta(days = 2)
|
|
# self.assertEqual(scheduled_date, date_in_2_days)
|
|
# # self.assertEqual(scheduled_date.month, date_in_2_days.month)
|
|
# # self.assertEqual(scheduled_date.year, date_in_2_days.year)
|
|
|
|
# # Launch the scheduler on the first mail, it should be reported in self.mails
|
|
# # and the mail_mail is now deleted
|
|
# self.env['mail.mail'].process_email_queue()
|
|
# self.assertEqual(mail_now.exists() | mail_in_2_days.exists(), mail_in_2_days)
|
|
|
|
# # Launch the scheduler on the first mail, it's still in 'outgoing' state
|
|
# self.env['mail.mail'].process_email_queue(ids=[mail_in_2_days.id])
|
|
# self.assertEqual(mail_in_2_days.state, 'outgoing')
|
|
# self.assertEqual(mail_now.exists() | mail_in_2_days.exists(), mail_in_2_days)
|