2016-01-11 31 views
0

这个问题从这里开始:How to manage security with One2many fields in Odoo?。但是现在,我简化了这个问题,问题不一样。如何管理Odoo 8中的相关字段和权限?

的环境和问题是相同的:

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自动生成。

问题

我有谁可以创建和修改的孩子,而不是母亲的用户。当该用户创建该孩子时,安全错误会提示用户属于无法修改模型的组。这是由于行related='mother_id.is_a_good_mother',如果我删除它,并且我创建一个新的孩子,ORM write方法母亲未被调用。

所以,如果具有了个关子指着一个任何领域,与您共创的新纪录,ORM write方法的被调用。

我有一个安全组my_group,与read 1 create 1 write 1 unlink 1read 1 create 0 write 0 unlink 0。由于此群组的用户无法编写A,因此创建B记录时发生错误。

我该如何避免这个错误?我曾尝试过related_sudo=True,但它没有奏效,可能是我没有很好地使用它。

任何人都可以帮助我吗?

+1

用于创建子项的表单是否包含“has_a_good_mother”字段?如果是这样的字段只读或不是? –

+0

是的,它的确如此,它不是只读的。 – forvas

+0

@LudwikTrammer这就是问题所在!我必须将相关字段设置为只读,否则调用ORM'write'方法。把你的评论作为答案,我会把它设置为正确的。非常感谢你! – forvas

回答

2

相关字段值存储在“母亲”对象的原始字段中。因此,当您尝试在“子”对象上进行更改时,Odoo会在幕后对其进行更新。如果进行更改的用户没有更改“母亲”对象的权限,则会引发异常。

您需要确保无权更改目标对象的用户无法设置/更改指向该对象的相关字段的值。例如,您可以只读(readonly=True)。