Relax NG 在Odoo中的应用

想必有些同学一定会奇怪,Odoo是如何将模块中的XML中的诸如record、menuitem是如何被组织和定义的,以及各种field的各种属性究竟有哪些,今天,我们就来一探究竟。

Relax NG:可扩展标记语言的下一代正规语言”是一种基于语法的可扩展标记语言模式语言,可用于描述、定义和限制 可扩展标记语言标准通用标记语言的子集)词汇表。简单地说 Relax NG是解释XML如何被定义的一套XML。Odoo就是通过定义了一套rng文件定义了自己一套xml框架结构,在模块被安装或者升级的时候将其解析成与之相对应的内置对象,存储在数据库中。关于Relax NG的语法规则,可以参考Relax NG的官网。

解析XML文件的代码在convert.py的convert_xml_import方法中:

def convert_xml_import(cr, module, xmlfile, idref=None, mode=‘init‘, noupdate=False, report=None):
    doc = etree.parse(xmlfile)
    relaxng = etree.RelaxNG(
        etree.parse(os.path.join(config[‘root_path‘],‘import_xml.rng‘ )))
    try:
        relaxng.assert_(doc)
    except Exception:
        _logger.error(‘The XML file does not fit the required schema !‘)
        _logger.error(misc.ustr(relaxng.error_log.last_error))
        raise

    if idref is None:
        idref={}
    obj = xml_import(cr, module, idref, mode, report=report, noupdate=noupdate)
    obj.parse(doc.getroot(), mode=mode)
    return True

而在xml_import方法中,处理了我们常见的各种节点:menuitem,record,template,url等等。

通过对rng文件的解读,我们可以总结Odoo xml的架构如下:

顶级节点:openerp

二级节点:元素(可多个):data

     属性 (可选): noupdate、context

三级节点:元素(可多个):menuitem、record、template、delete、act_window、url、assert、report、workflow、function、ir_set

常见节点属性:

menuitem:id(必填),name,parent,action,sequence,groups,icon,web_icon,web_icon_hover,string

record:id(可选),forcecreate(可选),model,context(可选),

子节点:field(可多个)

template:id,t-name,name,forecreate,context,priority,inherit_id,primary,groups,active,customzie_show,page

delete:model,id,search

act_window:id,name,res_model,domain,src_model,context,view_id,view_type,view_mode,multi,target,key2,groups,limit,usage,auto_refresh

url:id,name,url,target

assert:model,search,count,string,id,context,severity,test

report:id,string,model,name,report_type,multi,menu,keyword,rml,file,sxw,xml,xsl,parser,auto,header,webkit_header,attachment,attachment_use,groups,usage

workflow:model,action,uid,context,ref,value

function:model,name,id,context,eval

ir_set:子节点:field

同样地,在View中也同样用到了Relax NG组织定义了View的架构,具体参见我的另一篇文章:

http://www.cnblogs.com/kfx2007/p/5478375.html

时间: 2024-10-01 21:08:37

Relax NG 在Odoo中的应用的相关文章

Odoo中Qweb使用入门

参考 可参考官网例子https://doc.odoo.com/trunk/web/qweb/或 http://thierry-godin.developpez.com/openerp/tutorial-module-creation-pos-modification-english-version/ 1 Qweb官方定义 Qweb被用作OpenERP的Web客户端模板引擎.它是一种基于XML的模板语言,同Genshi, Thymeleaf.Facelets模板具有相似并且具有以下特性: 完全在客

odoo中def init(self):

# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, tools class test_report(models.Model): _name = 'test.report' _auto = False _description = 'Test Report' test = fi

odoo中self的使用

odoo中self的使用 介绍 对象self.env提供对请求参数和其他有用的访问: self.env.cr or self._cr 是数据库的游标对象,可用于对数据库的操作 self.env.user是当前用户的记录 self.env.context或self._context是上下文字典 self.env.ref(xml_id)返回对应于XML id的记录 self.env[model_name]返回给定模型的实例 原文地址:https://www.cnblogs.com/itelephan

Odoo中如何定制化已存在的视图(以子产品为例)

(可选)如要扩展视图对应的模型请增加相应的字段,如: class product(models.Model): _inherit = "product.product" max_quantity = fields.Float(string="Maximum Quantity") //增加了一个最大数量字段 找到原始的视图名称,可以通过调试视图查找,如: 这样我们就知道要去product模块中找id为product_normal_form_view的视图了,最简单的方

Odoo 中的 Controller

来自  Odoo处理HTTP请求的接口用的Contoller类,封装于web模块中. --------------------------------------------------------------- RequestHandler: 1. replace_request_password(args):用*替换掉request中的密码字符. 2. dispatch_rpc(service_name, method, params):处理RPC请求.service_name的值可取com

(32)odoo中的编码问题

对于全部是英文就不存在问题,但我们常用中文,这样会导致一个棘手的问题 约定: 系统Ubuntu trusty14.04 自带python2.7.6 python2.7.9 自己升级了 升级方法: ------------------------- 准备 # apt-get -y install build-essential libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev li

Odoo中的Javascript单元测试

前端页面利用QUnit进行单元测试,本文参考官方文档:https://www.odoo.com/documentation/8.0/reference/javascript.html 访问/web/tests页面可以看到当前所有包含测试模块的单元测试列表. 自定义单元测试方法如下: 1. __openerp__文件中添加对js文件的引用: (非官方文档中将js文件写到'test'中,而是引用view文件,在view文件中添加对js的引用,8.0以后有效) <template id="ass

odoo中的权限管理

odoo的权限管理总结,经验之谈,欢迎指正. 模型权限设置 在一个模块中新建了一个模型都必须对此模型进行权限配置,因为默认模型是没有任何权限设置的,开发的时候使用admin账号可以看到但正常账户是无法看见模型的.所以这是最基本的权限配置,哪怕你的模块没有特殊权限对所有人都开放也必须进行配置. 对模型的权限设置一般是在security/ir.model.access.csv文件中进行配置.格式如下 # 第一行是表头,表示分别需要填入的值 即 id,name,模型,用户组,最后四个为读,写,创建,删

ODOO中创建website Part-1 创建模块

odoo是使用scaffolding来完成模块创建工作的 scaffolding 中文意思是脚手架 调用方式像这样 $ ./odoo-bin scaffold Academy my-modules odoo-bin是可执行单元 scaffold是要做的动作 academy是模块名字 my-modules是模块所在的文件夹 ps:这个文件夹在 try this odoo-bin scaffold people Peoples 如果没有任何提示,应该就是成功了 在odoo根目录下出现一个people