Alan Hou的个人博客

Odoo 11官方文档之Open Academy Module 创建

https://www.odoo.com/documentation/11.0/howtos/backend.html

更多内容:最好用的免费ERP系统Odoo 11开发指南

本文主要内容

一个模块主要包含:

使用脚手架初始化 Open Academy 模板目录结构

myaddons/openacademy/文件结构:
├── controllers
│   ├── controllers.py
│   └── __init__.py
├── demo
│   └── demo.xml
├── __init__.py
├── __manifest__.py
├── models
│   ├── __init__.py
│   └── models.py
├── security
│   └── ir.model.access.csv
└── views
├── templates.xml
└── views.xml

首先可以尝试修改__manifest__.py的容并进行安装查看(Manifest 参数详解),示例如下

最基本的模型内容

字段内可添加的属性有:

required=True 必填字段
string UI界面中的 label 值
help 界面中的提示信息
index 是否创建数据库索引

此外其它的有groups, digits, size, translate, sanitize, selection, comodel_name, domain, context

字段类型有 Boolean, Integer, Float, Char, Text, Date等

保留字段:

id 模型中记录的唯一标识符
create_date 记录创建日期
create_uid 创建记录的用户
write_date 记录最近一次修改的日期
write_uid 最近一次修改记录的用户

创建模型

models.py

注:涉及模型类等 Python 代码修改时请在更新前重启服务

模型除了通过 Web 界面安装和更新外,还可使用类似odoo-bin -u openacademy来进行更新

添加数据

demo.xml(demo为安装时可选演示数据,此处因已安装模块,添加到 __manifest__.py的 data 下,对应数据表为openacademy_course)

添加菜单

views/openacademy.xml(同样需要在__manifest__.py的 data 下进行添加,生效后存ir_ui_menu表中)

注意:action 应在调用前进行声明

基本视图

包含<form>表单视图、<tree>列表视图、<graph>图表视图、<search>搜索视图等,对应的数据表为 ir_ui_view

表单视图中有一些特殊的可选标签<sheet>纸张效果,<group>分组内自动在输入框前加上字段名称(字段名或已指定的 string 标签),<notebook>配合<page>产生 Tab 效果

views/openacademy.xml

列表视图 & 搜索视图

表单视图

模型关联

添加课程表

model.py

添加视图和菜单

views/openacademy.xml

关联字段:

Many2one:与其它对象的简单关联,如下例的 course_id
One2many:虚拟关联,与 Many2one 相反,如下例的 session_ids
Many2many:双向多记录关联,如下例中的attendee_ids,并且会生成一张名为openacademy_session_res_partner_rel的关联表(table1_table2_rel)

为课程表和课时表添加关联字段

model.py

views/openacademy.xml

继承(模型继承、视图继承)

模型继承

如上图模型继承包含传统继承和委托继承两种,传统继承又包含经典继承原型继承两种方式。经典继承在原数据表上进行添加,原型继承则会复制原特性并生成新的数据表
如上图模型继承包含传统继承和委托继承两种,传统继承又包含经典继承原型继承两种方式。经典继承在原数据表上进行添加,原型继承则会复制原特性并生成新的数据表

视图继承

可通过 xpath 或明确的 field 内加入继承的视图,以上两段代码的效果相同,position参数常用属性值有 inside, replace, before, after, attributes 等

models/partner.py

views/partner.xml

上述在__init__.py 和__manifest__.py 中的配置请自行加入

注:psycopg2.ProgrammingError: column res_partner.instructor does not exist

我们在上述代码models/partner.py的尾部加入 Partner()可以解决这一报错,另一种方法是通过 SQL 来进行字段的添加

作用域(Domain)

作用域可以使用逻辑运算符& (AND), | (OR) 和 ! (NOT),也可以是它们的组合,如:

上述过滤的是单价不在1000和2000之间或类型为 service 的产品

models/model.py

修改后创建或编辑 Session 时 Instructor 下拉列表中只显示勾选了 Instructor 或 Tag 包含 Teacher 的联系人

views/partner.xml

计算字段和默认值

models/models.py

compute 属性后指定计算的函数,该函数一般采用@api.multi装饰器,而depends(依赖)装饰器表示在指定参数值修改后进行重新计算

views/openacademy.xml

相应部分加入

默认值

active 字段为 False 时在前台默认不显示该条记录

models/models.py

如果无论 active 值是 True 还是 False都需要显示,则加入content=”{‘active_test’: False}”(.py 代码中),如本例中 的Session:

views/openacademy.xml

Onchange

onchange 的 self 是form 视图中的单条记录,它可作用于记录中一个或多个字段。并且 onchange 可独立于字段声明(不同于上述需添加 compute参数),它是一个内置行为,用于在指定条件发生变化时客户界面 form 表单的更新。

经测试onchange 执行先于前述的 depends,但其它代码只在失去焦点时执行,而在保存时并没有进行判断。

下面对座席数小于0或席位数少于报名人数时进行 onchange 的判断

模型约束

模型约束包含 Python 代码级别的约束和 SQL 级别的约束

导师不可同时为学员(不对原有数据进行校验,在保存是进行检查):

SQL约束检查名称和描述不能相同,名称不可重复:

models/models.py

在表单视图下点击 duplicate 默认为标题加一个 Copy of 前缀

models/models.py

高级视图

列表视图

根据条件可显示为不同颜色样式,如decoration-info=”state==’draft'”,decoration-danger=”state==’trashed'”,条件中也可以用 uid, current_date等

基本样式的定义为decoration-{$name},其中的{$name}可以是bf (font-weight: bold), it (font-style: italic)或 Bootstrap 的上下文颜色danger, info, muted, primary, success或warning。注意设置条件时符号需进行转义,见下例中的大于和小于号

设置editable 允许进行行内编辑,值为 top 或 bottom,表明新增一行时在上方还是下方

以下修改 Session 的列表视图,当 duration 小于5时显示为蓝色,大于15时显示为红色,并且实现行内编辑。duration 字段必须在视图中才能作为判断条件,这里使用了 invisible 属性在列表视图中隐藏该字段

views/openacademy.xml

日历视图

models/models.py

这里添加一个 inverse 属性用于在修改 end_date 时,时长天数也进行对应的更改

views/openacademy.xml

color 属性用于在日历视图中对指定字段的不同来按不同颜色显示,默认颜色为随机,也可在模型中添加一个 color 字段来指定显示的颜色

搜索视图

搜索视图可在 xml 中使用 filter_domain, domain, context 来进行设置,如以下设置可以在搜索字段时同时对 name 或 description 字段进行搜索。这里我们新建了一个 id为course_search_view_new的搜索视图来说明可以通过<field name=”search_view_id” ref=”course_search_view_new”/>的方式来指定搜索视图。以下实现的功能为默认过滤出自己负责的课程,并可通过 responsible_id 来进行分组

views/openacademy.xml

甘特图

models/models.py

views/openacademy.xml

注:甘特图目前仅在企业版中使用,暂无演示效果,官方解释是因web_gantt开放协议问题而在社区版8.0版本后下线

相关阅读:Odoo 11 甘特图(Gantt)替代方案探讨

图表视图

图表视图默认为柱状图(添加@stacked=”True”使用堆叠效果),此外还有饼状图,线状图。图表视图不支持不保存存在数据库的计算字段,即需要有 store=True,在 xml 中通过 type 属性可指定默认的图表类型

models/models.py

添加 Session 报名人数

views/openacademy.xml

 

 

看板视图

看板视图以卡片布局在页面上进行显示,看板视图是 html 基础元素配合 Qweb 来实现的

models/models.py

添加一个 color 字段

views/openacademy.xml

工作流

模拟工作流

models/models.py

views/openacademy.xml

真实 Workflow 创建

真实的工作流需要在模型记录在 Workflow 设置好之后创建,否则不会生效。本例基于模拟工作流部分,这里需要

创建一个session_workflow.xml文件

删除模拟工作流中将 models.py 中的default=’draft’

修改 openacademy.xml 中button 中的内容:去除 name 属性值的 action 前缀,将 object 更改为 workflow。如name=”action_done” type=”object”修改为name=”done” type=”workflow”,这里的 name 属性与以下代码的 signal 相对应

views/session_workflow.xml

以下略过,因 Odoo 11已彻底删除掉工作流,查看具体原因

安全权限

后台创建

  1. Settings ‣ Users & Companies ‣ Users新建用户 John Smith
  2. Settings ‣ Users & Companies ‣ Groups添加一个OpenAcademy / Session Read组,然后在Access Rights 下添加一个 session_read 权限
  3. 将 John Smith 添加至该组即使用该用户登录进行查看

通过代码文件控制权限

实现功能:添加OpenAcademy / Manager组对Open Academy拥有所有限,向所有用户开放 Session 和 Course 只读权限(csv 中group_id/id留空)

  1. 创建 security/security.xml 文件来配置 OpenAcademy Manager 组
  2. 编辑security/ir.model.access.csv 文件设置模型权限
  3. 在 _manifest__.py 中添加上述文件

security/ir.model.access.csv

security/security.xml

记录规则控制权限

在OpenAcademy / Manage组中添加一个控制,仅课程负责人可编辑和删除课程,若课程无负责人,则所有人可编辑和删除

security/security.xml

向导

不同于普通模型,向导继承TransientModel

创建 wizard.py(在__init__.py 中引入 wizard.py)

views/openacademy.xml

wizard.py中添加对应的 subscribe 功能

允许同时向多个课时添加学员

views/openacademy.xml

wizard.py

多语言

默认导出的 po 文件只包含 XML 文件中的内容,对.py 文件需使用 odoo._函数包裹,如_(“Label”)),对 models.py 进行以上操作

创建翻译文件

  1. 创建 i18n/文件夹,这个文件下使用语言或语言下划线国家来命名 po 文件,如 zh_CN.po
  2. 载入所需语言: Settings ‣ Translations ‣ Load a Translation(勾选Overwrite Existing Terms)
  3. 导出翻译文件 Settings ‣ Translations -> Import/Export ‣ Export Translation,选择语言、格式和模块
  4. 使用文本编辑器或POEdit打开 po 文件进行翻译并放置到i18n/文件夹中
  5. 重复第二步载入翻译

注:需在首选项中选择语言才能显示翻译的版本

报表

Odoo 的报表基于QWebTwitter BootstrapWkhtmltopdf.

reports.xml(加入__manifest__.py 的 data 中)

报表也可通过网页端获取 pdf 和 html 版,如

http://your.ip.address:8069/report/html/openacademy.report_session_view/3

http://your.ip.address:8069/report/pdf/openacademy.report_session_view/3

仪表盘

仪表盘的样式包含1, 1-1, 1-2, 2-1 和 1-1-1

views/session_board.xml

Web 服务

XML RPC

根据实际能数录入,并执行该 Python 文件即可为 Course 0添加一个 My Session 的课时,注意 USER和 PASS 指的不是数据库而是后台登录的用户名和密码

当然我们也可以通过 POSTMAN来进行测试,如

 

以上在 POST 请求的 BODY 中要填入

JSON RPC

创建一个 Python 文件来执行操作,以下假设已安装Productivity

Postman 验证操作

 

退出移动版