小程序权限管理过滤、删除、菜单配置日期倒序
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
<field name="name">菜单配置</field>
|
||||
<field name="res_model">yuthon.menu.setting</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="context">{'default_order': 'menu_date desc'}</field>
|
||||
</record>
|
||||
<record id="yuthon_dishes_setting_tree" model="ir.ui.view">
|
||||
<field name="name">yuthon_dishes_setting_tree</field>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<field name="add_unlink" widget="radio"/>
|
||||
<field name="department_ids" widget="many2many_tags"/>
|
||||
<field name="user_role_ids" widget="many2many_tags"/>
|
||||
<field name="applet_security_ids" widget="many2many_tags" domain="[('department_id', 'in', department_ids)]"/>
|
||||
<field name="applet_security_ids" widget="many2many_tags"/>
|
||||
<field name="applet_security_setting_ids" widget="many2many_tags"/>
|
||||
</group>
|
||||
<footer>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
from odoo import models, fields
|
||||
from odoo import models, fields, api
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AppletSecurityQuickPermWizard(models.TransientModel):
|
||||
@@ -11,6 +14,95 @@ class AppletSecurityQuickPermWizard(models.TransientModel):
|
||||
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):
|
||||
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]})
|
||||
"""确认添加或删除权限板块"""
|
||||
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]
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user