2017-10-12 58 views
1

我正在使用odoo 10e。我想要做的就是我想设置里面fields_view_get方法Odoo - 如何从后端设置域名过滤器

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

请让我知道如果我做错了或有什么更好的方法。

编辑

我已经定义托管领域遵循

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

实际上当过一的loggedIn用户创建Customer记录,我们把他作为该Customer保管人和所有我想做的事是当用户再次登录时,他应该能够看到他和他的父母监护人记录

+0

你应该很少需要重写'fields_get'。你究竟想达到什么目的? – travisw

+0

我想从后端动态地在树视图上添加域过滤器。所以我可以有基于条件的域名过滤器 – Ancient

+0

看到这个检查下的所有东西'if view_type =='tree''。这是我想要在域 – Ancient

回答

2

看来你应该能够实现这一点通过修改加载您的树形视图的action上的domain来实现。

有两种方法可以定义Window Actions,但无论哪种方式,重要的部分是domain值。

老答案:

第一种方式:

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

编辑:

因为它似乎user不在domain访问,我想这可能工作:

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> 

编辑2:

正如我们在聊天中发现,具体到你的问题域是这样的:

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

实现的条件以及我认为'用户'是不可用的域..让我仔细检查它 – Ancient

+0

是的,因为我说用户对象不可用,看到我得到这个错误'未捕获的错误: NameError:名称'用户'未定义' – Ancient

+0

@Ancient您可以尝试它作为'uid'而不是'user'吗?我认为这只是一个整数,而不是一个对象,所以你可能仍然会有一个错误。如果你可以使用一个简单的'[('custodians','=',uid)]',那么你应该可以采用不同的路线。让我知道,如果它与'uid'一起工作,我会更新我的答案。 – travisw