Python 对res.partner上的“write”进行高级访问

Python 对res.partner上的“write”进行高级访问,python,security,acl,odoo,odoo-10,Python,Security,Acl,Odoo,Odoo 10,通过参数(VAL)提供给write()的数据是否可以从方法检查访问权限中访问 我从res.partner继承并重写了方法check\u access\u rights,目的是允许在res.partner上没有写权限的用户更新子id(该伙伴的)如果该子id是由该用户创建的(create\u uid=user.id)。我希望能够在某个地方(在方法write或check\u access\u rights中)实现这个伪代码: if `the user belongs to a group "Group

通过参数(
VAL
)提供给
write()
的数据是否可以从方法
检查访问权限
中访问

我从
res.partner
继承并重写了方法
check\u access\u rights
,目的是允许在
res.partner
上没有写权限的用户更新
子id
(该伙伴的)如果该子id是由该用户创建的(create\u uid=user.id)。我希望能够在某个地方(在方法
write
check\u access\u rights
中)实现这个伪代码:

if `the user belongs to a group "GroupX"` and `user tries to only update field "child_ids" with records that are created by that user`
    then `allow this write operation on res.partner`
    else `raise AccessError`
要允许用户(来自“组X”)修改他创建的res.partner对象,并允许修改任何人创建的res.partner对象上的子对象ID,请执行以下操作:

首先创建一个组“X组”,其权限为:a)r、w、c、u关于res.partner;b) r,w,c在ir上的性质

然后创建一个从res.partner继承的类,并重写方法
write

# -*- coding: utf-8 -*-

class InheritedResPartner(models.Model):
    """Description""" 
    _inherit = 'res.partner'

    @api.multi
    def write(self, vals):
        is_in_group = 'Group X' in map(lambda x: x.name, self.env.user.groups_id)
        if is_in_group:
            operation = 'write'
            owns_record = self.create_uid == self.env.user

            if owns_record:
                True
            else:
                allowed = True

                # Do all checks further and set `allowed` to either True or False 
                ...<omitted intentionaly> put your logic here
                #

                if not allowed:
                    raise AccessError(_('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % (self._description, operation))
        return super(InheritedResPartner, self).write(vals)
#-*-编码:utf-8-*-
类InheritedResPartner(models.Model):
“说明”
_继承='res.partner'
@api.multi
def写入(自身、VAL):
is_in_group='groupx'在映射中(lambda X:X.name,self.env.user.groups_id)
如果_在_组中:
操作='write'
owns_record=self.create_uid==self.env.user
如有记录:
真的
其他:
允许=真
#进一步执行所有检查,并将'allowed'设置为True或False
... 把你的逻辑放在这里
#
如果不允许:
raise ACCESS ERROR(\由于安全限制,请求的操作无法完成。请与系统管理员联系。\n\n(文档类型:%s,操作:%s)%(自我描述,操作))
return super(InheritedResPartner,self).write(VAL)

注意:我们授予res.partner的完全权限,但如果检测到不需要的操作,我们将重写write方法并引发AccessError。

直接重写
res.partner的
write()
,并在提供的子ID条目无法由编写用户写入时发出警告如何?您好@CZoellner这有效!请添加为答案:)。只需将您的最终代码作为答案发布。我刚才给了一个建议;-)@CZoellner发布:)。无论如何,非常感谢你的建议:)。