From 717e03f51a86f71c679fbb46765ac1d145d0bf71 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Fri, 25 Feb 2022 15:39:25 +0000 Subject: [PATCH] [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 --- addons/hr/models/hr_employee.py | 16 ++++++++++++++++ addons/hr/models/res_users.py | 22 ++++++++++++++++++++++ addons/hr/views/hr_employee_views.xml | 12 ++++++++++++ addons/hr/views/res_users.xml | 12 ++++++++++++ 4 files changed, 62 insertions(+) diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py index 857a3927f32..9a299359c70 100644 --- a/addons/hr/models/hr_employee.py +++ b/addons/hr/models/hr_employee.py @@ -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() diff --git a/addons/hr/models/res_users.py b/addons/hr/models/res_users.py index b75d541f4e0..4b142772540 100644 --- a/addons/hr/models/res_users.py +++ b/addons/hr/models/res_users.py @@ -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 diff --git a/addons/hr/views/hr_employee_views.xml b/addons/hr/views/hr_employee_views.xml index 7078a75a1b1..c0f2983f1bc 100644 --- a/addons/hr/views/hr_employee_views.xml +++ b/addons/hr/views/hr_employee_views.xml @@ -404,6 +404,18 @@ + + Create User + + + form + + code + + action = records.action_create_user() + + + Employees hr.employee diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml index d61884c35bb..20b14bafe21 100644 --- a/addons/hr/views/res_users.xml +++ b/addons/hr/views/res_users.xml @@ -199,6 +199,18 @@ + + view.users.simple.form.inherit.hr + res.users + + + + + + + + + Change my Preferences res.users