基于res.users中字段的域过滤器,用于Odoo XML树视图

时间:2018-09-24 00:26:35

标签: odoo odoo-10 odoo-view

我的问题是:

在Odoo 10中打开树形视图时,如何引用res.user中的字段并将其用作自定义过滤器?

我扩展了res.user以添加一个名为assigned_office的字段。这是一个选择字段。

我现在正尝试在调用默认的窗口操作来默认过滤记录时使用此值来过滤记录。

我尝试将以下内容添加到我的Window Action中,但这给了我一个错误 (NameError: name 'user' not defined)

<field name="domain">[('responsible_office','=',user.assigned_office)]</field>    

我试图通过向现有过滤器添加变体来修改搜索视图:

('responsible_office','=',user.assigned_office)
('responsible_office','=',ref='self.assigned_office))
('responsible_office','=',ref=assigned_office)

但是我也遇到错误:

  

错误:无法评估搜索条件:   {“代码”:400,“消息”:“评估   错误“,”数据“:{”类型“:” local_exception“,”调试“:”本地评估   失败\ n预期为\“)\”,得到了\“(名称)\” \ n \ n {\“域\”:[[],\“ [
  ('expiration_date','<=',(context_today())
  ,('responsible_org','=',ref ='self ['assigned_org']')
  ] \“],\”上下文\“:[{\” lang \“:\” en_US \“,\” tz \“:false,\” uid \“:1,\” search_default_weekly_expirees_filter \“:1,\ “ params \”:{\“ action \”:205}},{}],\“ group_by_seq \”:[]}“}}

我显然做错了,希望有一个简单的答案。

这是我的代码:

窗口操作:

<record id="my_tool_weekly_expirees_action" model="ir.actions.act_window" >              
  <field name="name">Weekly Expirees</field>
  <field name="res_model">my_tool.member</field>
  <field name="view_type">form</field>
  <field name="view_mode">tree,form</field>
  <field name="context">{"search_default_weekly_expirees_filter":1}</field>  
  <field name="view_id" ref="weekly_expirees_view"/>         
</record>

搜索:

<record id="members_search_view" model="ir.ui.view" >
  <field name="name">Search</field>
  <field name="model">my_tool.member</field>
  <field name="arch" type="xml">
      <search>
          <field name="first_name"/> 
          <field name="last_name"/>

          <field name="expiration_date" string="weekly_expirees" filter_domain="[('expiration_date','&lt;=',(context_today())]"/>  
          <separator/>
          <filter string="Weekly Expirees" name="weekly_expirees_filter" domain="[('expiration_date','&lt;=',(context_today())]" help="..."/>
          <separator/>             

          <field name="expiration_date"/>
          <field name="responsible_office"/>
      </search>
  </field>      
</record>

树视图

<record id="members_list_view" model="ir.ui.view" >
  <field name="name">members.list</field>
  <field name="model">my_tool.member</field>
  <field name="arch" type="xml">       
      <tree>          
      <field name="first_name"/>
      <field name="middle_name"/>
      <field name="last_name"/>             
      <field name="expiration_date"/> 
      <field name="responsible_office"/> 
      <field name="country"/>  
    </tree>
  </field>
</record>

我搜索了stackoverflow.com和odoo.com上的论坛,发现了我不了解或不想做的复杂方法:

最有前途的是,但它似乎仍然是解决问题的方法:

Odoo v9 domain filter with value user.id throws error that user is not defined

我发现另一个更好的选择是。

how to filter tree view with dynamic field odoo-10

1 个答案:

答案 0 :(得分:0)

使域正常工作的最简单的两种方法是:

  • 为模型创建安全性ir.rule记录,您将可以使用变量user在domain_force字段中引用当前用户,例如:

    <record id="my_tool_member_rule" model="ir.rule">
        <field name="name">My Tool Members Rule</field>
        <field name="model_id" ref="my_tool.member"/>
        <field name="domain_force">[('responsible_office','=',user.assigned_office)]</field>
        <field name="perm_read" eval="True"/>
        <field name="perm_create" eval="False"/>
        <field name="perm_write" eval="False"/>
        <field name="perm_unlink" eval="False"/>
    </record>
    
  • 覆盖模型my_tool.member搜索方法以添加自定义域,例如:

from odoo import api, models class MyToolMember(models.Model): _name = 'my_tool.member'

    def search(self, args, offset=0, limit=None, order=None, count=False):
        args.append(('responsible_office', '=', self.env.user.assigned_office))
        return super(MyToolMember, self).search(args, offset=0, limit=None, order=order, count=False)