第⼗⼆章Odoo12开发之报表和服务端QWeb
报表是业务应⽤⾮常有价值的功能,内置的 QWeb 引擎是报表的默认引擎。使⽤ QWeb 模板设计的报表可⽣成 HTML ⽂件并被转化成PDF。也就是说我们可以很便捷地利⽤已学习的 QWeb 知识,应⽤到业务报表中。本⽂中我们将为图书馆应⽤添加⼀个报表,复习 QWeb ⽣成报表的关键技巧。包括像汇总⼀类计算、翻译和纸张样式打印。
本⽂主要内容有:
安装wkhtmltopdf
创建业务报表
QWeb 报表模板
在报表中展⽰数据
渲染图⽚
报表汇总
定义纸质格式
在报表中启⽤语⾔翻译
使⽤⾃定义 SQL 建⽴报表
开发准备
我们将继续使⽤library_app插件模块进⾏学习,该模块在第三章 Odoo 12 开发之创建第⼀个 Odoo 应⽤中初次创建,然后在第五章Odoo 12开发之导⼊、导出以及模块数据和第六章 Odoo 12开发之模型 – 结构化应⽤数据中进⾏了改进。
安装wkhtmltopdf
要正确地⽣成报表,应安装wkhtmltopdf⼯具的推荐版本,该⼯具的名称表⽰Webkit HTML to PDF。Odoo使⽤它来将渲染的 HTML 页⾯转化为 PDF ⽂档。有些版本的wkhtmltopdf库已知存在问题,⽐如不打印页⾯头部和底部,所以需挑选使⽤的版本。从Odoo 10开始,官⽅⽀持了0.12.5版本,这也是官⽅推荐的版本。
**⼩贴⼠:**官⽅Odoo项⽬有⼀个 wiki 页⾯,保持了对于wkthtmltopdf使⽤的信息和推荐。可通过 进⾏查看。
不幸的是你的主机系统,不论是Debian/Ubuntu或其它系统,所提供的安装包版本都不太⼀致。所以我们应下载和安装对于当前操作系统和 CPU 类型的推荐版本包。下载链接请见 。
⾸先应确保系统中所安装的不是错误的版本:
wkhtmltopdf --version
如果上述命令打印的结果不是我们需要的版本,应对其进⾏卸载。在Debian/Ubuntu系统中,使⽤的命令如下:
sudo apt-get remove --purge wkhtmltopdf
下⼀步我们需要下载适合我们系统的安装包并进⾏安装。通过下载链接进⾏查看。对于0.12.5,最新 Ubuntu 安装版本是针对Ubuntu 14.04 LTS稳定版,但对其后的Ubuntu系统应该同样⽣效。我们在最近发布的Ubuntu 64系统中进⾏安装,下载命令如下:
wget "github/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb"-O /tmp/wkhtml.deb
下⼀步应进⾏安装。安装本地deb⽂件并不会⾃动安装依赖,因此需要执⾏第⼆步来完成安装:
sudo dpkg -i /tmp/wkhtml.deb
这时可能会显⽰缺少依赖的错误,以下命令可解决这⼀问题:
sudo apt-get -f install
现在,我们可以检查wkhtmltopdf库是否正确安装并确认是否为所需版本:
$ wkhtmltopdf --version
wkhtmltopdf 0.12.5(with patched qt)
此时Odoo服务的启动⽇志就不会再提⽰You need Wkhtmltopdf to print a pdf version of the report的信息了。
创建业务报表
我们会继续使⽤前⾯⽂章所使⽤的library_app模块,进添加实现报表的⽂件。我们将创建的报表会长成这样
报表⽂件应放在模块⼦⽂件夹/reports中。⾸先我们来添加⼀个reports/library_l数据⽂件,不要忘记在
__manifest__.py⽂件的 data 下导⼊该⽂件。先在reports/library_l⽂件中声明⼀个新报表:
<?xml version="1.0"?>
<odoo>
<report id="action_library_book_report"
string="Library Books"
model="library.book"
report_type="qweb-pdf"
name="port_library_book_template"/>
</odoo>
标签是对向l写⼊数据的简写形式,这个模型是客户操作的特殊类型。它的数据可通过Settings > Technical > Actions >Reports菜单进⾏查看。
**⼩贴⼠:**在设计报表时,我们可能更倾向保留为report_type=”qweb-html”然后在完成时再修改为qweb-pdf⽂件。这样在QWeb模板中可更快速的⽣成报表并且更易于检查 HTML 结果。
执⾏完模块升级(~/odoo-dev/odoo/-bin -d dev12 -u library_app)后,图书表单视图中会在顶部显⽰⼀个 Print 按钮(列表视图中也有),它在Actions按钮的左侧,其中包含添加的运⾏报表的选项(Library Books)。
现在还⽆法⽣成报表,因为我们还没有进⾏定义。这是⼀个QWeb报表,因此需要⽤到QWeb模板。name 属性标识所使⽤的模板。与其它标识符引⽤不同,name 属性中需要添加模块前缀,我们必须使⽤完整的引⽤名称<module_name>.<identifier_name>。
QWeb 报表模板
在下⾯的代码可以看出,这个报表遵循⼀个基本框架。仅需在reports/library_l⽂件元素后添加如下代码:
<template id="report_library_book_template">
<t t-call="web.html_container">
<t t-call="al_layout">
<div class="page">
html表格元素
<!-- Report header content -->
<t t-foreach="docs" t-as="o">
<!-- Report row content -->
</t>
<!-- Report footer content -->
</div>
</t>
</t>
</template>
这⾥最重要的元素是使⽤标准报表结构的t-call指令。web.html_container模板进⾏⽀持 HTML ⽂档的基本设置。al_layout模板使⽤相应公司的相关设置处理报表头部和底部。可将其替换为web.internal_layout模板,它将只使⽤⼀个基本的头部。
ℹ  Odoo 11中的修改
对报表的⽀持布局从report 模块移到了 web 模块中。也就是说此前版本中使⽤al_layout或report.internal_layout的引⽤ ,在11.0中引⽤应修改为web.<…>。
external_layout模板可由⽤户⾃定义,Odoo 11引⼊了这⼀选项,在Settings > General Settings菜单中,然后相关内容在Business Documents > Document Template版块:
这⾥我们可以点击Change Document Template来从⼏个可⽤的模板中选取,甚⾄是点击Edit Layout来⾃定义所选模板的 XML。这⼀个报表框架适⽤于列表式报表,即报表中每条记录显⽰为⼀⾏。报表头部通常显⽰标题,底部区域则显⽰汇总。
另⼀种格式是⽂档报表,每条记录是单独⼀页,⽐如邮件。这种情况报表结构如下:
<template id="report_todo_task_template">
<t t-call="web.html_container">
<t t-call="al_layout">
<t t-foreach="docs" t-as="o">
<div class="page">
<!-- Report content -->
</div>
</t>
</t>
</t>
</template>
我们会创建⼀个列表式报表,所以还会使⽤此前的框架。现在我们已经有了基本框架。既然报表是QWeb模板,那么它也可以像其它视图那样进⾏继承。报表中使⽤的QWeb模板可使⽤常规视图继承使⽤的 XPath 表达式来进⾏继承。
补充:此时点击打印会输出⼀个空⽩的 PDF ⽂件。
在报表中展⽰数据
与看板视图不同,报表中的QWeb模板在服务端进⾏渲染,因此使⽤Python QWeb来实现。我们可以将其看作相同规格的两种实现,需要注意其中的⼀些区别。
⾸先这⾥的QWeb表达式由 Python 语法运⾏,⽽⾮JavaScript。对于最简的表达式⼏乎没有区别,但更为复杂的运算则可能存在差别。表达式运⾏上下⽂也不同,对于报表可使⽤如下变量:
docs是要打印记录的可迭代集合
doc_ids是⼀个要打印记录的 ID 列表
doc_model指定记录的模型,如library.book
time是对Python时间库的引⽤
user是运⾏报表的⽤户记录
res_company是当前⽤户的公司记录
可使⽤t-field来引⽤字段值,并可使⽤t-options来进⾏补充指定渲染字段内容的具体组件。
ℹ Odoo 11中的修改
在此前的 Odoo 版本中,使⽤的是t-field-options属性,但在 Odoo 11中淘汰了该属性,改⽤t-options属性。
例如,假设doc表⽰⼀条具体记录,代码如下:
<t t-field="doc.date_published"
t-options="{'widget': 'date'}"/>
现在我们可以开始设计报表的页⾯内容了。
**⼩贴⼠:**不幸的是官⽅⽂档中并没有涉及QWeb⽀持的组件及其选项。所以当前对其做进⼀步的了解只能是通过阅读相应源码。可访问,查继承ir.qweb.field的类,get_available_options() ⽅法可有助了解⽀持的选项。
报表内容由HTML书写,并且使⽤了Twitter Bootstrap 4来帮助设计报表布局。在⽹页开发中⼤量使⽤了Bootstrap,有关Bootstrap的完整指南请见。
以下为渲染报表头部的 XML 代码,应放在
中并替换掉现有的元素:
<!-- Report header content -->
<div class="container">
<div class="row bg-primary">
<div class="col-3">Title</div>
<div class="col-2">Publisher</div>
<div class="col-2">Date</div>
<div class="col-3">Publisher Address</div>
<div class="col-2">Authors</div>
</div>
<t t-foreach="docs" t-as="o">
<div class="row">
<!-- Report row content -->
</div>
</t>
<!-- Report footer content -->
</div>
内容的布局使⽤了Twitter Bootstrap的HTML⽹格系统。总的来说Bootstrap使⽤12列的⽹格布局,此处⽹格在
元素中。
ℹ Odoo 12中的修改
现在Odoo使⽤Bootstrap 4,它对此前 Odoo 版本中使⽤的Bootstrap 3并没有保持向后兼容。对于从Bootstrap 3改为Bootstrap 4的⼩技巧,可参照 Odoo 中关于这⼀话题的 。
可使⽤
来添加⾏。每⾏中还有多个单元格,分别占⽤不同列数,总计应为12列。每个单元格可通过

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。