odoo模块包括
业务对象,web控制器,数据文件,前面2个是Python模块,而数据文件则是odoo特有的文件,例如,odoo数据文件,web数据。这些数据文件在 __odoo__.py 进行定义,在 odoo10之前,这个 manifest 文件命名为 __openerp__.py,在更早的 tinyERP时代,名为 __terp__.py

manifest 包含以下项目

'application'

是否作为应用程序列出,默认 False,

'author'

默认 'Odoo SA',

'auto_install'

默认 False,

'bootstrap'

'category'

默认 'Uncategorized',

'data'

数据文件,例如基础数据,视图,动作,菜单,报表

'demo'

演示数据

'depends'

默认 [],

'description'

默认为空

'icon'

模块的图标,默认读取 static/description/icon.png,如果没有指定,则使用默认图标

'installable'

默认 True,

'license'

默认 'LGPL-3',

'post_load'

默认 None,

'qweb'

web client使用的模板

'version'

默认 '1.0',

'web'

默认 False,

'website'

默认 'http://www.odoo.com',

'sequence'

默认 100,

'summary'

默认为空

模块的处理过程

  1. odoo模块的业务对象部分和Web控制器部分,都是Python模块在odoo启动时动态构建为odoo modelclass并实例化,成为最终的业务对象
  2. odoo数据文件则在安装模块的时候,解析为业务对象的记录,并写入到
    数据库
  3. web数据在客户端访问时,被打包为 /web/webclient/csslist、 /web/webclient/jslist 、
    /web/webclient/qweb 等,供运行在浏览器的webclient使用

模块发现

当在odoo启动装载base模块之后,会调用 ir.module.module 模型的 方法 update_list 对 addons_path 中指定的 模块进行 发现, 对于发现的模块,更新到 ir.module.module 对应的 数据库表, 这样, 在 odoo backend 的 管理界面就能 查看到所有发现的模块

模块安装

当 ir.module.module 的模块标记为 installed 状态时,在odoo启动时,会尝试进行安装

或者
在 apps 安装界面
点击
安装
按钮进行安装

点击模块的安装按钮时,
执行 openerp\addons\base\module\module.py#button_immediate_install() 方法,先对需要安装的模块进行一次验证和标记,
进而重建一次注册表,从而触发 odoo modelclass 重建过程,以及模块数据装载过程

所以,模块安装对系统的消耗很大。

模块数据装载

当在odoo启动时指定 init 或者 update 指令时、或者有新的模块需要安装时,在 ORM 完成之后,调用 openerp\modules\loading.py#_load_data() 装载
模块里面定义的
数据。

_load_data() 再调用 openerp\tools\convert.py#convert_file() 从模块读取 manifest 里面 data 以及 demo 指定的 数据文件

数据文件的目的是往模型里面写入数据,支持的格式

  1. csv
  2. xml
  3. sql
  4. yml

CSV

csv 文件名本身
指定了 model 的名称,csv 文件以 model.csv 的格式命名,model 就是该模型; csv 文件内容的第一行,是数据的栏位名,其他行则是
数据,对于关系数据,
使用 external_id 的形式进行引用,
例如

1 文件名
代表了
该数据对应的模型,此例是 ir.model.access

2 第一行,代表了
数据对于的模型栏位

XML

xml 文件
包含多个 <data> 标签, data标签的属性 noupdate 用来
指明
该标签包含的
记录是否是'可更新',意思是在更新/升级该模块的时候,是否更新该记录在数据库中的数据记录

<data>标签可以包含多个<record>标签,表明这是一数据记录, record 标签
的 model属性
指定了 model的名称,id 属性
指定该
记录的 external_id,

<record>标签可以包含多个<field> 标签 ,表示是 模型的字段,字段的名称使用 field 的属性 name 来表示

例如

<record id="res_partner_title_madam" model="res.partner.title">

<field name="name">Madam</field>

<field name="shortcut">Mrs.</field>

</record>

表示的是
模型
"res.partner.title" 的一条记录, 字段名 和 值 分别是 field标签表示的

<record id="view_partner_title_tree" model="ir.ui.view">

<field name="name">res.partner.title.tree</field>

<field name="model">res.partner.title</field>

<field name="arch" type="xml">

<tree string="Partner Titles">

<field name="name"/>

<field name="shortcut"/>

</tree>

</field>

</record>

表示的是 模型 "ir.ui.view" 的一条记录, 字段名 和 值 分别是 field标签表示的。说明,视图定义是 arch 字段,它的类型是 xml,这样 在 安装模块数据的时候,将这部分转换为 XML

XML数据文件除了 record标签之外,还支持

  1. template,数据记录,为ir.ui.view 的别名
  2. report,数据记录,为ir.actions.report.xml别名
  3. menuitem,数据记录,为ir.ui.menu别名
  4. workflow,
    向工作流触发一个信号
  5. act_window
  6. function
  7. delete,删除记录
  8. ir_set
  9. assert

template

qweb template,它是 ir.ui.view 的别名,例如 web公用的 bootstrap 资源
别定义在 template 标签里面

当渲染这个模板的时候,将会把template 里面定义的
页面片段插入到
前台html中

template装入后,作为ir.ui.view 模型的 arch 字段
保存在数据库

Web数据

web数据分2部分,一个在后端渲染,qweb template 用来描述 web page的组成;另外一个是前端渲染, qweb template 用来描述 web client widget 的组成。

page qweb template

例如,
在访客访问 / 时,
被重定向到 /web/login 后端调用 qweb 引擎ir_qweb.py 将
模板 web.login 进行渲染,

将渲染的结果返回给
浏览器

返回里面
包含了
前端【在此指网页】以及公共的
样式和 JS资源
的链接

这几个
资源在
模板 login_layout 中进行了定义

web client qweb template

一旦登录成功,重定向到 /web ,并给浏览器
返回
'web.webclient_bootstrap' 模板 的渲染结果, 启动webclient

'web.webclient_bootstrap' 模板
描述了 /web 页面的组件

odoo Web control在 使用 Qweb引擎渲染 它的时候, 将 模板 web.assets_common 打包为 assets. 也就是 http://127.0.0.1:8069/web/content/1012-751b3f4/web.assets_common.js

对于其他的 qweb 元素,进行类似的
打包工作

webclient 的启动入口

web client启动时,还会从后端
通过 /web/webclient/qweb 取得 当前数据库所安装模块的 前端 qweb Template ,对于还没登陆的 数据库,此时是 空白。

根据前端请求送入的mods 参数,遍历 qweb 定义的 XML文件,然后把他们 打包在一起

例如其中 FieldChar 的定义如下

在 Webclient 渲染具有 Char 字段时, 就 会 调用 Qweb.render_element() 进行渲染

odoo模块的更多相关文章

  1. 如何快速创建odoo模块,使用脚手架快速创建自己的odoo应用app

    上一篇内容:如何快速搭建自己的ERP系统,4步源码快速安装odoo教程 了解什么是odoo的插件模块 odoo在基础的框架代码之下,可以安装自己的应用程序或者业务逻辑,也可以对原有的模块进行二次修改 ...

  2. Odoo模块添加logo

    模块的static目录是专门用于存放静态文件内容如:图片.css等的.其中,description目录是存放关于模块的一些描述性的文件的,其中,模块的图标也放在下面,以icon命名.

  3. Odoo 二次开发教程(二)-模块的基础构建

    注:本篇及后续均以8.0为基础. 一. Odoo模块的构成 __init__.py 文件是python包导入所必须的文件,内容可以为空,通常情况下我们用来导入自己写的py文件. __openerp__ ...

  4. odoo开发笔记 -- 用户配置界面如何增加模块访问权限

    在odoo设置界面,点击用户,进入用户配置界面,会看到: 访问权 | 个人资料菜单 在访问权 page菜单界面,可以看到系统预制的一些模块都会显示在这里, 那么,我们自己开发的模块如何显示在这块呢,从 ...

  5. Odoo创建基础模块和相关内容

    Odoo创建模块 这里我先引用一下几篇文章,这里完整的实现了一个odoo的模块创建demo https://segmentfault.com/a/1190000014047552 https://se ...

  6. [精]Odoo 8.0深入浅出开发教程-模块开发基础

    參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...

  7. 第五章 Odoo 12开发之导入、导出以及模块数据

    大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...

  8. Odoo Shell

    Odoo shell 提供了一个简便的操作 Odoo的交互界面, 从 odoo 9.0 开始就是标准功能, 无需安装第三方应用. 本文基于Odoo10 说明 Odoo Shell以及 Odoo Mod ...

  9. ODOO从哪里开始??OpenERP的第一根线头儿

    Windows下ODOO源码启动: python odoo-bin -w odoo -r odoo --addons-path=addons,../mymodules --db-filter=mydb ...

随机推荐

  1. Lua学习笔记(一)-----C#和lua的交互

    一直以来对Lua热更新技术很感兴趣,在上周开始了对Lua的学习,主要学的是uLua. 直接上干货 准备工作: LuaInterface包括两个核心库一个是LuaInterface.dll,一个是Lua ...

  2. Spring urlMapping

    背景 某url性能测试表明,qps单机最高只有4000多,虽然靠堆机器可以解决问题,但是显然不是什么优雅的方案. 试着把controller里的所有的逻辑都屏蔽,只是简单的返回hello world, ...

  3. VS2010安装帮助文档出现错误

    安装VS2010后的帮助文档安装出现错误:未能在指定文件夹中创建本地存储区 安装完VS2010后,出现错误,取消后 再安装MSDN 打开“Help Library 管理器 - Microsoft He ...

  4. openssh升级至7.2

    此处升级操作的原则是保留系统原有ssh服务,新安装高版本ssh服务 1.下载openssh源码包 http://www.openssh.com/portable.html 2.安装#tar zxvf ...

  5. http请求的开销

    很多人都说要减少http请求,可关注为什么要减少请求的人却少很多,本文是对我在几篇博客以及知乎上看到的内容的整理. http请求头的数据量 每次请求都会带上一些额外的信息进行传输,当请求的资源很小,比 ...

  6. linux 驱动学习笔记03--Linux 内核的引导

    如图所示为 X86 PC 上从上电/复位到运行 Linux 用户空间初始进程的流程.在进入与 Linux相关代码之间,会经历如下阶段. ( 1 ) 当系统上电或复位时, CPU 会将 PC 指针赋值为 ...

  7. 关于Jquery的delegate绑定事件无效

    今天在做一个页面,用的是easyui页面有很多的tabs,里面都放了iframe 需要在load事件动态调整iframe高度 发现始终无法使用delegate来绑定load事件. 纠结了一下午发现了问 ...

  8. 抽象类&接口

    抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 在Java中抽象 ...

  9. nullcon HackIM 2016 -- Crypto Question 3

    After entring the luxurious condomium,you get the feel that you are in home of a yester Star. the ex ...

  10. 常见绘图框架-(Charts)

    swift 出来后有很多优秀的第三方绘图.动画框架,最近项目需要使用了 Charts Github: https://github.com/danielgindi/Charts 因为是在Object- ...