odoo xml语法杂记

Author Avatar
呃哦 11月 12, 2018

odoo xml语法杂记

总结记录在odoo的xml中踩的坑

  1. domain多条件过滤语法

    domain 使用 波兰表示法

    以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。

    eg. 计算顺序

     ['|','&','|',a,b,c,'&',d,e]
     ['|','&',(a | b),c,'&',d,e]
     ['|',((a | b) & c),'&',d,e]
     ['|',((a | b) & c),(d & e)]
     [(((a | b) | c) | (d & e))]
    
  2. one2many , many2many 记录的关联选项

    情景:sale.order 表下有个 one2many 字段关联着 sale.order.line,现在为 order 添加一个 line 销售明细行。

       order.write({'line_ids': [(0, 0, {values})]})
    

    则将会用values创建一个line记录,并且关联到order中。

    具体语法:

       (0, 0, { values }) 从给定的values创建一条记录 (create(values))
       (1, ID, { values }) 更新id=ID的记录值(调用write(values))
       (2,ID) 去除和id=ID的对象主从链接关系,并且删除这个对象(调用unlink方法)
       (3,ID)去除和id=ID的对象主从链接关系,但是不删除这个对象
       (4,ID)添加主从链接关系到id=ID的对象。
       (5) 去除所有的链接关系,也就是循环所有的从数据且调用(3,ID)
       (6,0,[IDs]) 用IDs里面的记录替换原来链接的记录,即先执行(5)再循环IDs执行(4,I
    
  3. one2many, many2many 字段禁止禁止创建按钮:

       <field name="field_name" options="{'no_create': True}"/>
    
  4. refeval 语法:

    • eval :把eval的值通过作为python运算返回该属性
    • ref :视图的方法,根据 module_name.xml_id 返回数据库id
      example:
      由于每个view,action都是一个数据库的record,因此可以使用继承inhertit_id继承并用 ref 查找该record
      <record id="view_partner_tree" model="ir.ui.view">
      <field name="name">res.partner.form</field>
      <field name="model">res.partner</field>
      <field name="inherit_id" ref="base.view_partner_tree"/>
      <field name="arch" type="xml">
        <field name="tomorrow" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')" />    
      </field>
      
  5. 控制xml文件只在安装时执行,防止多次升级覆盖数据:

     <odoo>
         <data noupdate="1">...</data>
     </odoo>
    
  6. 在xml中设置model相关field的默认值
    使用 default_ 前缀

     <record id="action_specimen_orders" model="ir.actions.act_window">
         <field name="type">ir.actions.act_window</field>
         <field name="view_type">form</field>
         <field name="view_mode">tree,form</field>
         <field name="context">{'default_field_name': field_value}</field>
     </record>
    
  7. 控制xml文件只在安装时执行,防止多次升级覆盖数据:

     <odoo>
         <data noupdate="1">...</data>
     </odoo>
    
  8. 创建用户权限分组:

    odoo是数据驱动的框架,因此对于权限分组,实则是将用户分组,因此需要先创建一个分组,这里使用xml创建一个record。

     <!-- 新建一个分组标签 -->
     <record model="ir.module.category" id="module_category_test">
         <field name="name">测试</field>
     </record>
     <!-- 新建一个分组 -->
     <record id="base.group_hr_manager" model="res.groups">
         <field name="name">Manager</field>
         <field name="comment">the user will have an access to the human resources configuration as well as statistic reports.</field>
         <field name="category_id" ref="base.module_category_human_resources"/>
         <field name="implied_ids" eval="[(4, ref('base.group_hr_user'))]"/>
         <field name="users" eval="[(4, ref('base.user_root'))]"/>
     </record>
     <!--
     @name:用户组名,这个或以翻译的
     @comment:用户组的注释
     @category_id 用户组所属的模块名
     @implied_ids 基于哪个用户组,这个层级关系 <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>是最基础的
     用户名,最初是基于这个,后面一层一层递增,像上面 base.group_hr_user 定义时就是基于最基础
     @users 预设用户属于这个用户组
     -->
    

    当创建好分组了后,即可在各个方面使用该分组。

    以下是创建一个过滤规则,针对users过滤,并且只有该分组内的用户才可以看得到

     <record model="ir.rule" id="rule1">
     <field name="name">rule1</field>
     <field name="model_id" ref="model_res_users"/>
     <field name="global" eval="True"/>
     <field name="domain_force">[1,’=’,1]</field>
     <field name="groups" eval="[(4,ref('base.group_hr_manager'))]"/>
     </record>
     <!--name: 规则名称-->
     <!--model_id: 对应的模型-->
     <!--global: 是否是全局-->
     <!--domain_force: 过滤条件-->
     <!--groups: 属于哪个组-->
    

    以下是针对menuitem只有特定用户显示

     <menuitem id="menu_manage" name="manager" groups="base.group_hr_manager"/>