X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fhr_recruitment%2Fhr_recruitment.py;h=89a81a34c99b8ff1df89a803619fd0fad09eeb1d;hb=11bdbfd1837240c8b57816b165825c545c0de234;hp=e0b271810f00009d598cbc4599190e80b279369c;hpb=e5ae68537499b1deb319c213b00da576578fbec2;p=odoo%2Fodoo.git diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index e0b2718..89a81a3 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -19,16 +19,19 @@ # ############################################################################## -from base_status.base_stage import base_stage +import logging import time -from datetime import datetime, timedelta +from datetime import datetime -from osv import fields, osv import tools -import collections -import binascii +from osv import fields, osv +from openerp.modules.registry import RegistryManager +from openerp import SUPERUSER_ID +from base_status.base_stage import base_stage from tools.translate import _ +_logger = logging.getLogger(__name__) + AVAILABLE_STATES = [ ('draft', 'New'), ('cancel', 'Refused'), @@ -253,8 +256,6 @@ class hr_applicant(base_stage, osv.Model): return {'value': {'department_id': False}} def onchange_department_id(self, cr, uid, ids, department_id=False, context=None): - if not department_id: - return {'value': {'stage_id': False}} obj_recru_stage = self.pool.get('hr.recruitment.stage') stage_ids = obj_recru_stage.search(cr, uid, ['|',('department_id','=',department_id),('department_id','=',False)], context=context) stage_id = stage_ids and stage_ids[0] or False @@ -509,9 +510,72 @@ class hr_applicant(base_stage, osv.Model): class hr_job(osv.osv): _inherit = "hr.job" _name = "hr.job" + _inherits = {'mail.alias': 'alias_id'} _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."), } + + _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.""" + + # disable the unique alias_id not null constraint, to avoid spurious warning during + # super.auto_init. We'll reinstall it afterwards. + self._columns['alias_id'].required = False + + super(hr_job,self)._auto_init(cr, context=context) + + registry = RegistryManager.get(cr.dbname) + mail_alias = registry.get('mail.alias') + hr_jobs = registry.get('hr.job') + jobs_no_alias = hr_jobs.search(cr, SUPERUSER_ID, [('alias_id', '=', False)]) + # Use read() not browse(), to avoid prefetching uninitialized inherited fields + for job_data in hr_jobs.read(cr, SUPERUSER_ID, jobs_no_alias, ['name']): + alias_id = mail_alias.create_unique_alias(cr, SUPERUSER_ID, {'alias_name': 'job+'+job_data['name'], + 'alias_defaults': {'job_id': job_data['id']}}, + model_name='hr.applicant') + hr_jobs.write(cr, SUPERUSER_ID, job_data['id'], {'alias_id': alias_id}) + _logger.info('Mail alias created for hr.job %s (uid %s)', job_data['name'], job_data['id']) + + # Finally attempt to reinstate the missing constraint + try: + cr.execute('ALTER TABLE hr_job ALTER COLUMN alias_id SET NOT NULL') + except Exception: + _logger.warning("Table '%s': unable to set a NOT NULL constraint on column '%s' !\n"\ + "If you want to have it, you should update the records and execute manually:\n"\ + "ALTER TABLE %s ALTER COLUMN %s SET NOT NULL", + self._table, 'alias_id', self._table, 'alias_id') + + self._columns['alias_id'].required = True + + 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: