[IMP] hr: create employees/users from eachother

The goal is to make it easier to link employees to users.
We can now directly create an employee from the 'invite' user form view
As well as create a new user from a form view using an action.

TaskId-2762247

closes odoo/odoo#85428

Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
William Braeckman
2022-03-14 12:47:40 +00:00
parent 1b7fb828e0
commit 717e03f51a
4 changed files with 62 additions and 0 deletions
+16
View File
@@ -157,6 +157,22 @@ class HrEmployeePrivate(models.Model):
avatar = base64.b64encode(employee._avatar_get_placeholder())
employee[avatar_field] = avatar
def action_create_user(self):
self.ensure_one()
if self.user_id:
raise ValidationError(_("This employee already has an user."))
return {
'name': _('Create User'),
'type': 'ir.actions.act_window',
'res_model': 'res.users',
'view_mode': 'form',
'view_id': self.env.ref('base.view_users_simple_form').id,
'target': 'new',
'context': {
'default_create_employee_id': self.id,
}
}
def name_get(self):
if self.check_access_rights('read', raise_exception=False):
return super(HrEmployeePrivate, self).name_get()
+22
View File
@@ -139,6 +139,9 @@ class User(models.Model):
employee_type = fields.Selection(related='employee_id.employee_type', readonly=False, related_sudo=False)
employee_resource_calendar_id = fields.Many2one(related='employee_id.resource_calendar_id', string="Employee's Working Hours", readonly=True)
create_employee = fields.Boolean(store=False, default=True, string="Technical field, whether to create an employee")
create_employee_id = fields.Many2one('hr.employee', store=False, string="Technical field, bind user to this employee on create")
can_edit = fields.Boolean(compute='_compute_can_edit')
is_system = fields.Boolean(compute="_compute_is_system")
@@ -189,6 +192,25 @@ class User(models.Model):
result['toolbar']['action'] = [act for act in result['toolbar']['action'] if act['id'] != change_password_action.id]
return result
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
employee_create_vals = []
for user, vals in zip(res, vals_list):
if not vals.get('create_employee') and not vals.get('create_employee_id'):
continue
if vals.get('create_employee_id'):
self.env['hr.employee'].browse(vals.get('create_employee_id')).user_id = user
else:
employee_create_vals.append(dict(
name=user.name,
company_id=user.env.company.id,
**self.env['hr.employee']._sync_user(user)
))
if employee_create_vals:
self.env['hr.employee'].create(employee_create_vals)
return res
def write(self, vals):
"""
Synchronize user and its related employee
+12
View File
@@ -404,6 +404,18 @@
</field>
</record>
<record id="action_hr_employee_create_user" model="ir.actions.server">
<field name="name">Create User</field>
<field name="model_id" ref="model_hr_employee"/>
<field name="binding_model_id" ref="model_hr_employee"/>
<field name="binding_view_types">form</field>
<field name="groups_id" eval="[(4, ref('base.group_erp_manager'))]"/>
<field name="state">code</field>
<field name="code">
action = records.action_create_user()
</field>
</record>
<record id="act_employee_from_department" model="ir.actions.act_window">
<field name="name">Employees</field>
<field name="res_model">hr.employee</field>
+12
View File
@@ -199,6 +199,18 @@
</field>
</record>
<record id="view_users_simple_form_inherit_hr" model="ir.ui.view">
<field name="name">view.users.simple.form.inherit.hr</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_simple_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='mobile']" position="after">
<field name="create_employee" force_save="1" string="Create Employee"/>
<field name="create_employee_id" force_save="1" invisible="1"/>
</xpath>
</field>
</record>
<record id="res_users_action_my" model="ir.actions.act_window">
<field name="name">Change my Preferences</field>
<field name="res_model">res.users</field>