109 lines
5.2 KiB
Python
109 lines
5.2 KiB
Python
from odoo import models, fields, api
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AppletSecurityQuickPermWizard(models.TransientModel):
|
|
_name = 'applet.security.quick.perm.wizard'
|
|
_description = '快速调整权限'
|
|
|
|
add_unlink = fields.Selection([('add', '添加'), ('unlink', '删除')], default="add", string="操作")
|
|
department_ids = fields.Many2many('hr.department', string="部门")
|
|
user_role_ids = fields.Many2many('soong.user.role', string="角色")
|
|
applet_security_ids = fields.Many2many('applet.security', string="权限记录集")
|
|
applet_security_setting_ids = fields.Many2many('applet.security.setting', string='权限板块')
|
|
|
|
@api.onchange('department_ids', 'user_role_ids')
|
|
def _onchange_department_role(self):
|
|
"""根据选择的部门或角色过滤权限记录集"""
|
|
_logger.info("="*50)
|
|
_logger.info(f"触发 onchange - 选择的部门: {self.department_ids.mapped('name')}")
|
|
_logger.info(f"触发 onchange - 选择的角色: {self.user_role_ids.mapped('name')}")
|
|
_logger.info(f"触发 onchange - 当前权限记录集: {self.applet_security_ids.ids}")
|
|
|
|
# 获取部门及其所有子部门
|
|
all_department_ids = []
|
|
if self.department_ids:
|
|
# 使用 _origin 获取真实记录,然后获取真实 ID
|
|
dept_ids = []
|
|
for dept in self.department_ids:
|
|
# 尝试获取真实 ID
|
|
real_id = dept._origin.id if hasattr(dept, '_origin') and dept._origin else dept.id
|
|
if real_id and isinstance(real_id, int):
|
|
dept_ids.append(real_id)
|
|
|
|
_logger.info(f"选择的部门真实IDs: {dept_ids}")
|
|
|
|
if dept_ids:
|
|
# 使用 child_of 一次性获取所有部门及其子部门
|
|
try:
|
|
all_depts = self.env['hr.department'].search([('id', 'child_of', dept_ids)])
|
|
all_department_ids = all_depts.ids
|
|
_logger.info(f"包含子部门后的部门IDs: {all_department_ids}")
|
|
except Exception as e:
|
|
_logger.error(f"搜索子部门时出错: {e}")
|
|
# 如果出错,至少使用选择的部门本身
|
|
all_department_ids = dept_ids
|
|
|
|
domain = []
|
|
if all_department_ids:
|
|
domain.append(('employee_id.department_id', 'in', all_department_ids))
|
|
if self.user_role_ids:
|
|
domain.append(('employee_id.user_role_ids', 'in', self.user_role_ids.ids))
|
|
|
|
result = {}
|
|
|
|
# 如果有已选择的权限记录集,需要过滤掉不符合条件的
|
|
if self.applet_security_ids:
|
|
_logger.info("开始过滤已选记录...")
|
|
for rec in self.applet_security_ids:
|
|
dept_name = rec.employee_id.department_id.name if rec.employee_id.department_id else 'None'
|
|
dept_id = rec.employee_id.department_id.id if rec.employee_id.department_id else None
|
|
_logger.info(f" 记录ID={rec.id}, 员工={rec.employee_id.name}, 员工部门={dept_name}(ID={dept_id})")
|
|
|
|
filtered_ids = self.applet_security_ids
|
|
|
|
# 根据部门过滤(包含子部门)
|
|
if all_department_ids:
|
|
_logger.info(f"按部门过滤,目标部门IDs(含子部门): {all_department_ids}")
|
|
filtered_ids = filtered_ids.filtered(
|
|
lambda r: r.employee_id.department_id and r.employee_id.department_id.id in all_department_ids
|
|
)
|
|
_logger.info(f"部门过滤后剩余: {filtered_ids.ids}")
|
|
|
|
# 根据角色过滤
|
|
if self.user_role_ids:
|
|
_logger.info(f"按角色过滤,目标角色IDs: {self.user_role_ids.ids}")
|
|
filtered_ids = filtered_ids.filtered(
|
|
lambda r: any(role.id in self.user_role_ids.ids for role in r.employee_id.user_role_ids)
|
|
)
|
|
_logger.info(f"角色过滤后剩余: {filtered_ids.ids}")
|
|
|
|
_logger.info(f"最终过滤后的IDs: {filtered_ids.ids}")
|
|
# 使用 value 来更新字段值
|
|
result['value'] = {'applet_security_ids': [(6, 0, filtered_ids.ids)]}
|
|
|
|
# 设置 domain
|
|
if domain:
|
|
result['domain'] = {'applet_security_ids': domain}
|
|
else:
|
|
result['domain'] = {'applet_security_ids': []}
|
|
|
|
return result
|
|
|
|
def confirm(self):
|
|
"""确认添加或删除权限板块"""
|
|
if self.add_unlink == 'add':
|
|
# 添加权限板块
|
|
for applet in self.applet_security_ids:
|
|
applet.write({
|
|
'applet_security_setting_ids': [(4, setting_id) for setting_id in self.applet_security_setting_ids.ids]
|
|
})
|
|
elif self.add_unlink == 'unlink':
|
|
# 删除权限板块
|
|
for applet in self.applet_security_ids:
|
|
applet.write({
|
|
'applet_security_setting_ids': [(3, setting_id) for setting_id in self.applet_security_setting_ids.ids]
|
|
})
|