自定义字段不尊重访问权限

Custom field doesn't respect access rights

我通过继承 (res.users) 模块创建了一个新字段(签名图像),将显示在“我的个人资料”部分。

_inherit = 'res.users'
signature_image = fields.Binary()

现在,用户可以更改个人资料部分的所有内容(包括图像和时区等),但无法更改新字段。

用户收到权限错误消息。

You are not allowed to modify 'Users' (res.users) records.

This operation is allowed for the following groups:

  • Administration/Access Rights

为什么这个新字段不遵循模块的访问规则并且与其他字段的行为不同?

这看起来确实很奇怪,但现在是许多版本的默认行为。

向模型 res.users 添加新字段时,您必须将这些字段添加到它后面的 class 的特殊属性中。

您可以在模块 hrsale_stock 中找到示例。

对于 Odoo 14 或一些更早的版本,您必须覆盖 class' __init__ 并将您的字段添加到特殊属性,like this

class Users(models.Model):
    _inherit = ['res.users']

    property_warehouse_id = fields.Many2one('stock.warehouse', string='Default Warehouse', company_dependent=True, check_company=True)

    def __init__(self, pool, cr):
        """ Override of __init__ to add access rights.
            Access rights are disabled by default, but allowed
            on some specific fields defined in self.SELF_{READ/WRITE}ABLE_FIELDS.
        """

        sale_stock_writeable_fields = [
            'property_warehouse_id',
        ]

        init_res = super().__init__(pool, cr)
        # duplicate list to avoid modifying the original reference
        type(self).SELF_READABLE_FIELDS = type(self).SELF_READABLE_FIELDS + sale_stock_writeable_fields
        type(self).SELF_WRITEABLE_FIELDS = type(self).SELF_WRITEABLE_FIELDS + sale_stock_writeable_fields
        return init_res

在 Odoo 15 中,所有内容都更改为 python 属性。但是你可以在相同的模块上找到新的例子,like this:

class Users(models.Model):
    _inherit = ['res.users']

    property_warehouse_id = fields.Many2one('stock.warehouse', string='Default Warehouse', company_dependent=True, check_company=True)

    @property
    def SELF_READABLE_FIELDS(self):
        return super().SELF_READABLE_FIELDS + ['property_warehouse_id']

    @property
    def SELF_WRITEABLE_FIELDS(self):
        return super().SELF_WRITEABLE_FIELDS + ['property_warehouse_id']