添加功能

This commit is contained in:
李鹏宇
2026-07-01 17:25:13 +08:00
parent 58430510f3
commit cf53b7a822
@@ -393,7 +393,8 @@ class YuthonHrEmployee(models.Model):
groups_by_role_group.write({'users': [(4, employee.user_id.id)]})
def write(self, vals):
"""覆盖 write,user_role_id / user_role_ids 变更时反向同步到角色的 personnel_ids"""
"""覆盖 write,user_role_id / user_role_ids 变更时反向同步到角色的 personnel_ids,
并正向同步到 res.groups 的用户明细行"""
role_fields = {'user_role_id', 'user_role_ids'}
if not role_fields.intersection(vals.keys()):
return super().write(vals)
@@ -428,6 +429,61 @@ class YuthonHrEmployee(models.Model):
role = self.env['soong.user.role'].browse(rid)
if emp.id in role.personnel_ids.ids:
role.write({'personnel_ids': [(3, emp.id)]})
# --- 权限组同步 ---
if not emp.user_id:
continue
# 收集当前所有角色ID(主角色 + 辅助角色)
current_role_ids = set()
if emp.user_role_id:
current_role_ids.add(emp.user_role_id.id)
if emp.user_role_ids:
current_role_ids.update(emp.user_role_ids.ids)
# 收集被移除的角色ID
removed_role_ids = set()
if 'user_role_id' in vals:
old_rid = old_role_id_map.get(emp.id)
new_rid = emp.user_role_id.id if emp.user_role_id else False
if old_rid and old_rid != new_rid:
removed_role_ids.add(old_rid)
if 'user_role_ids' in vals:
old_rids_set = old_role_ids_map.get(emp.id, set())
new_rids_set = set(emp.user_role_ids.ids)
removed_role_ids.update(old_rids_set - new_rids_set)
# 收集被添加的角色ID
added_role_ids = set()
if 'user_role_id' in vals:
old_rid = old_role_id_map.get(emp.id)
new_rid = emp.user_role_id.id if emp.user_role_id else False
if new_rid and new_rid != old_rid:
added_role_ids.add(new_rid)
if 'user_role_ids' in vals:
old_rids_set = old_role_ids_map.get(emp.id, set())
new_rids_set = set(emp.user_role_ids.ids)
added_role_ids.update(new_rids_set - old_rids_set)
# 1. 新增角色对应的权限组:把员工的用户加进去
if added_role_ids:
groups_to_add = self.env['res.groups'].sudo().search([
('user_role_ids', 'in', list(added_role_ids))
])
for group in groups_to_add:
if emp.user_id.id not in group.users.ids:
group.sudo().write({'users': [(4, emp.user_id.id)]})
# 2. 移除角色对应的权限组:若员工在该组不再有任何角色交集,则把用户移除
if removed_role_ids:
groups_to_check = self.env['res.groups'].sudo().search([
('user_role_ids', 'in', list(removed_role_ids))
])
for group in groups_to_check:
group_role_ids = set(group.user_role_ids.ids)
if not (group_role_ids & current_role_ids):
if emp.user_id.id in group.users.ids:
group.sudo().write({'users': [(3, emp.user_id.id)]})
return result
def update_trade_union(self):