建立一個Odoo Module (八)- Reporting

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訪問

分別訪問 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章