首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用值v9的Odoo user.id域筛选器引发用户未定义的错误

使用值v9的Odoo user.id域筛选器引发用户未定义的错误
EN

Stack Overflow用户
提问于 2018-03-01 15:05:19
回答 1查看 2.5K关注 0票数 1

我们有一个运行V9 odoo的实例。域筛选器与求值一起使用的任何地方都会引发错误。

例如,在res.users搜索视图上,我创建了一个简单的域过滤器:

代码语言:javascript
复制
[('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系统值,都会发生这种情况。例如:

  • user.partner_id
  • user.name
  • user.id

唯一没有通过错误执行的是uid,即

代码语言:javascript
复制
[('id', '=', uid)]

访问用户的目的是访问与当前用户相关的进一步值。我要创建的域筛选器的全部代码如下:

代码语言:javascript
复制
<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返回“域筛选器未正确形成”错误。

代码语言:javascript
复制
[["name","=",user.id]]

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

EN

回答 1

Stack Overflow用户

发布于 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的新计算字段:

代码语言:javascript
复制
@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等)中。然后以这种方式修改搜索筛选器:

代码语言:javascript
复制
<filter string="My Division" name="my_division" domain="[('my_division','=',1)]"/>

那应该管用。让我知道。

编辑

有时,当您创建一个存储在数据库中的计算字段时,它的行为并不像预期的那样(它停止了自身的重新计算)。当我对此感到厌倦的时候,我会做以下的事情(我一点也不喜欢它,但是.我需要继续)。

您可以保留我前面编写的过滤器,但是您必须修改crm.opportunity模型中的一些内容:

首先,让my_division成为一个非计算字段.然后,修改crm.opportunity createwrite ORM方法(小心使用super --不要完全写CrmOpportunity,写您为Python类选择的名称):

代码语言:javascript
复制
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

这肯定管用,但它不太干净。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49052586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档