首页 文章

Odoo - 如何从后端设置域过滤器

提问于
浏览
1

我正在使用odoo 10e . 我想要做的是我想在 fields_view_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

这就是我尝试过的 . 但它不起作用 . 您可以看到我为什么要从后端设置域,因为我必须根据条件设置user_id .

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

Edit

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

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

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

1 回答

  • 2

    看起来您应该能够通过修改加载树视图的action上的 domain 来实现此行为 .

    可以通过两种方式定义Window Actions,但无论哪种方式,重要的部分都是 domain 值 .

    Old answer:

    第一种方式:

    <act_window id="..."
                name="..."
                ...
                domain="[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.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>
    

    EDIT:

    由于 domain 似乎无法访问 user ,我认为这可能有效:

    Record Rule

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

    EDIT 2:

    正如我们在聊天中发现的那样,您问题所针对的域名是:

    [('custodians','in',user.partner_id.parent_id and [(user.partner_id.parent_id.id),user.partner_id.id] or [user.partner_id.id])]
    

相关问题