From c6d1f71bf0782b523a44ca2068f71f25db94ba24 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Thu, 17 Feb 2022 14:30:22 +0000 Subject: [PATCH] [IMP] hr: Allow plans to directly request signatures closes odoo/odoo#84976 Related: odoo/enterprise#24577 Signed-off-by: Yannick Tivisse (yti) --- addons/hr/models/__init__.py | 1 + addons/hr/models/hr_plan.py | 70 ++++---------------- addons/hr/models/hr_plan_activity_type.py | 61 +++++++++++++++++ addons/hr/views/hr_plan_views.xml | 26 ++++---- addons/hr_contract/data/hr_contract_demo.xml | 4 ++ 5 files changed, 93 insertions(+), 69 deletions(-) create mode 100644 addons/hr/models/hr_plan_activity_type.py diff --git a/addons/hr/models/__init__.py b/addons/hr/models/__init__.py index 1d9141cf1b8..dd9decc5380 100644 --- a/addons/hr/models/__init__.py +++ b/addons/hr/models/__init__.py @@ -9,6 +9,7 @@ from . import hr_department from . import hr_departure_reason from . import hr_job from . import hr_plan +from . import hr_plan_activity_type from . import hr_work_location from . import mail_alias from . import mail_channel diff --git a/addons/hr/models/hr_plan.py b/addons/hr/models/hr_plan.py index 60e64692658..7b6e68a236f 100644 --- a/addons/hr/models/hr_plan.py +++ b/addons/hr/models/hr_plan.py @@ -1,61 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models, _ -from odoo.exceptions import UserError - - -class HrPlanActivityType(models.Model): - _name = 'hr.plan.activity.type' - _description = 'Plan activity type' - _rec_name = 'summary' - _check_company_auto = True - - company_id = fields.Many2one('res.company', default=lambda self: self.env.company) - activity_type_id = fields.Many2one( - 'mail.activity.type', 'Activity Type', - default=lambda self: self.env.ref('mail.mail_activity_data_todo'), - domain=lambda self: ['|', ('res_model', '=', False), ('res_model', '=', 'hr.employee')], - ondelete='restrict' - ) - summary = fields.Char('Summary', compute="_compute_default_summary", store=True, readonly=False) - responsible = fields.Selection([ - ('coach', 'Coach'), - ('manager', 'Manager'), - ('employee', 'Employee'), - ('other', 'Other')], default='employee', string='Responsible', required=True) - responsible_id = fields.Many2one('res.users', 'Name', help='Specific responsible of activity if not linked to the employee.', check_company=True) - note = fields.Html('Note') - - - @api.depends('activity_type_id') - def _compute_default_summary(self): - for plan_type in self: - if not plan_type.summary and plan_type.activity_type_id and plan_type.activity_type_id.summary: - plan_type.summary = plan_type.activity_type_id.summary - - def get_responsible_id(self, employee): - if self.responsible == 'coach': - if not employee.coach_id: - raise UserError(_('Coach of employee %s is not set.', employee.name)) - responsible = employee.coach_id.user_id - if not responsible: - raise UserError(_('User of coach of employee %s is not set.', employee.name)) - elif self.responsible == 'manager': - if not employee.parent_id: - raise UserError(_('Manager of employee %s is not set.', employee.name)) - responsible = employee.parent_id.user_id - if not responsible: - raise UserError(_('User of manager of employee %s is not set.', employee.name)) - elif self.responsible == 'employee': - responsible = employee.user_id - if not responsible: - raise UserError(_('User linked to employee %s is required.', employee.name)) - elif self.responsible == 'other': - responsible = self.responsible_id - if not responsible: - raise UserError(_('No specific user given on activity %s.', self.activity_type_id.name)) - return responsible +from odoo import api, fields, models class HrPlan(models.Model): @@ -63,6 +9,16 @@ class HrPlan(models.Model): _description = 'plan' name = fields.Char('Name', required=True) - company_id = fields.Many2one('res.company', default=lambda self: self.env.company) - plan_activity_type_ids = fields.Many2many('hr.plan.activity.type', string='Activities', domain="[('company_id', '=', company_id)]") + company_id = fields.Many2one( + 'res.company', default=lambda self: self.env.company) + plan_activity_type_ids = fields.Many2many( + 'hr.plan.activity.type', + string='Activities', + domain="[('company_id', '=', company_id)]") active = fields.Boolean(default=True) + steps_count = fields.Integer(compute='_compute_steps_count') + + @api.depends('plan_activity_type_ids') + def _compute_steps_count(self): + for plan in self: + plan.steps_count = len(plan.plan_activity_type_ids) diff --git a/addons/hr/models/hr_plan_activity_type.py b/addons/hr/models/hr_plan_activity_type.py new file mode 100644 index 00000000000..d8f05088bf8 --- /dev/null +++ b/addons/hr/models/hr_plan_activity_type.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class HrPlanActivityType(models.Model): + _name = 'hr.plan.activity.type' + _description = 'Plan activity type' + _rec_name = 'summary' + _check_company_auto = True + + company_id = fields.Many2one('res.company', default=lambda self: self.env.company) + activity_type_id = fields.Many2one( + 'mail.activity.type', 'Activity Type', + default=lambda self: self.env.ref('mail.mail_activity_data_todo'), + domain=lambda self: ['|', ('res_model', '=', False), ('res_model', '=', 'hr.employee')], + ondelete='restrict' + ) + summary = fields.Char('Summary', compute="_compute_default_summary", store=True, readonly=False) + responsible = fields.Selection([ + ('coach', 'Coach'), + ('manager', 'Manager'), + ('employee', 'Employee'), + ('other', 'Other')], default='employee', string='Responsible', required=True) + responsible_id = fields.Many2one( + 'res.users', + 'Name', + check_company=True, + help='Specific responsible of activity if not linked to the employee.') + note = fields.Html('Note') + + @api.depends('activity_type_id') + def _compute_default_summary(self): + for plan_type in self: + if not plan_type.summary and plan_type.activity_type_id and plan_type.activity_type_id.summary: + plan_type.summary = plan_type.activity_type_id.summary + + def get_responsible_id(self, employee): + if self.responsible == 'coach': + if not employee.coach_id: + raise UserError(_('Coach of employee %s is not set.', employee.name)) + responsible = employee.coach_id.user_id + if not responsible: + raise UserError(_('User of coach of employee %s is not set.', employee.name)) + elif self.responsible == 'manager': + if not employee.parent_id: + raise UserError(_('Manager of employee %s is not set.', employee.name)) + responsible = employee.parent_id.user_id + if not responsible: + raise UserError(_("The manager of %s should be linked to a user.", employee.name)) + elif self.responsible == 'employee': + responsible = employee.user_id + if not responsible: + raise UserError(_('The employee %s should be linked to a user.', employee.name)) + elif self.responsible == 'other': + responsible = self.responsible_id + if not responsible: + raise UserError(_('No specific user given on activity %s.', self.activity_type_id.name)) + return responsible diff --git a/addons/hr/views/hr_plan_views.xml b/addons/hr/views/hr_plan_views.xml index 7b2c26465e5..dc9bb1d2eae 100644 --- a/addons/hr/views/hr_plan_views.xml +++ b/addons/hr/views/hr_plan_views.xml @@ -20,7 +20,8 @@ - + + @@ -38,19 +39,20 @@ - - + + - - - - - - - - - + diff --git a/addons/hr_contract/data/hr_contract_demo.xml b/addons/hr_contract/data/hr_contract_demo.xml index 58f991ce44c..93259bb1edc 100644 --- a/addons/hr_contract/data/hr_contract_demo.xml +++ b/addons/hr_contract/data/hr_contract_demo.xml @@ -85,6 +85,10 @@ normal + + + + Walter Horton Contract