odoo

Packer.Odoo.10---Chapter 10

2017-10-18  本文已影响52人  F4A3

创建一个QWeb 报告视图

安装wkhtmltopdf包(不是python包)

创建业务报告

报告视图
{
    'name': 'To-Do Report',
    'description': 'Report  for todo-task',
    'author': 'xer',
    'depends': ['todo_kanban', 'website'],
    'data': ['views/todo_report.xml',
             'reports/todo_model_report.xml'
             ]
}

创建reports子文件夹,新建todo_report.xml文件.填入下面的xml代码

<odoo>
  <report id="action_todo_task_report"
      string="To-do Tasks"
      model="todo.task"
      report_type="qweb-pdf"
      name="todo_report.report_todo_task_template"/>
</odoo>
- `<report>`标签是`ir.actions.report.xml`模型的缩写形式.它是一个独特的客户端动作,它的数据能够通过开发者模式 **Settings | Technical | Reports** 菜单获取到。
- 我们安装完todo_report模块后,会在to-do task表单视图上看到 **Print** 按钮(在 **More** 按钮的左边). Print 按钮中包含了我们刚定义的report动作.
这个动作目前无法起效,因为我们还没有定义这个报告的内容.我们需要在`todo_report.xml`文件中添加QWeb模板.需要注意的是`name`属性标识了我们使用的模板,这`name`属性中,模块前缀必须要添加.
## QWeb 报告模板
- 报告通常遵循的基本骨架如下:
```xml
<template id="report_todo_task_template">
  <t t-call="report.html_container">
    <t t-call="report.external_layout">
        <div class="page">
            <!-- Report page content -->
          </div>
         </t>
     </t>
</template>

在报告中呈现数据

<!--report page content-->
    <div class="row bg-primary">
     <div class="col-xs-3">
      <span class="glyphicon glyphicon-pushpin"/>
             What
     </div>
       <div class="col-xs-2">Who</div>
       <div class="col-xs-1">When</div>
       <div class="col-xs-3">Where</div>
       <div class="col-xs-3">Watchers</div>
     </div>
        <t t-foreach="docs" t-as="o">
        <div class="row">
              <!-- Date Row Content -->
          </div>
         </t>
- 内容的布局可以参考Twittrt Bootstrap HTML 网格系统。在一个容器中,Bootstrap有12列网格布局。添加新的一行可以使用`<div class="row">`来实现、在一行中,我们有12个单元格。每个单元格可以使用`<div class='col-xs-N">`来定位,N代表列的跨度。上面的代码其实就是展示了第一行的默认数据。如图

![定义第一行数据](https://img.haomeiwen.com/i6865906/b8d532312c5a24db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

因为report视图是在后端渲染的,数据记录可以看做是对象,所以我们可以使用点操作符来获取关联模型中的字段。
```xml
<div class="col-xs-3">
     <h4><span t-field="o.name"/></h4>
</div>
      <div class="col-xs-2">
            <span t-field="o.user_id"/>
      </div>
      <div class="col-xs-1">
             <span t-field="o.date_deadline"/>
               <span t-field="o.amount_cost" t-field-options='{ "widget":"monetary", "display_currency": "o.currency_id"}'/>
        </div>
     <div class="col-xs-3">
             <div t-field="res_company.partner_id"
                                 t-field-options="{
                                 'widget': 'contact',
                                 'fields':['address','name','phone','fax'], 'no_marker': true}"/>
             </div>
        <div class="col-xs-3">
              <!--Render followers-->
        </div>

渲染图片

 <!--Render followers-->
      <ul class="media-list">
          <t t-foreach="o.message_follower_ids" t-as="f">
            <li t-if="f.partner_id.image_small" class="media-left">
             ![]('data:image/png;base64,%s' %f.partner_id.image_small)
             <span class="media-body" t-field="f.partner_id.name"/>
            </li>
         </t>
      </ul>

二进制类字段可以通过 base64 形式表现。因此我们直接使用t-att-src属性动态的展示图片src地址可以了.

统计总数跟计算总数

 <div class="row">
   <div class="col-xs-3">
       Count: <t t-esc="len(docs)"/>
   </div>
 <div class="col-xs-2"/>
 <div class="col-xs-1">
      Total:
    <t t-esc="sum([o.amount_cost for o in docs])" />
 </div>
  <div class="col-xs-3"/>
  <div class="col-xs-3"/>
</div>
<t t-set="follower_count" t-value="0" />

然后在循环中添加实时统计代码

<!--Running total-->
    <t t-set="follower_count" t-value="follower_count + len(o.message_follower_ids)"/>
        Accumulated #<t t-esc="follower_count"/>

定义打印用纸格式

    <!--the print paper setting-->
    <record id="paperformat_euro_landscape"
            model="report.paperformat">
        <field name="name">European A4 Landscape</field>
        <field name="default" eval="True" />
        <field name="format">A4</field>
        <field name="page_height">0</field>
        <field name="page_width">0</field>
        <field name="orientation">Landscape</field>
        <field name="margin_top">40</field>
        <field name="margin_bottom">23</field>
        <field name="margin_left">7</field>
        <field name="margin_right">7</field>
        <field name="header_line" eval="False" />
        <field name="header_spacing">35</field>
        <field name="dpi">90</field>
    </record>
    <!--use the setting paper with attr 'paperformat'-->
    <report id="action_todo_task_report"
            string="To-do Tasks"
            model="todo.task"
            report_type="qweb-html"
            name="todo_report.report_todo_task_template"
            paperformat="paperformat_euro_landscape"
     />

在报告视图中使用语言翻译

    <template id="report_todo_task_translated">
        <t t-call="todo_report.report_todo_task_template"
           t-lang="user.lang">
            <t t-set="docs"
               t-value="docs"/>
        </t>
    </template>

直接使用我们的SQL语句来构造报告

from odoo import models, fields

class TodoReport(models.Model):
    _name = 'todo.task.report'
    _description = 'To-do Report'
    _sql = """
            CREATE OR REPLACE VIEW todo_task_report AS
            select *
            from todo_task
            where active = TRUE 
            """
    name = fields.Char('Description')
    is_done = fields.Boolean('Done?')
    active = fields.Boolean('Active?')
    user_id = fields.Many2one('res.users', 'Responsible')
    date_deadline = fields.Date('Deadline')
<odoo>
    <report id="action_todo_model_report"
            string="To-do Special Report"
            model="todo.task"
            report_type="qweb-html"
            name="todo_report.report_todo_task_special"
            />
    <template id="report_todo_task_special">
        <t t-call="report.html_container">
            <t t-call="report.external_layout">
                <div class="page">
                    <table class="table table-striped">
                        <tr>
                            <th>Title</th>
                            <th>Owner</th>
                            <th>Deadline</th>
                        </tr>
                        <t t-foreach="docs" t-as="o">
                            <tr>
                                <td class="col-xs-6">
                                    <span t-filed="o.name"/>
                                </td>
                                <td class="col-xs-3">
                                    <span t-filed="o.user_id"/>
                                </td>
                                <td class="col-xs-3">
                                    <span t-filed="o.date_deadline"/>
                                </td>
                            </tr>
                        </t>
                    </table>
                </div>
            </t>
        </t>
    </template>
</odoo>
上一篇 下一篇

猜你喜欢

热点阅读