本博客包含多个文档和书籍的翻译,但有能力者推荐阅读英文原版

Odoo 13开发者文档:构建模块

Odoo Alan 1个月前 (10-15) 520次浏览 0个评论

Odoo使用客户端/服务端架构,其中的客户户端是通过 RPC 访问 Odoo 服务的浏览器。

业务逻辑和扩展通常由服务端来实现,但可以对客户端添加支持功能(例如新的交互式地图的数据展现)。

要启动服务,只需在shell中调用命令 odoo-bin,必要时为文件添加完整路径:

通过在终端按下两次 Ctrl-C 键或者通过杀死相应操作系统进程来停止服务。

服务端和客户端的扩展都封装在模块中,可以选择在数据库中进行加载。

Odoo模块可以向系统添加全新的业务逻辑,或者修改并继承已有的业务逻辑:可以创建模块来向 Odoo 的通用会计支持来添加你所在国家的会计规则,而用另一个模块添加对车队实时可视化的支持。

Odoo的一切始于模块也终于模块。

Odoo中的模块可以包含很多元素:

业务对象
 在Python类中声明, 这些资源根据配置由 Odoo 自动地进行持久化存储
数据文件
声明元数据(视图或报表)、配置文件(模块参数)、演示数据等的XML或CSV文件 网页控制器
Handle requests from web browsers
静态网页数据
用于网页界面或网站的图片CSS或javascript文件

每个模块都是放在模块目录下的一个目录。模块目录使用--addons-path选项来进行指定。

Odoo模块在模块声明文件中进行声明。参见声明文件文档了解更多知识。

模块也是一个带有 __init__.py 文件的Python 包文件,其中包含对模块中不同 Python文件的重要指示。

例如,如果模块中在单个 mymodule.py 文件, __init__.py 中可能包含:

Odoo提供一种帮助设置新模块的机制, odoo-bin 有一个子命令 scaffold 可创建空的模块

该命令为你的模块创建一个子目录,并自动为模块创建一系列标准文件。其中大部分只包含注释代码或XML。大部分这些文件的使用将在本教程中进行讲解。

Odoo的关键组件是 ORM 层,该层避免手动编写大部分的SQL 并提供扩展性和安全服务2.

业务对象以Python类进行声明,它继承集成了自动化持久系统的 Model

模型可通过在定义中设置一系列属性来进行配置。最重要的属性 _name 必须要有,它定义 Odoo 系统中模型的名称。以下是一个模型的最小化完整定义:

字段用于定义模型存储内容及位置。字段在模型类中以属性进行定义:

类似于模型本身,字段也可通过传递配置属性来作为参数进行配置:

一些属性对所有字段都可用,以下是一些通用的属性

string (unicode, 默认值:字段名)
用户界面中(对用户可见)的字段标签
required (bool, 默认值: False)
若为 True,该字段不能为空,必须要么带有默认值,要么保持在创建记录时给定值。
help (unicode, 默认值: '')
长形,在用户界面中向用户提供提示信息。
index (bool, default: False)
请求 Odoo 对字段创建数据库索引

有两大类字段:“简单”字段是在模型表中直接存储的原子值,而“关联”字段关联(同一模型或不同模型中的)记录。

简单字段的示例有 BooleanDateChar

Odoo对所有模型创建一些字段1。这些字段由系统管理,不应进行写入。在有用和必要时可进行读取:

id (Id)
模型中对一条记录的唯一标识符。
create_date (Datetime)
记录的创建日期。
create_uid (Many2one)
创建记录的用户。
write_date (Datetime)
记录的最后修改日期。
write_uid (Many2one)
最近修改记录的用户。

默认, Odoo还对不同的展示和搜索行为要求在所有模型中有一个 name 字段。用于这些目的的字段可以通过设置_rec_name进行重载。

Odoo是一套高度数据驱动的系统。但行为在数据加载时由模块中的Python代码进行自定义。

模块文件通过带有<record>的XML数据文件进行声明。每个 <record> 元素创建或更新数据库记录。

  • model 是针对记录的 Odoo 模型的名称。
  • id外部标识符,它允许引用记录(而无需知道其数据库中的内部标识符)。
  • <field> 元素有一个 name ,它是模型中的字段名 (例如 description).。它们的内部是字段值。

数据文件是在要加载的声明文件中声明的,它们可以在 'data' 列表(一直都加载)或'demo'列表(仅在演示模式下加载)中进行声明。

动作和菜单是数据库的常规记录,通常通过数据文件进行声明。动作可通过三种方式触发:

  1. 通过点击菜单项(链接具体动作)
  2. 通过点击视图中的按钮(如若关联动作的话
  3. 作为对象的上下文动作

因为菜单的声明有些复杂,有一个 <menuitem> 快捷方式来声明 ir.ui.menu 并更轻松地将其连接到对应的动作。

视图定义模型记录展示的方式。每种视图类型展示一种可视化模式(一个记录列表,它们汇总的图表…)。视图通常可由它们的类型(如伙伴列表)或特别通过它们的 id 进行请求。对于通用请求,将使用具有正确类型的视图和最低的优先级(这样每种类型的最低优先级是该类型的默认视图)。

视图继承 允许修改其它地方声明的视图 (添加或删除内容)。

视图声明为 ir.ui.view模型的一条记录。视图类型在arch字段的根元素中进行指定:

.树状视图,也称为列表视图,以列表形式显示记录。

它们的根元素是 <tree>。树状视图的最简单形式是仅将所有字段在表格中进行展示(每个字段一列):

表单可用于创建及编辑单个记录。

它们的根元素是<form>。它们由高级别的结构元素(group,notebook)及互动元素(button和field)组成:

表单视图也可以使用普通HTML来获得更灵活的布局:

搜索视图自定义与列表视图(以及其它聚合视图)相关联的搜索字段 (and other aggregated views). 它们的根元素是 <search> 并且由定义可供搜索的字段组成:

如果针对模型不存在搜索视图,Odoo生成仅允许搜索 name 字段的搜索视图。

一个模型中的记录可能与另一个模型中的记录相关联。例如,与包含客户数据相关联的客户记录相关联的销售订单记录;它还与销售销售订单明细记录相关联。

关联字段链接相同模型(等级)或不同模型间的记录。

关联字段类型有:

Many2one(other_model, ondelete='set null')
对另一个对象的简单链接:

One2many(other_model, related_field)
一个虚拟关联,Many2one的反向。One2many 作为记录的容器,访问它会产生一个记录集(有可能为空):

Many2many(other_model)
 双向的多对多关联,在一侧的任意记录可以与另一侧任意数量的记录进行关联。作为记录的容易,访问它也可能会产生空记录集:

Odoo提供两种以模块化的方式继承已有模型的继承机制。

第一种继承允许一个模块修改在另一个模块中所定义的模型的行为:

  • 在模型中添加字段,
  • 重载模型中字段的定义,
  • 为模型添加约束,
  • 向模型添加方法,
  • 在模型中重载已有方法。

第二种继承机制(代理继承)允许将模型中的每条记录链接到父级模型中的记当中,并提供对父级记录的透明访问。

Odoo 13开发者文档:构建模块

除在原处(通过重写)修改已有视图之外,Odoo还提供了视图继承,此时“继承”视图应用于根视图之上,并且可以从它们的父级添加或删除内容。

继承视图使用 inherit_id 字段引用其父级,而不同于单个视图,arch字段由任意数量的选择并修改父级视图内容的xpath元素组成:

expr
XPath 表达式选择父级视图中的单个元素。在没有匹配任何元素或匹配到一个以上元素时抛出错误
position
用于匹配元素的运算:

inside
在匹配元素后添加xpath的内容体
replace
使用xpath的内容体替换已匹配元素,使用始元素替换所有 $0节点内容
before
在匹配元素之前以兄弟节点插入xpath内容体
after
在匹配元素之后以兄弟节点插入 xpaths内容体
attributes
xpath内容体中使用特殊的attribute元素修改所匹配元素的属性

在Odoo中, 作用域 是对记录的条件进行编码的值。作用域是一个用于选择模型记录子集的条件列表。每个条件有三项,包含字段名、运算符及值。

例如,在用于Product 模型时,以下作用域选取所有单价大于1000服务

默认条件通过隐式的AND进行组合。逻辑运算符 & (AND)、 | (OR) 以及 ! (NOT) 可用于显式地组合条件。它们在前置位置中使用(运算符在参数之前而非之间插入)。例如要选择“是服务单价不在 1000到2000之间”的产品:

在尝试选择用户界面中的记录时,domain 参数可添加到关联字段中来限制针对关联的有效记录。

截至目前字段都在数据库中直接存储及获取。字段也可被计算。在这种情况下,字段值不是从数据库中获取而是通过调用模型方法实时计算。

要创建计算字段,创建一个字段并设置其属性 compute 为方法名。计算字段应只需对self中的每条记录设置计算的字段值。

计算字段的值通常依赖于所计算记录中的其它字段的值。 ORM要求开发者通过depends()装饰器对计算字段指定这些依赖。给定的依赖由ORM用于在依赖中发生更改时触发字段的重新计算:

任何字段都可赋默认值。在字段定义中,添加参数default=X ,其中 X 可以是Python字面量值(布尔型、整型、字符串),或接收记录集并返回值的函数:

“onchange”机制提供一种当用户填写字段值时在用户界面更新表单的方式,它尚未在数据库中进行保存。

例如,假设模型有三个字段 amountunit_price 和 price,并且你希望在其它字段修改时对表单更新价格。要实现这点,定义一个方法,其中self 表示表单视图中的记录,并通过onchange()对其进行装饰来指定要触发的字段。对 self 所做的任何修改都会在表单中进行反映。

对于计算字段,带值的 onchange 行为是内置的,因为可以通过操作Session表单来进行查看:修改座席或参与人员的数量,taken_seats进度t 条会自动更新。

Odoo提供设置自动地验证不定式: Python约束 及 SQL约束

Python约束定义为一个由constrains()装饰的方法,对记录集进行调用。装饰器指定在约束中包含哪个字段,因此约束在其中之一修改时会自动运行。该方法会在未满足不定式时抛出异常:

SQL约束通过模型属性_sql_constraints来进行定义。后者赋值给一个三字符串列表 (name, sql_definition, message),其中 name是有效的SQL约束名,sql_definition 是一个 table_constraint表达式,而 message 是报错消息。

树状视图可以接收额外的属性来进一步自定义它们的行为:

decoration-{$name}
允许根据对应记录属性的行文本样式。

值为Python表达式。对于每条记录,表达式通过记录的属性来作为上下文值并在为true时运行,将样式应用到行上。其它上下文值有 uid (当前用户的 id) 和 current_dateyyyy-MM-dd格式的当前日期字符串)。

{$name} 可以为 bf (font-weight: bold), it (font-style: italic)或任意 bootstrap上下文颜色 (dangerinfomutedprimarysuccess 或 warning)。

editable
为 "top" 或 "bottom"。让树状视图在当前位置可编辑(而无需进入表单视图), 值为新行出现的位置。

按照日历事件来显示记录。它们的根元素为 <calendar>,最常用的属性有:

color
字段名用于颜色分段。颜色自动分配给事件,但处于相同颜色分段的事件(@color字段值相同的记录)会被给予相同的颜色。
date_start
记录的字段中存储事件的开始日期/时间
date_stop (可选)
字段中保存事件的结束日期/时间
string
记录的字段中定义针对每个日历事件的标签

搜索视图 <field> 元素可有一个 @filter_domain ,重载生成用于搜索给定字段的作用域。在给定的作用域中,self 表示由用户输入的值。在下面的示例中,它用于对 name 和 description字段进行搜索。

搜索视图也可以包含 <filter> 元素,胜任预定义搜索的切换器。过滤器必须有一个下面的属性:

domain
对当前搜索添加给定作用域
context
对当前搜索添加一些上下文件;使用 group_by 键来对给定字段名的结果进行分组

要在动作中使用非默认的搜索视图,应当关联使用动作记录的 search_view_id 字段。

动作也可以通过其 context 字段来为搜索字段设置默认值:search_default_field_name 表单的上下文键将会通过所提供值初始化 field_name 。搜索过滤器必须有一个可选的 @name 来作为默认值或作为布尔值(仅在默认情况下启用)。

横向柱状图常用于展示项目规划和进展,其根元素为 <gantt>

图表视图允许对模型的聚合预览和分析,它们的根元素为 <graph>

图表视图有4种展示模式,默认使用@type属性选中默认模式。

柱状图 (默认)
柱状图, 第一维度用于对横轴定义分组,另一个维度定义每个分组中的聚合条柱。

默认条柱是并排的,可以对<graph>使用@stacked="True"来进行叠放。

折线图
2维折线图
饼状图
2维饼状图

图表视图包含必填的@type属性的 <field> ,接收如下值:

row (默认)
字段应默认聚合
measure
字段应进行聚合而非分组

用于组织任务、生产进程等等…它们的根元素是 <kanban>

看板视图显示一组可按列进行分组的卡片。每个卡片表示一条记录,并且每列为聚合字段的值。

例如,项目任务可通过阶段(每列为一个阶段) 或负责人(每列一个用户)等进行组织。

看板视图以表单元素的组合(包含基本HTML)及QWeb定义每个卡片的结构。

必须配置访问控制机制来实现连续的权限策略。

组在 res.groups模型中以普通记录进行创建,并通过菜单定义来进行菜单访问的授权。但便没有菜单,对象也可以进行间接的访问,因此必须为组定义实际的对象级权限(读、写、创建、删除)。它们通常通过CSV文件内部模块进行插入。也可使用字段的groups属性来限制视图或对象中具体字段的访问。

访问权限在 ir.model.access模型的记录中进行定义。每个访问权限关联模型、组(或没有全局访问的组)或一组权限:读取、写入、创建、删除。这种访问权限通常由按模型命名的CSV文件进行创建: ir.model.access.csv

记录规则限制对给定模型为记录子集的访问权限。规则是 ir.rule模型的一条记录,并且关联模型、一些组 (many2many 字段)、限制所应用的访问权限及作用域。作用域指定访问权限所限定的记录。

这里的示例是防止对状态不为 cancel的线索的删除。 注意 groups 字段的值必须按照与ORM中write()方法相同的规则。

向导通过动态表单描述与用户(或对话框)的交互会话。向导只是继承TransientModel类而非Model的一个模型。TransientModel类继承了Model 并且通过如下内容利用所有已有机制:

  • 向导记录不是持久化的;它们在一定时间后会自动从数据库中删除。这也是称之为 transient(临时)的原因。
  • 向导模型不要求有具体的访问权限;用户对向导记录有所有的权限。
  • 向导记录可能会通过many2one字段引用普通记录或向导记录,但普通记录无法通过many2one字段引用向导记录。

我们将创建一个允许用户针对具体课时或同时对一组课时创建参与人员的向导。

向导由 ir.actions.act_window 记录启动,字段 target 的值设置为 new。后者将向导视图打开为弹窗。可通过菜单项触发该动作。

还有启动向导的其它方式:使用像上面那样的 ir.actions.act_window 记录,但包含在上下文中指定动作可用的模型的额外字段 binding_model_id。向导会出现在主视图上方的模型的上下文动作中。因为在ORM中一些内部钩子,这种动作通过act_window在XML中进行声明。

向导使用普通视图,并且它们的按钮可使用属性 special="cancel" 来不进行保存关闭向导窗口。

每个模块可在 i18n目录中通过命名为LANG.po的文件提供其自己的翻译,其中LANG为语句的locale编号或在有不同时使用语言和国家的组合(pt.po 或 pt_BR.po)。对所有启用语言将由Odoo自动加载翻译。开发人员在创建模块时保持使用英语,然后使用Odoo的gettext POT导出功能(Settings ‣ Translations ‣ Import/Export ‣ Export Translation without specifying a language)导出模块用词。这会创建一个模型模板POT文件,然后获取所翻译的PO文件。很IDE都有编辑及合并PO/POT文件的插件或模式。

Odoo使用一个基于QWebTwitter Bootstrap 和 Wkhtmltopdf的报表引擎。

报表是两大元素的组合:

  • ir.actions.report,为其提供了一个快捷元素 <report> ,它为报表设置了各种基础参数(默认类型、报表是否应在生成后保存到数据库中…)
  • 针对实际报表的标准QWeb视图

因报表是标准的网页,它们可通过URL访问,并且输出参数可通过这个URL进行控制,例如Invoice报表的HTML版本可通过  http://localhost:8069/report/html/account.report_invoice/1 (若已安装 account ) 进行访问并可通过http://localhost:8069/report/pdf/account.report_invoice/1访问PDF版本。

web-service模块提供对所有网页服务的通用接口:

  • XML-RPC
  • JSON-RPC

业务对象也可通过分布式对象机制来进行访问。它们都可以通过带有上下文视图的客户端接口进行修改。

Odoo 可通过 XML-RPC/JSON-RPC 接口进行访问,针对这类接口很多编程语言中都存在语言库。

以下示例是通过xmlrpc.client库与Odoo服务端交互的Python 3程序:

以下示例是通过Python标准库urllib.request 和 json来与Odoo服务进行交互的Python 3程序。下面的示例假定已安装了 生产力 应用 (note) :

示例可轻易地从XML-RPC 调整为 JSON-RPC。

[1] 可以禁用一些字段的自动创建
[2] 也可以编写原生的SQL查询,但需要注意它会超过所有的Odoo验证以及安全机制。
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址