78 lines
3.4 KiB
Python
78 lines
3.4 KiB
Python
from odoo import models, api
|
|
|
|
class ResUsers(models.Model):
|
|
_inherit = 'res.users'
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
# Pre-process vals to ensure primary company_id is always in allowed company_ids
|
|
# This prevents Odoo's _check_user_company ValidationError when template users have different company_ids
|
|
for vals in vals_list:
|
|
company_id = vals.get('company_id')
|
|
if company_id:
|
|
if 'company_ids' in vals:
|
|
company_ids_commands = vals['company_ids']
|
|
existing_ids = set()
|
|
has_six = False
|
|
six_index = -1
|
|
for idx, cmd in enumerate(company_ids_commands):
|
|
if isinstance(cmd, (list, tuple)) and len(cmd) >= 3:
|
|
if cmd[0] == 6:
|
|
existing_ids.update(cmd[2])
|
|
has_six = True
|
|
six_index = idx
|
|
elif cmd[0] == 4:
|
|
existing_ids.add(cmd[1])
|
|
|
|
if company_id not in existing_ids:
|
|
if has_six and six_index != -1:
|
|
cmd = list(company_ids_commands[six_index])
|
|
cmd[2] = list(cmd[2]) + [company_id]
|
|
company_ids_commands[six_index] = tuple(cmd)
|
|
else:
|
|
company_ids_commands.append((4, company_id))
|
|
else:
|
|
vals['company_ids'] = [(6, 0, [company_id])]
|
|
|
|
users = super().create(vals_list)
|
|
users.sudo()._sync_employee_company_ids()
|
|
return users
|
|
|
|
def write(self, vals):
|
|
# Pre-process vals to ensure primary company_id is always in allowed company_ids
|
|
company_id = vals.get('company_id')
|
|
if company_id:
|
|
has_company_ids = 'company_ids' in vals
|
|
existing_ids = set()
|
|
if has_company_ids:
|
|
for cmd in vals['company_ids']:
|
|
if isinstance(cmd, (list, tuple)) and len(cmd) >= 3:
|
|
if cmd[0] == 6:
|
|
existing_ids.update(cmd[2])
|
|
elif cmd[0] == 4:
|
|
existing_ids.add(cmd[1])
|
|
|
|
for user in self:
|
|
user_allowed = set(user.company_ids.ids)
|
|
if has_company_ids:
|
|
if company_id not in existing_ids:
|
|
vals['company_ids'] = list(vals['company_ids']) + [(4, company_id)]
|
|
else:
|
|
if company_id not in user_allowed:
|
|
vals['company_ids'] = [(4, company_id)]
|
|
|
|
res = super().write(vals)
|
|
if any(f in vals for f in ['company_id', 'company_ids']):
|
|
self.sudo()._sync_employee_company_ids()
|
|
return res
|
|
|
|
def _sync_employee_company_ids(self):
|
|
for user in self:
|
|
employee_companies = user.employee_ids.mapped('company_ids')
|
|
employee_primary_companies = user.employee_ids.mapped('company_id')
|
|
companies_to_add = (employee_companies | employee_primary_companies | user.company_id) - user.company_ids
|
|
if companies_to_add:
|
|
user.write({
|
|
'company_ids': [(4, cid.id) for cid in companies_to_add]
|
|
})
|