Relax NG 在Odoo中的应用

本文深入探讨Odoo中XML文件的解析过程,介绍RelaxNG的作用及其如何定义Odoo的XML框架结构。文章还详细列举了Odoo XML中常见的节点及其属性。

想必有些同学一定会奇怪,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

转载于:https://www.cnblogs.com/kfx2007/p/5478338.html

Odoo中运用Wflow工作流可按以下方式操作: ### 工作流的定义与配置 在Odoo里,工作流主要通过XML文件来定义。以下是一个简单的示例代码,展示了如何定义一个基本的工作流: ```xml <odoo> <record id="example_workflow" model="workflow"> <field name="name">Example Workflow</field> <field name="osv">example.model</field> <field name="on_create">True</field> <field name="activity_ids" eval="[(0, 0, { 'name': 'Start', 'kind': 'function', 'action': 'start_function', 'flow_start': True }), (0, 0, { 'name': 'End', 'kind': 'stopall' })]"/> <field name="trans_ids" eval="[(0, 0, { 'act_from': 'Start', 'act_to': 'End', 'signal': 'end_signal' })]"/> </record> </odoo> ``` 在这个例子中,定义了一个名为`Example Workflow`的工作流,它作用于`example.model`模型。工作流包含两个活动:开始活动和结束活动,并且定义了从开始到结束的一个转换,触发信号为`end_signal`。 ### 工作流与模型的关联 要让工作流与特定的模型关联起来,需要在模型的Python代码中添加相应的逻辑。以下是一个示例: ```python from odoo import models, fields class ExampleModel(models.Model): _name = 'example.model' name = fields.Char(string='Name') def start_function(self): # 开始工作流时执行的逻辑 pass def end_signal(self): # 触发结束信号的逻辑 self.env['workflow'].trg_validate(self._uid, 'example.model', self.id, 'end_signal', self.env.cr) ``` 在这个示例中,`start_function`方法在工作流开始时被调用,`end_signal`方法用于触发工作流的结束信号。 ### 工作流的激活与测试 在Odoo的界面中,可以通过以下步骤来激活和测试工作流: 1. 安装包含工作流定义的模块。 2. 创建或选择与工作流关联的模型记录。 3. 观察工作流的状态变化,根据定义的逻辑触发相应的信号。 通过以上步骤,可以在Odoo中成功运用Wflow工作流,实现业务流程的自动化管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值