如何管理Odoo 8中的相关字段和权限?

时间:2016-01-11 11:22:53

标签: python-2.7 openerp odoo-8

这个问题从这里开始: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,但它不起作用,可能是我没有好好使用它。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

相关字段值存储在"母亲"的原始字段中。宾语。所以,当你试图在"孩子身上改变它时#34;对象,这是Odoo在幕后更新它的地方。如果进行更改的用户没有权限更改"母亲"对象,将引发异常。

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