具有值user.id的Odoo v9域过滤器会引发用户未定义的错误

问题描述 投票:0回答:1

我们有一个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系统值,都会发生这种情况。例如:

  • user.partner_id
  • user.那么
  • user.ID

唯一没有通过错误的是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]]

关于我做错的任何线索都会受到欢迎。

python xml python-2.7 odoo odoo-9
1个回答
1
投票

问题是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 createwrite 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

这必须肯定,但它不是很干净。

© www.soinside.com 2019 - 2024. All rights reserved.