这个问题从这里开始:How to manage security with One2many fields in Odoo?。但现在,我已经简化了问题,问题就不一样了。
环境和问题是一样的:
class mother(models.Model):
_name = 'mother'
name = fields.Char(string='Name', size=64, required=True)
is_a_good_mother = fields.Boolean(string='Is a good mother?')
@api.multi
def write(self, vals):
_logger.info('I DO NOT KNOW WHY WHEN CREATING A CHILD THIS ORM '
'METHOD IS BEING EXECUTED, RECEIVING THE KEY '
'is_a_good_mother')
return super(mother, self).write(vals)
class child(models.Model):
_name = 'child'
mother_id = fields.Many2one(comodel_name='mother',
string='Mother', ondelete='cascade')
has_a_good_mother = fields.Boolean(
string='Does the child have a good mother?',
related='mother_id.is_a_good_mother',
related_sudo=True)
我有一个菜单选项,可以打开孩子的形式。此表单由Odoo自动生成。
问题
我有一个用户可以创建和修改孩子,但不是母亲。当此用户创建子项时,会出现安全性错误,告知用户属于无法修改 Mother 模型的组。这是由于行related='mother_id.is_a_good_mother'
,如果我将其删除,并且我创建了一个新子项,则不会调用母亲的ORM write
方法。
因此,如果 B 有一个相关的孩子指向 A 的任何字段,并且您创建了 B 的新记录,则ORM {{ 1}} A 的方法被调用。
我有一个安全组 my_group , B 中的write
和 A 中的read 1 create 1 write 1 unlink 1
。由于该群组的用户无法撰写 A ,因此在创建 B 记录时会出错。
如何避免此错误?我尝试了read 1 create 0 write 0 unlink 0
,但它不起作用,可能是我没有好好使用它。
任何人都可以帮助我吗?
答案 0 :(得分:2)
相关字段值存储在"母亲"的原始字段中。宾语。所以,当你试图在"孩子身上改变它时#34;对象,这是Odoo在幕后更新它的地方。如果进行更改的用户没有权限更改"母亲"对象,将引发异常。
您需要确保没有权限更改目标对象的用户无法设置/更改指向该对象的相关字段的值。例如,您可以将其设为只读(readonly=True
)。