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"/>
    
python  odoo