108 lines
5.2 KiB
Python
108 lines
5.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from datetime import datetime
|
|
from markupsafe import Markup
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
from odoo.osv import expression
|
|
|
|
|
|
class ApplicantGetRefuseReason(models.TransientModel):
|
|
_name = 'applicant.get.refuse.reason'
|
|
_description = 'Get Refuse Reason'
|
|
|
|
refuse_reason_id = fields.Many2one('hr.applicant.refuse.reason', 'Refuse Reason', required=True)
|
|
applicant_ids = fields.Many2many('hr.applicant')
|
|
send_mail = fields.Boolean("Send Email", compute='_compute_send_mail', store=True, readonly=False)
|
|
template_id = fields.Many2one('mail.template', string='Email Template',
|
|
compute='_compute_send_mail', store=True, readonly=False,
|
|
domain="[('model', '=', 'hr.applicant')]")
|
|
applicant_without_email = fields.Text(compute='_compute_applicant_without_email',
|
|
string='Applicant(s) not having email')
|
|
applicant_emails = fields.Text(compute='_compute_applicant_emails')
|
|
duplicates = fields.Boolean('Duplicates')
|
|
duplicates_count = fields.Integer('Duplicates Count', compute='_compute_duplicates_count')
|
|
single_applicant_email = fields.Char(compute='_compute_single_applicant_email', inverse="_inverse_single_applicant_email")
|
|
|
|
@api.depends('refuse_reason_id')
|
|
def _compute_send_mail(self):
|
|
for wizard in self:
|
|
template = wizard.refuse_reason_id.template_id
|
|
wizard.send_mail = template and not wizard.applicant_without_email
|
|
wizard.template_id = template
|
|
|
|
@api.depends('applicant_ids', 'single_applicant_email')
|
|
def _compute_applicant_without_email(self):
|
|
for wizard in self:
|
|
applicants = wizard.applicant_ids.filtered(lambda x: not x.email_from and not x.partner_id.email)
|
|
if applicants and not wizard.single_applicant_email:
|
|
wizard.applicant_without_email = "%s\n%s" % (
|
|
_("You can't select Send email option.\nThe email will not be sent to the following applicant(s) as they don't have an email address:"),
|
|
",\n".join([i.partner_name or i.display_name for i in applicants])
|
|
)
|
|
else:
|
|
wizard.applicant_without_email = False
|
|
|
|
@api.depends("applicant_ids.email_from")
|
|
def _compute_single_applicant_email(self):
|
|
for wizard in self:
|
|
if len(wizard.applicant_ids) == 1:
|
|
wizard.single_applicant_email = (
|
|
wizard.applicant_ids.email_from
|
|
or wizard.applicant_ids.partner_id.email
|
|
)
|
|
|
|
def _inverse_single_applicant_email(self):
|
|
for wizard in self:
|
|
if len(wizard.applicant_ids) == 1:
|
|
wizard.applicant_ids.email_from = wizard.single_applicant_email
|
|
|
|
@api.depends('applicant_ids.email_from')
|
|
def _compute_applicant_emails(self):
|
|
for wizard in self:
|
|
wizard.applicant_emails = ', '.join(a.email_from or a.partner_id.email for a in wizard.applicant_ids if a.email_from or a.partner_id.email)
|
|
|
|
def action_refuse_reason_apply(self):
|
|
if self.send_mail:
|
|
if not self.template_id:
|
|
raise UserError(_("Email template must be selected to send a mail"))
|
|
if any(not (applicant.email_from or applicant.partner_id.email) for applicant in self.applicant_ids):
|
|
raise UserError(_("At least one applicant doesn't have a email; you can't use send email option."))
|
|
|
|
refused_applications = self.applicant_ids
|
|
# duplicates_count can be true only if only one application is selected
|
|
if self.duplicates_count and self.duplicates:
|
|
applicant_id = self.applicant_ids[0]
|
|
duplicate_domain = applicant_id.candidate_id._get_similar_candidates_domain()
|
|
duplicates = self.env['hr.candidate'].search(duplicate_domain).applicant_ids
|
|
refused_applications |= duplicates
|
|
url = applicant_id._get_html_link()
|
|
message = _(
|
|
"Refused automatically because this application has been identified as a duplicate of %(link)s",
|
|
link=url)
|
|
duplicates._message_log_batch(bodies={duplicate.id: message for duplicate in duplicates})
|
|
refused_applications.write({'refuse_reason_id': self.refuse_reason_id.id, 'active': False, 'refuse_date': datetime.now()})
|
|
|
|
if self.send_mail:
|
|
# TDE note: keeping 16.0 behavior, clean me please
|
|
message_values = {
|
|
'email_layout_xmlid' : 'hr_recruitment.mail_notification_light_without_background',
|
|
}
|
|
if len(self.applicant_ids) > 1:
|
|
self.applicant_ids.with_context(active_test=True).message_mail_with_source(
|
|
self.template_id,
|
|
auto_delete_keep_log=True,
|
|
**message_values
|
|
)
|
|
else:
|
|
self.applicant_ids.with_context(active_test=True).message_post_with_source(
|
|
self.template_id,
|
|
subtype_xmlid='mail.mt_note',
|
|
**message_values
|
|
)
|
|
|
|
@api.depends('applicant_ids')
|
|
def _compute_duplicates_count(self):
|
|
self.duplicates_count = self.applicant_ids.other_applications_count if len(self.applicant_ids) == 1 else 0
|