[英]Odoo v9 domain filter with value user.id throws error that user is not defined
我们有一个V9 odoo运行的实例。 在将域过滤器与评估值一起使用的任何地方,都会引发错误。
例如,在res.users搜索视图上,我创建了一个简单的域过滤器:
[('id', '=', user.id)]
应用此过滤器时,将引发以下错误:
错误:无法评估搜索条件:{“代码”:400,“消息”:“评估错误”,“数据”:{“类型”:“ local_exception”,“调试”:“本地评估失败\\ nNameError:名称'用户'未定义\\ n \\ n {\\“域\\”:[[],\\“ ['id','=',user.id] \\”],\\“上下文\\”:[{\\“ lang \\ “:\\” EN_GB \\ “\\ ”TZ \\“:\\ ”亚洲/胡志明市\\“,\\ ”UID \\“:566,\\ ”PARAMS \\“:{\\ ”动作\\“:69 \\” 页\\ “:0,\\” 限制\\ “:80,\\” 的view_type \\ “:\\” 目录\\ “\\ ”模型\\“:\\ ”res.users \\“,\\ ”menu_id \\“:79,\\” _ push_me \\ “:假},\\” search_default_no_share \\ “:1},{},\\”{} \\ “],\\” group_by_seq \\ “:[\\”{} \\ “]}”}}
无论使用什么odoo系统值,都会发生这种情况。 例如:
唯一不会出错的是uid,即
[('id', '=', uid)]
访问用户的目的是访问与当前用户有关的其他值。 我尝试创建的域过滤器的整个代码如下:
<record id="crm_opportunity_search_view" model="ir.ui.view">
<field name="name">crm.opportunity.search.view</field>
<field name="model">crm.opportunity</field>
<field name="arch" type="xml">
<search string="Opportunities">
<field name="name" filter_domain="[('name','ilike',self)]"/>
<filter string="My Division" name="my_division" domain="[('owner_id.business_unit_id.id', '=', user.partner_id.business_unit_id.id)]"/>
</search>
</field>
</record>
“我的部门”是机会中过滤器菜单中的可用过滤器。 但是,当选择引发错误时,未定义“用户”。
我尝试在XML中添加域过滤器,并在技术设置中使用高级过滤器无济于事。
我已经在两个单独的v9实例中尝试了相同的结果。
尝试使用以下user.id或uid在v11的新实例中添加任何域过滤器,将返回“域过滤器格式不正确”错误。
[["name","=",user.id]]
任何关于我做错事情的线索都会受到欢迎。
问题是, user
是一个变量,不幸的是,该变量仅在从特定模型写入记录时才可用,例如ir.rule
(您可以在domain_force
字段中使用user
)。
因此该变量在搜索视图中不存在,这就是为什么会出现错误的原因。
看看规则官方文档: https : //www.odoo.com/documentation/8.0/reference/security.html
用于检查给定记录是否符合规则(可访问)或不匹配(且不可访问)的域。 在上下文中使用两个变量评估域:user是当前用户的记录,time是时间模块
因此,您正在寻找的解决方案是:
在crm.opportunity
模型中创建一个名为my_division
的新计算字段:
@api.multi
@api.depends('owner_id', 'owner_id.business_unit_id')
def _compute_my_division(self):
for opportunity in self:
if opportunity.owner_id.business_unit_id.id == self.env.user.partner_id.business_unit_id.id:
opportunity.my_division = True
my_division = fields.Boolean(
compute='_compute_my_division',
string='My division',
store=True,
)
将此字段(不可见)添加到您可以搜索的视图(树,看板等)中。 然后以这种方式修改搜索过滤器:
<filter string="My Division" name="my_division" domain="[('my_division','=',1)]"/>
那应该工作。 让我知道。
编辑
有时,当您创建一个存储在数据库中的计算字段时,它的行为与预期不符(它将停止重新计算自身)。 当我厌倦了为此而苦苦挣扎时,我会做以下技巧(我一点都不喜欢,但是……我需要继续)。
您可以保留我上面写的过滤器,但必须在crm.opportunity
模型中进行一些修改:
首先,将my_division
非计算字段。 然后,修改crm.opportunity
create
并write
ORM方法(注意super
精确地编写CrmOpportunity
,请编写您为Python类选择的名称-):
my_division = fields.Boolean(
string='My division',
default=False,
)
@api.model
def create(self, vals)
opportunity = super(CrmOpportunity, self).create(vals)
if opportunity.owner_id.business_unit_id.id == self.env.user.partner_id.business_unit_id.id:
opportunity.write({
'my_division': True,
})
return opportunity
@api.multi
def write(self, vals)
update = super(CrmOpportunity, self).write(vals)
for opportunity in self:
if opportunity.owner_id.business_unit_id.id == self.env.user.partner_id.business_unit_id.id and \
opportunity.my_division is False:
opportunity.write({
'my_division': True,
})
elif opportunity.owner_id.business_unit_id.id != self.env.user.partner_id.business_unit_id.id and \
opportunity.my_division is True:
opportunity.write({
'my_division': False,
})
else:
continue
return update
这肯定可以工作,但是不是很干净。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.