小程序权限管理过滤、删除、菜单配置日期倒序

This commit is contained in:
李鹏宇
2026-02-27 19:38:21 +08:00
parent 30041740fb
commit 34098517ad
3 changed files with 97 additions and 4 deletions
@@ -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]
})