【问题标题】:Odoo v9 domain filter with value user.id throws error that user is not defined具有值 user.id 的 Odoo v9 域过滤器抛出未定义用户的错误
【发布时间】:2018-03-01 15:05:19
【问题描述】:

我们有一个 V9 odoo 实例正在运行。只要域过滤器与评估值一起使用,就会引发错误。

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

[('id', '=', user.id)]

应用此过滤器时会引发以下错误:

错误:无法评估搜索条件: {"code":400,"message":"Evaluation Error","data":{"type":"local_exception","debug":"本地评估失败\nNameError: name 'user' is not defined\n\ n{\"domains\":[[],\"['id', '=', user.id]\"],\"contexts\":[{\"lang\":\"en_GB\" ,\"tz\":\"Asia/Saigon\",\"uid\":566,\"params\":{\"action\":69,\"page\":0,\"limit\ ":80,\"view_type\":\"list\",\"model\":\"res.users\",\"menu_id\":79,\"_push_me\":false},\"search_default_no_share \":1},{},\"{}\"],\"group_by_seq\":[\"{}\"]}"}}

无论使用什么 odoo 系统值,都会发生这种情况。例如:

  • user.partner_id
  • 用户名
  • 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>

“我的部门”是机会过滤器菜单中的一个可用过滤器。 However, when selected throws an error that "user" is not defined.

我尝试在 XML 中添加域过滤器并使用技术设置中的高级过滤器无济于事。

我已经在两个单独的 v9 实例中尝试过,结果相同。

尝试在 v11 的新实例中添加任何域过滤器,如下所示,使用 user.id 或 uid 会返回“域过滤器格式不正确”错误。

[["name","=",user.id]]

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

【问题讨论】:

  • 域是元组列表,以前的版本是这样的:&lt;field name="user_id" filter_domain="[('user_id','=',uid)]" /&gt;
  • 感谢@ChesuCR 的回复,使用以下 filter_domain:[('id', '=', user.id)] 在 v9 中也失败了。
  • 但是,我需要访问/评估当前用户“user.partner_id.business_unit_id.id”的另一个相关值,这是我们在 res.partner 表单中添加的相关字段。

标签: python xml python-2.7 odoo odoo-9


【解决方案1】:

问题在于user 是一个变量,不幸的是,它仅在从特定模型写入记录时可用,例如ir.rule(您可以在domain_force 字段中使用user)。

所以该变量在搜索视图中不存在,这就是您收到错误的原因。

查看规则官方文档:https://www.odoo.com/documentation/8.0/reference/security.html

用于检查给定记录是否匹配规则的域(并且是 可访问)或不可访问(并且不可访问)。域是 在上下文中使用两个变量进行评估:用户是当前用户的 记录和时间是时间模块

所以您正在寻找的解决方案是这个:

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.opportunitycreatewrite 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

这肯定有效,但不是很干净。

【讨论】:

  • 谢谢@forvas,这可以解释事情。那么关于人们如何解决这个问题以拥有基于当前用户相关字段的过滤器的任何想法?
  • 我已经编辑了我的答案来解决你的问题,看看吧。
  • 我尝试了您的代码,它大部分都可以工作,谢谢,因为它创建了一个计算字段并且树视图上有一个隐藏列。奇怪的是,虽然逻辑看起来是正确的,但有来自不同business_units 的机会被显示出来。目前正在尝试调试它,但运气不佳。不同部门的用户,看到的记录好像都是687。
  • 我认为它没有重新计算。我放置了一个调试行,当我删除 store=True 值时,它会尝试计算,但也会抛出一个错误,即搜索必须存储的计算字段。当我更改用户部门时,他们仍然看到相同的 687 条记录。
  • @3piece 有时存储在数据库中的计算字段不会重新计算,这是 Odoo 中的一个难以理解的错误...尝试创建一个新机会并检查它是否有效(不要尝试使用在您的代码更改之前创建的那些)。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2014-12-17
  • 2018-06-04
相关资源
最近更新 更多