summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobot Odoo <xmo+roboto@odoo.com>2019-04-23 13:42:54 +0200
committerGitHub <noreply@github.com>2019-04-23 13:42:54 +0200
commit25c2c5e01209b57ce5e4213d2856a98a0251d0b8 (patch)
tree8b2c34b376e7154c8c41c520c1196893ad225d1e
parent04d5c36dd29db494e05784099f184759ea4ec669 (diff)
parent30871950d2691aa8f357867e02df7f67822661a0 (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__.py4
-rw-r--r--addons/hr/data/hr_data.xml42
-rw-r--r--addons/hr/models/__init__.py3
-rw-r--r--addons/hr/models/hr_plan.py61
-rw-r--r--addons/hr/models/plan.py44
-rw-r--r--addons/hr/views/hr_views.xml48
-rw-r--r--addons/hr/wizard/__init__.py4
-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>