From a1bc13b39559fa82763a9f0b3b603f6026b8a151 Mon Sep 17 00:00:00 2001 From: Dossogne Bertrand Date: Tue, 21 Jun 2022 14:35:19 +0000 Subject: [PATCH] [IMP] hr_recruitment_survey: add interview template This commit adds a new mail template to be sent by default for interviews. task-2884526 closes odoo/odoo#94178 Related: odoo/upgrade#3731 Signed-off-by: Kevin Baptiste --- addons/hr_recruitment_survey/__manifest__.py | 1 + .../data/mail_template_data.xml | 37 ++++++++++++ .../models/hr_applicant.py | 37 ++++++++++-- .../models/survey_user_input.py | 8 +-- .../tests/test_recruitment_survey.py | 12 ++-- .../views/hr_applicant_views.xml | 9 ++- .../wizard/survey_invite.py | 18 +++++- addons/survey/models/survey_survey.py | 7 ++- addons/survey/wizard/survey_invite.py | 59 +++++++++++-------- addons/survey/wizard/survey_invite_views.xml | 6 +- 10 files changed, 142 insertions(+), 52 deletions(-) create mode 100644 addons/hr_recruitment_survey/data/mail_template_data.xml diff --git a/addons/hr_recruitment_survey/__manifest__.py b/addons/hr_recruitment_survey/__manifest__.py index 64eb24a4ed7..30ec066a45d 100644 --- a/addons/hr_recruitment_survey/__manifest__.py +++ b/addons/hr_recruitment_survey/__manifest__.py @@ -12,6 +12,7 @@ 'depends': ['survey', 'hr_recruitment'], 'data': [ 'security/hr_recruitment_survey_security.xml', + 'data/mail_template_data.xml', 'views/hr_job_views.xml', 'views/hr_applicant_views.xml', 'views/res_config_setting_views.xml', diff --git a/addons/hr_recruitment_survey/data/mail_template_data.xml b/addons/hr_recruitment_survey/data/mail_template_data.xml new file mode 100644 index 00000000000..fc5ced50b1d --- /dev/null +++ b/addons/hr_recruitment_survey/data/mail_template_data.xml @@ -0,0 +1,37 @@ + + + + + Applicant: Interview + + Participate to {{ object.survey_id.display_name }} interview + {{ (object.partner_id.email_formatted or object.email) }} + +
+

+ Dear [applicant name]

+ + You've progressed through the recruitment process and we would like you to answer some questions. + +

+ + Please answer the interview for [deadline date].

+
+ + We wish you good luck! Thank you in advance for your participation. + +

+
+
+ {{ object.partner_id.lang }} + +
+
+
diff --git a/addons/hr_recruitment_survey/models/hr_applicant.py b/addons/hr_recruitment_survey/models/hr_applicant.py index 25f054a8d1e..7b62eb205b4 100644 --- a/addons/hr_recruitment_survey/models/hr_applicant.py +++ b/addons/hr_recruitment_survey/models/hr_applicant.py @@ -1,5 +1,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. +from datetime import timedelta from odoo import fields, models, _ from odoo.exceptions import UserError @@ -8,13 +9,21 @@ class Applicant(models.Model): _inherit = "hr.applicant" survey_id = fields.Many2one('survey.survey', related='job_id.survey_id', string="Survey", readonly=True) - response_id = fields.Many2one('survey.user_input', "Response", ondelete="set null", copy=False) - response_state = fields.Selection(related='response_id.state', readonly=True) + response_ids = fields.One2many('survey.user_input', 'applicant_id', string="Responses") def action_print_survey(self): """ If response is available then print this response otherwise print survey form (print template of the survey) """ self.ensure_one() - return self.survey_id.action_print_survey(answer=self.response_id) + sorted_interviews = self.response_ids\ + .filtered(lambda i: i.survey_id == self.survey_id)\ + .sorted(lambda i: i.create_date, reverse=True) + if not sorted_interviews: + return self.survey_id.action_print_survey() + + answered_interviews = sorted_interviews.filtered(lambda i: i.state == 'done') + if answered_interviews: + return self.survey_id.action_print_survey(answer=answered_interviews[0]) + return self.survey_id.action_print_survey(answer=sorted_interviews[0]) def action_send_survey(self): self.ensure_one() @@ -31,4 +40,24 @@ class Applicant(models.Model): 'phone': self.partner_phone, 'mobile': self.partner_mobile }) - return self.survey_id.with_context(default_applicant_id=self.id, default_partner_ids=self.partner_id.ids).action_send_survey() + + self.survey_id.check_validity() + template = self.env.ref('hr_recruitment_survey.mail_template_applicant_interview_invite', raise_if_not_found=False) + local_context = dict( + default_applicant_id=self.id, + default_partner_ids=self.partner_id.ids, + default_survey_id=self.survey_id.id, + default_use_template=bool(template), + default_template_id=template and template.id or False, + default_email_layout_xmlid='mail.mail_notification_light', + default_deadline=fields.Datetime.now() + timedelta(days=15) + ) + + return { + 'type': 'ir.actions.act_window', + 'name': _("Send an interview"), + 'view_mode': 'form', + 'res_model': 'survey.invite', + 'target': 'new', + 'context': local_context, + } diff --git a/addons/hr_recruitment_survey/models/survey_user_input.py b/addons/hr_recruitment_survey/models/survey_user_input.py index 743f8a0b6fd..c93ed3bb258 100644 --- a/addons/hr_recruitment_survey/models/survey_user_input.py +++ b/addons/hr_recruitment_survey/models/survey_user_input.py @@ -6,12 +6,12 @@ from odoo import fields, models, _ class SurveyUserInput(models.Model): _inherit = "survey.user_input" - applicant_ids = fields.One2many('hr.applicant', 'response_id', string='Applicant') + applicant_id = fields.Many2one('hr.applicant', string='Applicant') def _mark_done(self): odoobot = self.env.ref('base.partner_root') for user_input in self: - if user_input.applicant_ids: - body = _('The applicant "%s" has finished the survey.', user_input.applicant_ids[:1].partner_name) - user_input.applicant_ids.message_post(body=body, author_id=odoobot.id) + if user_input.applicant_id: + body = _('The applicant "%s" has finished the survey.', user_input.applicant_id.partner_name) + user_input.applicant_id.message_post(body=body, author_id=odoobot.id) return super()._mark_done() diff --git a/addons/hr_recruitment_survey/tests/test_recruitment_survey.py b/addons/hr_recruitment_survey/tests/test_recruitment_survey.py index 385fc5a12a6..49203869426 100644 --- a/addons/hr_recruitment_survey/tests/test_recruitment_survey.py +++ b/addons/hr_recruitment_survey/tests/test_recruitment_survey.py @@ -37,7 +37,7 @@ class TestRecruitmentSurvey(common.SingleTransactionCase): def test_send_survey(self): # We ensure that response is False because we don't know test order - self.job_sysadmin.response_id = False + self.job_sysadmin.response_ids = False Answer = self.env['survey.user_input'] answers = Answer.search([('survey_id', '=', self.survey_sysadmin.id)]) answers.unlink() @@ -52,19 +52,19 @@ class TestRecruitmentSurvey(common.SingleTransactionCase): invite.action_invite() self.assertEqual(invite.applicant_id, self.job_sysadmin) - self.assertNotEqual(self.job_sysadmin.response_id.id, False) + self.assertNotEqual(self.job_sysadmin.response_ids.ids, False) answers = Answer.search([('survey_id', '=', self.survey_sysadmin.id)]) self.assertEqual(len(answers), 1) - self.assertEqual(self.job_sysadmin.response_id, answers) + self.assertEqual(self.job_sysadmin.response_ids, answers) self.assertEqual( set(answers.mapped('email')), set([self.job_sysadmin.email_from])) def test_print_survey(self): # We ensure that response is False because we don't know test order - self.job_sysadmin.response_id = False + self.job_sysadmin.response_ids = False action_print = self.job_sysadmin.action_print_survey() self.assertEqual(action_print['type'], 'ir.actions.act_url') - self.job_sysadmin.response_id = self.env['survey.user_input'].create({'survey_id': self.survey_sysadmin.id}) + self.job_sysadmin.response_ids = self.env['survey.user_input'].create({'survey_id': self.survey_sysadmin.id}) action_print_with_response = self.job_sysadmin.action_print_survey() - self.assertIn(self.job_sysadmin.response_id.access_token, action_print_with_response['url']) + self.assertIn(self.job_sysadmin.response_ids.access_token, action_print_with_response['url']) diff --git a/addons/hr_recruitment_survey/views/hr_applicant_views.xml b/addons/hr_recruitment_survey/views/hr_applicant_views.xml index 09abeac69d4..54680b5d034 100644 --- a/addons/hr_recruitment_survey/views/hr_applicant_views.xml +++ b/addons/hr_recruitment_survey/views/hr_applicant_views.xml @@ -7,7 +7,7 @@ - + @@ -18,7 +18,7 @@ -