Openerp Odoo-如何从后端设置域筛选器

Openerp Odoo-如何从后端设置域筛选器,openerp,odoo-8,odoo-9,odoo-10,odoo-view,Openerp,Odoo 8,Odoo 9,Odoo 10,Odoo View,我用的是奥多10e。我想做的是在字段\u view\u get方法中设置域条件 @api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): res = super(Customer, self).fields_view_get( view_id=view_id, view_type=view_type, toolbar=too

我用的是奥多10e。我想做的是在
字段\u view\u get
方法中设置域条件

    @api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    res = super(Customer, self).fields_view_get(
        view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    doc = etree.XML(res['arch'])
    if view_type == 'tree':
        if self.env.user.partner_id.parent_id.id is False:
            id = self.env.user.id
        else:
            id = self.env.user.partner_id.parent_id.id
        doc.attrib['domain'] = "[('custodians','='," + str(id) + ")]"

    for node_form in doc.xpath("//tree"):
        node_form.attrib['duplicate'] = '0'
        res['arch'] = etree.tostring(doc)
    for node_form in doc.xpath("//form"):
        node_form.attrib['duplicate'] = '0'
        res['arch'] = etree.tostring(doc)
    return res
这就是我尝试过的。但它不起作用。您可以看到我为什么要从后端设置域,因为我必须根据条件设置用户id

如果我做错了,请告诉我,或者有没有更好的办法

编辑

我已将保管人字段定义如下

custodians = fields.Many2one('res.users', string="Custodian", domain=[('groups_id', 'in', [12])],
                             readonly=[('readonly_custodian', '=', True)])

实际上,当一个loggedin用户创建一个
客户
记录时,我们将他设置为该
客户
的保管人,我想做的就是当该用户再次登录时,他应该能够看到他和他的父代保管人记录

似乎您应该能够通过修改
域来实现此行为在加载树视图的上

有两种方法可以定义,但无论哪种方法,重要的部分都是

旧答案:

第一种方式:

<act_window id="..."
            name="..."
            ...
            domain="[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]"/>
注意:这是一个全局规则,因此您可能希望对某些组(如经理)强制删除它


您应该很少需要覆盖
字段\u get
。你到底想实现什么?我想在树视图中添加域过滤器,从后端动态添加。因此,我可以使用基于条件的域筛选器查看此检查下的所有内容
if view\u type==“tree”
。这是我想在域中实现的条件。我认为域中没有
user
。。让我再检查一遍是的,因为我说用户对象不可用,请看我得到了这个错误
未捕获错误:NameError:name'user'未定义
@您可以尝试将其作为
uid
而不是
用户
?我认为它只是一个整数,而不是一个对象,所以您可能仍然会有一个错误。如果您可以使用一个简单的
[('customedins','=',uid)]
,那么您应该可以走不同的路线。让我知道它是否对
uid
有效,我会更新我的答案。是的,我在
[('customedins','=',uid)]
有效之前尝试过。不同的路线是什么?但是当前登录的用户id不是我想要的id吗
<record id="..." model="ir.actions.act_window">
    <field name="domain">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
<record id="view_ir_rule_restrict_custodians" model="ir.rule">
    <field name="name">Restrict Users to see only their Custodians</field>
    <field name="model_id" ref="model_res_partner"/>
    <!-- Should this be `... or user.partner_id.id`? -->
    <field name="domain_force">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
<record id="view_ir_rule_unrestrict_custodians_managers" model="ir.rule">
    <field name="name">Un-Restrict Managers to see any Custodians</field>
    <field name="model_id" ref="model_res_partner"/>
    <field name="domain_force">[(1, '=', 1)]</field>
    <field name="groups" eval="[(4, ref('base.group_sale_manager'))]"/>
</record>
[('custodians','in',user.partner_id.parent_id and [(user.partner_id.parent_id.id),user.partner_id.id] or [user.partner_id.id])]