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发布:)。无论如何,非常感谢你的建议:)。