我们有一个运行V9 odoo的实例。域筛选器与求值一起使用的任何地方都会引发错误。
例如,在res.users搜索视图上,我创建了一个简单的域过滤器:
[('id', '=', user.id)]应用此筛选器时,将引发以下错误:
错误:计算搜索标准失败:{“代码”:400,“消息”:“评估错误”,“数据”:{“类型”:“local_exception”,“调试”:“本地评估失败\nNameError:未定义名称‘用户’\n\n\\”域\:[[],\‘id’,'=',user.id\‘],\“上下文”:{\“lang\”:\“en_GB\”,\"tz\":\"Asia/Saigon\",\"uid\":566,\“params\”:{\“action\\”:69,\“页面\”:0,\“限制\”:80,\"view_type\":\"list\",\“res.users\\”:\“res.users\”,\"menu_id\":79,“_push_me\”:false},\"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]]任何关于我做错了什么的线索都会受到欢迎。
发布于 2018-03-02 09:28:38
问题是,user是一个变量,不幸的是只有在从特定模型写入记录时才可用,例如ir.rule (在domain_force字段中可以使用user )。
所以这个变量不存在于搜索视图中,这就是为什么您会得到错误。
看看规则--正式文档:https://www.odoo.com/documentation/8.0/reference/security.html
用于检查给定记录是否与规则匹配(并且是可访问的)或不匹配(且不可访问)的域。域在上下文中由两个变量计算:用户是当前用户的记录,时间是时间模块
所以你要找的解决方案是这个:
在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,
)将此字段(不可见)添加到可以搜索的视图(树、kanban等)中。然后以这种方式修改搜索筛选器:
<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这肯定管用,但它不太干净。
https://stackoverflow.com/questions/49052586
复制相似问题