Reporting
Printed reports
在Odoo 8.0,Odoo 提供了一個全新的,基於 QWeb、Bootstrap、Wkhtmltopdf 的report engine。
一個 report 是由下面兩部分組成的:
ir.actions.report.xml
,可以用快捷方式report
代替,設置一個report所需的基本參數
<report
id="account_invoices"
model="account.invoice"
string="Invoices"
report_type="qweb-pdf"
name="account.report_invoice"
file="account.report_invoice"
attachment_use="True"
attachment="(object.state in ('open','paid')) and
('INV'+(object.number or '').replace('/','')+'.pdf')"
/>
- 一個標準的 QWeb view,用以設置report的實際格式
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="report.external_layout">
<div class="page">
<h2>Report title</h2>
</div>
</t>
</t>
</t>
the standard rendering context provides a number of elements, the most
important being:
"docs"
the records for which the report is printed
"user"
the user printing the report
其實reports都是標準的 web pages, 所以,他們可以通過URL來輸出結果,比如,Invoice 的report 就可已通過下面兩個URL訪問
- http://localhost:8069/report/html/account.report_invoice/1
- http://localhost:8069/report/pdf/account.report_invoice/1
分別訪問 html 版本 和 pdf 版本的 report
注意:
如果說你的 pdf 格式的 report 出現沒有 css 樣式的情況(html 格式的pdf 有樣式,但是pdf格式的沒有樣式,只有數據),多數情況是因爲你的wkhtmltopdf 與你的服務器連接出現的錯誤。
如果你通過查詢日誌,發現當你請求 pdf 格式report時,css 等文件並未GET 成功,那麼問題就明確了
wkhtmltopdf 程序是通過系統參數web.base.url
作爲root path 來連接各文件的,但是這個參數是根據 每次 administrator 登錄後,自動改變的。如果說,你的服務器使用的某種反向代理,可能就爲導致獲取不到css文件的問題,你可以通過設置下面兩個參數來解決這個問題
-report.url
, pointing to an URL reachable from your server (probably http://localhost:8069 or something similar). It will be used for this particular purpose only.
web.base.url.freeze
, when set to True, will stop the automatic updates to web.base.url.
練習 8-1
爲session model 創建一個report,report中應該顯示每一個session的 名字,開始,結束日期,以及列出參加人
openacademy/__openerp__.py
'views/openacademy.xml',
'views/partner.xml',
'views/session_workflow.xml',
'reports.xml', # new line
],
# only loaded in demonstration mode
'demo': [
openacademy/reports.xml
<openerp>
<data>
<report
id="report_session"
model="openacademy.session"
string="Session Report"
name="openacademy.report_session_view"
file="openacademy.report_session"
report_type="qweb-pdf" />
<template id="report_session_view">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="report.external_layout">
<div class="page">
<h2 t-field="doc.name"/>
<p>From <span t-field="doc.start_date"/> to <span t-field="doc.end_date"/></p>
<h3>Attendees:</h3>
<ul>
<t t-foreach="doc.attendee_ids" t-as="attendee">
<li><span t-field="attendee.name"/></li>
</t>
</ul>
</div>
</t>
</t>
</t>
</template>
</data>
</openerp>
Dashboards
練習 8-2
創建一個 dashboard,內含一個 graph view ,一個 sessions 的 calendar view 以及一個 courses 的 list view。併爲這個 dashboard 創建一個menuitem,並且當用戶點擊Openacademy時,作爲默認展示。
創建一個 openacademy/views/session_board.xml 。內含一個 board view,一個action 用以展現這個view,
注意:dashboard view 可以分爲 1,1-1,1-2,2-1,以及1-1-1
修改openacademy/__openerp__.py
openacademy/__openerp__.py
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base', 'board'], # 修改
# always loaded
'data': [
'views/openacademy.xml',
'views/partner.xml',
'views/session_workflow.xml',
'views/session_board.xml', # new line
'reports.xml',
],
# only loaded in demonstration mode
openacademy/views/session_board.xml
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.actions.act_window" id="act_session_graph">
<field name="name">Attendees by course</field>
<field name="res_model">openacademy.session</field>
<field name="view_type">form</field>
<field name="view_mode">graph</field>
<field name="view_id"
ref="openacademy.openacademy_session_graph_view"/>
</record>
<record model="ir.actions.act_window" id="act_session_calendar">
<field name="name">Sessions</field>
<field name="res_model">openacademy.session</field>
<field name="view_type">form</field>
<field name="view_mode">calendar</field>
<field name="view_id" ref="openacademy.session_calendar_view"/>
</record>
<record model="ir.actions.act_window" id="act_course_list">
<field name="name">Courses</field>
<field name="res_model">openacademy.course</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<record model="ir.ui.view" id="board_session_form">
<field name="name">Session Dashboard Form</field>
<field name="model">board.board</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Session Dashboard">
<board style="2-1">
<column>
<action
string="Attendees by course"
name="%(act_session_graph)d"
height="150"
width="510"/>
<action
string="Sessions"
name="%(act_session_calendar)d"/>
</column>
<column>
<action
string="Courses"
name="%(act_course_list)d"/>
</column>
</board>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="open_board_session">
<field name="name">Session Dashboard</field>
<field name="res_model">board.board</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="usage">menu</field>
<field name="view_id" ref="board_session_form"/>
</record>
<menuitem
name="Session Dashboard" parent="base.menu_reporting_dashboard"
action="open_board_session"
sequence="1"
id="menu_board_session" icon="terp-graph"/>
</data>
</openerp>