diff options
| author | Robot Odoo <xmo+roboto@odoo.com> | 2019-04-23 13:42:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-23 13:42:54 +0200 |
| commit | 25c2c5e01209b57ce5e4213d2856a98a0251d0b8 (patch) | |
| tree | 8b2c34b376e7154c8c41c520c1196893ad225d1e | |
| parent | 04d5c36dd29db494e05784099f184759ea4ec669 (diff) | |
| parent | 30871950d2691aa8f357867e02df7f67822661a0 (diff) | |
[MERGE][REF] hr: lessen use of custom activity types in hr plan
Allow to use todo activity type by default in hr plan in order to avoid
having to define a lot of unnecessary activity types. Custom activity
types are still supported in plan, just not mandatory to create new one
for each step.
Linked to task 1923387 .
closes odoo/odoo#30235
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
| -rw-r--r-- | addons/hr/__manifest__.py | 4 | ||||
| -rw-r--r-- | addons/hr/data/hr_data.xml | 42 | ||||
| -rw-r--r-- | addons/hr/models/__init__.py | 3 | ||||
| -rw-r--r-- | addons/hr/models/hr_plan.py | 61 | ||||
| -rw-r--r-- | addons/hr/models/plan.py | 44 | ||||
| -rw-r--r-- | addons/hr/views/hr_views.xml | 48 | ||||
| -rw-r--r-- | addons/hr/wizard/__init__.py | 4 | ||||
| -rw-r--r-- | addons/hr/wizard/hr_departure_wizard.py (renamed from addons/hr/wizard/departure_wizard.py) | 17 | ||||
| -rw-r--r-- | addons/hr/wizard/hr_departure_wizard_views.xml (renamed from addons/hr/wizard/departure_wizard_views.xml) | 1 | ||||
| -rw-r--r-- | addons/hr/wizard/hr_plan_wizard.py (renamed from addons/hr/wizard/plan_wizard.py) | 28 | ||||
| -rw-r--r-- | addons/hr/wizard/hr_plan_wizard_views.xml (renamed from addons/hr/wizard/plan_wizard_views.xml) | 3 |
11 files changed, 134 insertions, 121 deletions
diff --git a/addons/hr/__manifest__.py b/addons/hr/__manifest__.py index 7e8c5c61126..d3ed7d4b2fc 100644 --- a/addons/hr/__manifest__.py +++ b/addons/hr/__manifest__.py @@ -24,8 +24,8 @@ 'data': [ 'security/hr_security.xml', 'security/ir.model.access.csv', - 'wizard/plan_wizard_views.xml', - 'wizard/departure_wizard_views.xml', + 'wizard/hr_plan_wizard_views.xml', + 'wizard/hr_departure_wizard_views.xml', 'views/hr_views.xml', 'views/hr_templates.xml', 'views/res_config_settings_views.xml', diff --git a/addons/hr/data/hr_data.xml b/addons/hr/data/hr_data.xml index 7436e422be6..869a74a8350 100644 --- a/addons/hr/data/hr_data.xml +++ b/addons/hr/data/hr_data.xml @@ -18,60 +18,28 @@ <field name="image" eval="obj(ref('base.partner_admin')).image" model="res.partner"/> </record> - <record id="activity_type_setup_it_materials" model="mail.activity.type"> - <field name="name">Setup IT Materials</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - </record> - - <record id="activity_type_setup_it_materials" model="mail.activity.type"> - <field name="name">Setup IT Materials</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - </record> - - <record id="activity_type_plan_training" model="mail.activity.type"> - <field name="name">Plan Training</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - </record> - - <record id="activity_type_training" model="mail.activity.type"> - <field name="name">Training</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - <field name="delay_unit">weeks</field> - <field name="delay_count">1</field> - </record> - - <record id="activity_type_compute_out_delais" model="mail.activity.type"> - <field name="name">Compute Out Delais</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - </record> - - <record id="activity_type_take_back_hr_materials" model="mail.activity.type"> - <field name="name">Take Back HR Materials</field> - <field name="res_model_id" ref="hr.model_hr_employee"/> - </record> - <record id="onboarding_setup_it_materials" model="hr.plan.activity.type"> - <field name="activity_type_id" ref="hr.activity_type_setup_it_materials"/> + <field name="summary">Setup IT Materials</field> <field name="responsible">manager</field> </record> <record id="onboarding_plan_training" model="hr.plan.activity.type"> - <field name="activity_type_id" ref="hr.activity_type_plan_training"/> + <field name="summary">Plan Training</field> <field name="responsible">manager</field> </record> <record id="onboarding_training" model="hr.plan.activity.type"> - <field name="activity_type_id" ref="hr.activity_type_training"/> + <field name="summary">Training</field> <field name="responsible">employee</field> </record> <record id="offboarding_setup_compute_out_delais" model="hr.plan.activity.type"> - <field name="activity_type_id" ref="hr.activity_type_compute_out_delais"/> + <field name="summary">Compute Out Delais</field> <field name="responsible">manager</field> </record> <record id="offboarding_take_back_hr_materials" model="hr.plan.activity.type"> - <field name="activity_type_id" ref="hr.activity_type_take_back_hr_materials"/> + <field name="summary">Take Back HR Materials</field> <field name="responsible">manager</field> </record> diff --git a/addons/hr/models/__init__.py b/addons/hr/models/__init__.py index 6f85baf065b..fb22e57dcf7 100644 --- a/addons/hr/models/__init__.py +++ b/addons/hr/models/__init__.py @@ -7,5 +7,4 @@ from . import mail_alias from . import mail_channel from . import res_partner from . import res_users - -from . import plan +from . import hr_plan diff --git a/addons/hr/models/hr_plan.py b/addons/hr/models/hr_plan.py new file mode 100644 index 00000000000..8f8288ebd95 --- /dev/null +++ b/addons/hr/models/hr_plan.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' + + 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_id', '=', False), ('res_model_id', '=', self.env['ir.model']._get('hr.employee').id)] + ) + summary = fields.Char('Summary') + responsible = fields.Selection([ + ('coach', 'Coach'), + ('manager', 'Manager'), + ('employee', 'Employee'), + ('other', 'Other')], default='employee', string='Responsible', required=True) + responsible_id = fields.Many2one('res.users', 'Responsible Person', help='Specific responsible of activity if not linked to the employee.') + + @api.onchange('activity_type_id') + def _onchange_activity_type_id(self): + if self.activity_type_id and self.activity_type_id.summary and not self.summary: + self.summary = self.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.') % employee.name) + return responsible + + +class HrPlan(models.Model): + _name = 'hr.plan' + _description = 'plan' + + name = fields.Char('Name', required=True) + plan_activity_type_ids = fields.Many2many('hr.plan.activity.type', string='Activities') + active = fields.Boolean(default=True) diff --git a/addons/hr/models/plan.py b/addons/hr/models/plan.py deleted file mode 100644 index fee13675130..00000000000 --- a/addons/hr/models/plan.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models, _ -from odoo.exceptions import UserError - - -class PlanActivityType(models.Model): - _name = 'hr.plan.activity.type' - _description = 'Plan activity type' - - activity_type_id = fields.Many2one('mail.activity.type', 'Activity Type', - domain=lambda self: [('res_model_id', '=', self.env['ir.model']._get('hr.employee').id)]) - name = fields.Char(related='activity_type_id.name') - responsible = fields.Selection([ - ('coach', 'Coach'), - ('manager', 'Manager'), - ('employee', 'Employee'), - ('other', 'Other')], default='employee', string='Responsible') - responsible_id = fields.Many2one('res.users', 'Responsible Person') - - def get_responsible_id(self, employee_id): - if self.responsible == 'coach': - self.responsible_id = employee_id.coach_id.user_id - if not self.responsible_id: - raise UserError(_('No user linked to the coach of %s. Please contact an administrator.') % employee_id.name) - elif self.responsible == 'manager': - self.responsible_id = employee_id.parent_id.user_id - if not self.responsible_id: - raise UserError(_('No user linked to the manager of %s. Please contact an administrator.') % employee_id.name) - elif self.responsible == 'employee': - self.responsible_id = employee_id.user_id - if not self.responsible_id: - raise UserError(_('No user linked to the employee %s. Please contact an administrator.') % employee_id.name) - return self.responsible_id - - -class Plan(models.Model): - _name = 'hr.plan' - _description = 'plan' - - name = fields.Char('Name', required=True) - plan_activity_type_ids = fields.Many2many('hr.plan.activity.type', string='Activities') - active = fields.Boolean(default=True) diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml index a175fb96811..91251f652a6 100644 --- a/addons/hr/views/hr_views.xml +++ b/addons/hr/views/hr_views.xml @@ -36,17 +36,18 @@ groups="group_hr_manager" sequence="100"/> - <record id="search_view_plan" model="ir.ui.view"> - <field name="name">hr.plan.search</field> + <record id="hr_plan_view_search" model="ir.ui.view"> + <field name="name">hr.plan.view.search</field> <field name="model">hr.plan</field> <field name="arch" type="xml"> <search string="Plan"> + <field name="name"/> </search> </field> </record> - <record id="view_plan_tree" model="ir.ui.view"> - <field name="name">hr.plan.tree</field> + <record id="hr_plan_view_tree" model="ir.ui.view"> + <field name="name">hr.plan.view.tree</field> <field name="model">hr.plan</field> <field name="arch" type="xml"> <tree string="Planning"> @@ -55,8 +56,8 @@ </field> </record> - <record id="view_plan_form" model="ir.ui.view"> - <field name="name">hr.plan.form</field> + <record id="hr_plan_view_form" model="ir.ui.view"> + <field name="name">hr.plan.view.form</field> <field name="model">hr.plan</field> <field name="arch" type="xml"> <form string="Planning"> @@ -76,7 +77,8 @@ <group string="Activities"> <field name="plan_activity_type_ids" nolabel="1"> <tree editable="bottom"> - <field name="name"/> + <field name="activity_type_id"/> + <field name="summary"/> <field name="responsible"/> <field name="responsible_id" attrs="{'readonly': [('responsible', '!=', 'other')]}"/> </tree> @@ -87,15 +89,27 @@ </field> </record> - <record id="view_plan_activity_form" model="ir.ui.view"> - <field name="name">hr.plan.activity.type.form</field> + <record id="hr_plan_activity_type_view_tree" model="ir.ui.view"> + <field name="name">hr.plan.activity.type.view.tree</field> <field name="model">hr.plan.activity.type</field> <field name="arch" type="xml"> - <form string="Planning"> + <tree string="Activities"> + <field name="activity_type_id"/> + <field name="summary"/> + <field name="responsible"/> + </tree> + </field> + </record> + + <record id="hr_plan_activity_type_view_form" model="ir.ui.view"> + <field name="name">hr.plan.activity.type.view.form</field> + <field name="model">hr.plan.activity.type</field> + <field name="arch" type="xml"> + <form string="Activity"> <sheet> <group> - <field name="name"/> <field name="activity_type_id"/> + <field name="summary"/> <field name="responsible"/> <field name="responsible_id" attrs="{'invisible': [('responsible', '!=', 'other')]}"/> </group> @@ -104,16 +118,16 @@ </field> </record> - <record id="plan_listing" model="ir.actions.act_window"> + <record id="hr_plan_action" model="ir.actions.act_window"> <field name="name">Planning</field> <field name="res_model">hr.plan</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> - <field name="search_view_id" ref="search_view_plan"/> + <field name="search_view_id" ref="hr_plan_view_search"/> </record> - <record id="plan_type_listing" model="ir.actions.act_window"> - <field name="name">Planning type</field> + <record id="hr_plan_activity_type_action" model="ir.actions.act_window"> + <field name="name">Planning Types</field> <field name="res_model">hr.plan.activity.type</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> @@ -129,7 +143,7 @@ <menuitem id="menu_config_plan_types" name="Planning Types" - action="plan_type_listing" + action="hr_plan_activity_type_action" parent="menu_config_plan" groups="base.group_no_one" sequence="99"/> @@ -137,7 +151,7 @@ <menuitem id="menu_config_plan_plan" name="Plans" - action="plan_listing" + action="hr_plan_action" parent="menu_config_plan" groups="group_hr_manager" sequence="100"/> diff --git a/addons/hr/wizard/__init__.py b/addons/hr/wizard/__init__.py index d2c87d24a36..09e602381ea 100644 --- a/addons/hr/wizard/__init__.py +++ b/addons/hr/wizard/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import plan_wizard -from . import departure_wizard +from . import hr_plan_wizard +from . import hr_departure_wizard diff --git a/addons/hr/wizard/departure_wizard.py b/addons/hr/wizard/hr_departure_wizard.py index 9efa96351c3..70405c5b04d 100644 --- a/addons/hr/wizard/departure_wizard.py +++ b/addons/hr/wizard/hr_departure_wizard.py @@ -1,14 +1,21 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import fields, models, _ -from odoo.exceptions import UserError +from odoo import api, fields, models class HrDepartureWizard(models.TransientModel): _name = 'hr.departure.wizard' _description = 'Departure Wizard' + @api.model + def default_get(self, fields): + res = super(HrDepartureWizard, self).default_get(fields) + if (not fields or 'employee_id' in fields) and 'employee_id' not in res: + if self.env.context.get('active_id'): + res['employee_id'] = self.env.context['active_id'] + return res + departure_reason = fields.Selection([ ('fired', 'Fired'), ('resigned', 'Resigned'), @@ -16,11 +23,10 @@ class HrDepartureWizard(models.TransientModel): ], string="Departure Reason", default="fired") departure_description = fields.Text(string="Additional Information") plan_id = fields.Many2one('hr.plan', default=lambda self: self.env['hr.plan'].search([], limit=1)) + employee_id = fields.Many2one('hr.employee', string='Employee', required=True) def action_register_departure(self): - active_id = self.env.context.get('active_id') - - employee = self.env['hr.employee'].browse(active_id) + employee = self.employee_id employee.departure_reason = self.departure_reason employee.departure_description = self.departure_description @@ -29,5 +35,6 @@ class HrDepartureWizard(models.TransientModel): 'res_id': employee.id, 'res_model_id': self.env['ir.model']._get('hr.employee').id, 'activity_type_id': activity_type.activity_type_id.id, + 'summary': activity_type.summary, 'user_id': activity_type.get_responsible_id(employee).id, }) diff --git a/addons/hr/wizard/departure_wizard_views.xml b/addons/hr/wizard/hr_departure_wizard_views.xml index 4e0ca36abfe..58679ba52cd 100644 --- a/addons/hr/wizard/departure_wizard_views.xml +++ b/addons/hr/wizard/hr_departure_wizard_views.xml @@ -9,6 +9,7 @@ <sheet> <group> <field name="plan_id"/> + <field name="employee_id" invisible="1"/> <field name="departure_reason"/> <field name="departure_description"/> </group> diff --git a/addons/hr/wizard/plan_wizard.py b/addons/hr/wizard/hr_plan_wizard.py index b08428829ee..654484f431c 100644 --- a/addons/hr/wizard/plan_wizard.py +++ b/addons/hr/wizard/hr_plan_wizard.py @@ -1,34 +1,40 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import fields, models, _ -from odoo.exceptions import UserError +from odoo import api, fields, models class HrPlanWizard(models.TransientModel): _name = 'hr.plan.wizard' _description = 'Plan Wizard' - plan_id = fields.Many2one('hr.plan', default=lambda self: self.env['hr.plan'].search([], limit=1)) - - def launch(self): - active_id = self.env.context.get('active_id') + @api.model + def default_get(self, fields): + res = super(HrPlanWizard, self).default_get(fields) + if (not fields or 'employee_id' in fields) and 'employee_id' not in res: + if self.env.context.get('active_id'): + res['employee_id'] = self.env.context['active_id'] + return res - rec = self.env['hr.employee'].browse(active_id) + plan_id = fields.Many2one('hr.plan', default=lambda self: self.env['hr.plan'].search([], limit=1)) + employee_id = fields.Many2one('hr.employee', string='Employee', required=True) + @api.multi + def action_launch(self): for activity_type in self.plan_id.plan_activity_type_ids: self.env['mail.activity'].create({ - 'res_id': rec.id, + 'res_id': self.employee_id.id, 'res_model_id': self.env['ir.model']._get('hr.employee').id, + 'summary': activity_type.summary, 'activity_type_id': activity_type.activity_type_id.id, - 'user_id': activity_type.get_responsible_id(rec).id, + 'user_id': activity_type.get_responsible_id(self.employee_id).id, }) return { 'type': 'ir.actions.act_window', 'res_model': 'hr.employee', - 'res_id': active_id, - 'name': rec.display_name, + 'res_id': self.employee_id.id, + 'name': self.employee_id.display_name, 'view_type': 'form', 'view_mode': 'form', 'views': [(False, "form")], diff --git a/addons/hr/wizard/plan_wizard_views.xml b/addons/hr/wizard/hr_plan_wizard_views.xml index b6829e17ea3..592759bb631 100644 --- a/addons/hr/wizard/plan_wizard_views.xml +++ b/addons/hr/wizard/hr_plan_wizard_views.xml @@ -9,10 +9,11 @@ <sheet> <group> <field name="plan_id"/> + <field name="employee_id" invisible="1"/> </group> </sheet> <footer> - <button name="launch" string="Launch Plan" type="object" class="oe_highlight" groups="hr.group_hr_manager"/> + <button name="action_launch" string="Launch Plan" type="object" class="oe_highlight" groups="hr.group_hr_manager"/> <button string="Cancel" class="btn-secondary" special="cancel"/> </footer> </form> |
