自定义字段不尊重访问权限
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 的特殊属性中。
您可以在模块 hr
或 sale_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']
我通过继承 (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 的特殊属性中。
您可以在模块 hr
或 sale_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']