Odoo字段访问权限/规则

时间:2015-08-13 12:05:06

标签: python xml python-2.7 odoo

我想让记录中的某些字段对于在字段forbridden_user中选择的用户不可编辑。但不是所有的领域。某些字段仍然可以为他编辑。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:4)

这里有两个不同的问题:

  1. 使字段在表单中显示为只读。
  2. 保护它以便真正无法修改。
  3. 这些是不同的问题,通过仅解决第一点,您将来可能会感到非常不愉快。

    不幸的是,Odoo没有附带每字段权限框架(you can read my rant about this here)。

    如果您愿意,可以use a module I created while working on a project, that addresses this very issue

    下载模块并将protected_fields添加到模块的依赖项后,您将执行以下操作:

    class YourModel(models.Model):
        _name = 'your.model'
        _inherit = [
            'protected_fields.mixin',
        ]
        _protected_fields = ['field_you_want_to_protect']
    
        field_you_want_to_protect = fields.Char()
        forbridden_user = fields.Many2one('res.users')
        current_user_forbidden = fields.Boolean(compute="_compute_current_user_forbidden")
    
        @api.one
        @api.depends('forbridden_user')
        def _compute_current_user_forbidden(self):
            """
            Compute a field indicating whether the current user
            shouldn't be able to edit some fields.
            """
            self.current_user_forbidden = (self.forbridden_user == self.env.user)
    
        @api.multi
        def _is_permitted(self):
            """
            Allow only authorised users to modify protected fields
            """
            permitted = super(DetailedReport, self)._is_permitted()
            return permitted or not self.current_user_forbidden
    

    这将负责安全地保护服务器端的字段,并另外创建current_user_forbidden字段。当当前用户等于True时,该字段将设置为forbridden_user。我们可以在客户端使用它来使受保护的字段显示为只读。

    将计算字段添加到视图中(作为不可见字段 - 我们只需要使其值可用)并将attrs属性添加到要保护的字段中,并使用一个域当current_user_forbidden字段为True时,使该字段显示为只读:

    <field name="current_user_forbidden" invisible="1"/>
    <field name="field_you_want_to_protect" attrs="{'readonly': [('current_user_forbidden', '=', True)]}"/>
    

    当然,您应该使用自己想要保护的字段而不是field_you_want_to_protect