我们有一个V9 odoo运行的实例。域筛选器与评估值一起使用的任何位置都会引发错误。
例如,在res.users searchview上我创建了一个简单的域过滤器:
[('id', '=', user.id)]
应用此筛选器时,将引发以下错误:
错误:无法评估搜索条件:{“code”:400,“message”:“评估错误”,“数据”:{“type”:“local_exception”,“debug”:“本地评估失败\ n名称错误:名称'用户'未定义\ n \ n {\“domains \”:[[],\“['id','=',user.id] \”],\“contexts \”:[{\“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>
“我的部门”是来自机会的过滤器菜单中的可用过滤器。但是,选中时会抛出“user”未定义的错误。
我尝试在XML中添加域过滤器并使用技术设置中的高级过滤器无济于事。
我在两个单独的v9实例中尝试了这个,结果相同。
尝试在v11的新实例中添加任何域过滤器,如下所示,使用user.id或uid会返回“域过滤器未正确形成”错误。
[["name","=",user.id]]
关于我做错的任何线索都会受到欢迎。
问题是user
是一个变量,遗憾的是只有在编写特定模型的记录时才可用,例如ir.rule
(这里你可以在user
字段中使用domain_force
)。
因此,在搜索视图中不存在该变量,这就是您收到错误的原因。
看看规则官方文档:https://www.odoo.com/documentation/8.0/reference/security.html
用于检查给定记录是否与规则匹配(且可访问)或不匹配(且不可访问)的域。在上下文中使用两个变量评估域:user是当前用户的记录,time是时间模块
所以你正在寻找的解决方案就是这个:
在my_division
模型中创建一个名为crm.opportunity
的新计算字段:
@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
这必须肯定,但它不是很干净。