You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 15中如何为特定组批量设置所有已安装应用的只读权限

Odoo 15 批量设置内部用户组所有应用只读权限方案

仅通过 ir.model.access.csv 静态配置无法实现自动覆盖所有已安装及后续新增应用模型的权限需求,必须通过 Python 代码动态处理。以下是具体实现方案:

核心思路

  1. 用初始化钩子处理当前已安装的所有模型,批量添加/更新内部用户组的只读权限
  2. 监听模型创建事件,为后续安装新应用时新增的模型自动配置只读权限
  3. 排除系统核心模型(如权限配置、模块管理类),避免破坏系统基础功能

具体实现代码

在自定义模块的 models 目录下创建 security_auto.py 文件,写入以下代码:

from odoo import models, api, SUPERUSER_ID

def _setup_readonly_access_for_internal_users(cr, registry):
    """模块安装/升级时,为已安装模型批量配置内部用户只读权限"""
    env = api.Environment(cr, SUPERUSER_ID, {})
    internal_group = env.ref('base.group_user')
    
    # 排除无需设置的系统核心模型,可根据需求调整
    excluded_models = [
        'ir.model.access', 'ir.module.module', 'ir.config_parameter',
        'ir.ui.view', 'ir.actions.act_window', 'ir.model.fields'
    ]
    
    # 获取所有已安装的业务模型
    installed_models = env['ir.model'].search([
        ('state', '=', 'base'),
        ('model', 'not in', excluded_models)
    ])
    
    for model in installed_models:
        # 检查是否已有该组的权限记录,避免重复创建
        existing_access = env['ir.model.access'].search([
            ('model_id', '=', model.id),
            ('group_id', '=', internal_group.id)
        ], limit=1)
        
        if existing_access:
            # 更新为只读权限
            existing_access.write({
                'perm_read': True,
                'perm_write': False,
                'perm_create': False,
                'perm_unlink': False
            })
        else:
            # 创建新的只读权限记录
            env['ir.model.access'].create({
                'name': f'{model.model}_readonly_internal',
                'model_id': model.id,
                'group_id': internal_group.id,
                'perm_read': True,
                'perm_write': False,
                'perm_create': False,
                'perm_unlink': False
            })

class IrModel(models.Model):
    _inherit = 'ir.model'

    @api.model_create_multi
    def create(self, vals_list):
        """监听新模型创建事件,自动为内部用户组添加只读权限"""
        new_models = super().create(vals_list)
        internal_group = self.env.ref('base.group_user')
        
        excluded_models = [
            'ir.model.access', 'ir.module.module', 'ir.config_parameter',
            'ir.ui.view', 'ir.actions.act_window', 'ir.model.fields'
        ]
        
        for model in new_models:
            if model.model not in excluded_models:
                existing_access = self.env['ir.model.access'].search([
                    ('model_id', '=', model.id),
                    ('group_id', '=', internal_group.id)
                ], limit=1)
                
                if not existing_access:
                    self.env['ir.model.access'].create({
                        'name': f'{model.model}_readonly_internal',
                        'model_id': model.id,
                        'group_id': internal_group.id,
                        'perm_read': True,
                        'perm_write': False,
                        'perm_create': False,
                        'perm_unlink': False
                    })
        
        return new_models

模块配置

  1. 在自定义模块的 __init__.py 文件中导入上述代码:
from .models import security_auto
  1. 在模块的 __manifest__.py 中添加初始化钩子:
'post_init_hook': 'security_auto._setup_readonly_access_for_internal_users',

操作步骤

  1. 安装/升级自定义模块,初始化钩子会自动处理所有已安装模型的权限配置
  2. 后续安装新应用时,新模型创建后会自动为内部用户组添加只读权限

注意事项

  • 代码中排除的系统核心模型可根据实际需求调整,避免修改系统基础权限导致功能异常
  • 测试时建议先在测试环境验证,确认权限配置符合预期后再部署到生产环境

内容的提问来源于stack exchange,提问作者user1261494

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:45:54