diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 8e9729f3497..0be4b8158a3 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -482,6 +482,7 @@ class hr_applicant(base_stage, osv.Model): def get_empty_list_help(self, cr, uid, help, context=None): context['empty_list_help_model'] = 'hr.job' + context['empty_list_help_id'] = context.get('default_job_id', None) context['empty_list_help_document_name'] = _("job applicants") return super(hr_applicant, self).get_empty_list_help(cr, uid, help, context=context) @@ -489,6 +490,7 @@ class hr_applicant(base_stage, osv.Model): class hr_job(osv.osv): _inherit = "hr.job" _name = "hr.job" + _inherits = {'mail.alias': 'alias_id'} def _application_count(self, cr, uid, ids, field_name, arg, context=None): """Calculate total Applications per job""" @@ -499,22 +501,47 @@ class hr_job(osv.osv): res[applicant.job_id.id] += 1 return res - def _job_alias(self, cr, uid, ids, field_name, arg, context=None): - res = dict.fromkeys(ids, False) - mail_alias = self.pool.get('mail.alias') - model_ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'hr.applicant')], context=context) - alias_ids = mail_alias.search(cr, uid, [('alias_model_id', '=', model_ids[0])], context=context) - if alias_ids: - for id in ids: - res[id] = alias_ids[0] - return res - _columns = { 'survey_id': fields.many2one('survey', 'Interview Form', help="Choose an interview form for this job position and you will be able to print/answer this interview from all applicants who apply for this job"), + 'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True, + help="Email alias for this job position. New emails will automatically " + "create new applicants for this job position."), 'application_count': fields.function(_application_count, type='integer', string="Total Applications"), 'manager_id': fields.related('department_id', 'manager_id', type='many2one', string='Department Manager', relation='hr.employee', readonly=True, store=True), - 'job_alias': fields.function(_job_alias, type='many2one', relation='mail.alias', string='Mail Alias'), } + } + _defaults = { + 'alias_domain': False, # always hide alias during creation + } + + def _auto_init(self, cr, context=None): + """Installation hook to create aliases for all jobs and avoid constraint errors.""" + res = self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(hr_job,self)._auto_init, + self._columns['alias_id'], 'name', alias_prefix='job+', alias_defaults={'job_id': 'id'}, context=context) + return res + + def create(self, cr, uid, vals, context=None): + mail_alias = self.pool.get('mail.alias') + if not vals.get('alias_id'): + vals.pop('alias_name', None) # prevent errors during copy() + alias_id = mail_alias.create_unique_alias(cr, uid, + # Using '+' allows using subaddressing for those who don't + # have a catchall domain setup. + {'alias_name': 'jobs+'+vals['name']}, + model_name="hr.applicant", + context=context) + vals['alias_id'] = alias_id + res = super(hr_job, self).create(cr, uid, vals, context) + mail_alias.write(cr, uid, [vals['alias_id']], {"alias_defaults": {'job_id': res}}, context) + return res + + def unlink(self, cr, uid, ids, context=None): + # Cascade-delete mail aliases as well, as they should not exist without the job position. + mail_alias = self.pool.get('mail.alias') + alias_ids = [job.alias_id.id for job in self.browse(cr, uid, ids, context=context) if job.alias_id] + res = super(hr_job, self).unlink(cr, uid, ids, context=context) + mail_alias.unlink(cr, uid, alias_ids, context=context) + return res def action_print_survey(self, cr, uid, ids, context=None): if context is None: diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml index ac4e4e2a624..dded03374a0 100644 --- a/addons/hr_recruitment/hr_recruitment_view.xml +++ b/addons/hr_recruitment/hr_recruitment_view.xml @@ -312,6 +312,19 @@ attrs="{'invisible':[('survey_id','=',False)]}"/> + +
+
+