[FIX] website_slides: prevent error when no completed_template selected

Current behavior :
If no completed template (`completed_template_id`) is selected in the options of an elearning course, an error occurs when a user completes this course.

Steps :
- Install elearning
- (*with demo data*) Go to a course (e.g. Basics of Gardening)
- Remove the selected "Completion Email" then save
- Complete the course

Reason :
We are trying to access a `record_email_values` value here [1] but no value is assigned to `record_email_values` unless we have a completed_template [2].

[1] : https://github.com/odoo/odoo/blob/f4d83f31c12cb13d626bcaaa619c0f3be680cdbc/addons/website_slides/models/slide_channel.py#L110
[2] : https://github.com/odoo/odoo/blob/f4d83f31c12cb13d626bcaaa619c0f3be680cdbc/addons/website_slides/models/slide_channel.py#L105-L106

OPW-2753078

closes odoo/odoo#86771

X-original-commit: 444132f446c4dc8914f1238f96c4af98550e27a9
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Claude Thibault (thcl) <thcl@odoo.com>
This commit is contained in:
thcl-odoo
2022-03-21 16:01:55 +01:00
parent 6889f3b043
commit c2b15b7cfc
2 changed files with 50 additions and 3 deletions
@@ -110,11 +110,12 @@ class ChannelUsersRelation(models.Model):
for record in self:
template = record.channel_id.completed_template_id
if template:
records = template_to_records.setdefault(template, self.env['slide.channel.partner'])
records += record
template_to_records.setdefault(template, self.env['slide.channel.partner'])
template_to_records[template] += record
record_email_values = dict()
for template, records in template_to_records.items():
record_email_values = template.generate_email(self.ids, ['subject', 'body_html', 'email_from', 'partner_to'])
record_email_values.update(template.generate_email(records.ids, ['subject', 'body_html', 'email_from', 'partner_to']))
mail_mail_values = []
for record in self:
@@ -88,6 +88,52 @@ class TestSlidesManagement(slides_common.SlidesCase):
for mail in created_mails)
)
def test_mail_completed_with_different_templates(self):
""" When the completion email is generated, it must take into account different templates. """
mail_template = self.env['mail.template'].create({
'model_id': self.env['ir.model']._get('slide.channel.partner').id,
'name': 'test template',
'partner_to': '{{ object.partner_id.id }}',
'body_html': '<p>TestBodyTemplate2</p>',
'subject': 'ATestSubject'
})
channel_2 = self.env['slide.channel'].create({
'name': 'Test Course 2',
'slide_ids': [(0, 0, {
'name': 'Test Slide 2'
})],
'completed_template_id': mail_template.id
})
self.channel.completed_template_id.body_html = '<p>TestBodyTemplate</p>'
all_channels = self.channel | channel_2
all_channels.sudo()._action_add_members(self.user_officer.partner_id)
with self.mock_mail_gateway():
self.env['slide.slide.partner'].create([
{'channel_id': self.channel.id,
'completed': True,
'partner_id': self.user_officer.partner_id.id,
'slide_id': slide.id,
}
for slide in all_channels.slide_content_ids
])
slide_created_mails = self._new_mails.filtered(lambda m: m.model == 'slide.channel.partner')
# 2 mails should be generated from two different templates:
# the default template and the new one
self.assertEqual(len(slide_created_mails), 2)
self.assertEqual(
slide_created_mails.mapped('body'),
['<p>TestBodyTemplate</p>', '<p>TestBodyTemplate2</p>']
)
self.assertEqual(
slide_created_mails.mapped('subject'),
['Congratulation! You completed %s' % self.channel.name, 'ATestSubject']
)
class TestSequencing(slides_common.SlidesCase):