Báo cáo QWeb

Báo cáo được viết bằng HTML/QWeb, giống như lượt xem trang web trong SoOn. Bạn có thể sử dụng QWeb control flow tools thông thường. Bản thân việc hiển thị PDF được thực hiện bởi wkhtmltopdf.

Các báo cáo được khai báo bằng cách sử dụng report actionMẫu báo cáo cho hành động sẽ sử dụng.

Nếu hữu ích hoặc cần thiết, có thể chỉ định Định dạng giấy cho báo cáo báo cáo.

Mẫu báo cáo

Mẫu báo cáo sẽ luôn cung cấp các biến sau:

thời gian

một tham chiếu đến time từ thư viện chuẩn Python

người dùng

bản ghi res.user dành cho người dùng in báo cáo

res_company

bản ghi cho công ty của người dùng hiện tại

trang web

đối tượng trang web hiện tại, nếu có (mục này có thể hiện diện nhưng Không )

web_base_url

url cơ sở cho máy chủ web

bối cảnh_dấu thời gian

một hàm lấy datetime.datetime trong UTC1 và chuyển đổi nó thành múi giờ của người dùng in báo cáo

Mẫu khả thi tối thiểu

Một mẫu tối thiểu sẽ trông giống như:

<template id="report_invoice">
    <t t-call="web.html_container">
        <t t-foreach="docs" t-as="o">
            <t t-call="web.external_layout">
                <div class="page">
                    <h2>Report title</h2>
                    <p>This object's name is <span t-field="o.name"/></p>
                </div>
            </t>
        </t>
    </t>
</template>

Việc gọi external_layout sẽ thêm đầu trang và chân trang mặc định vào báo cáo của bạn. Nội dung PDF sẽ là nội dung bên trong <div class="page">. id của mẫu phải là tên được chỉ định trong khai báo báo cáo; ví dụ account.report_invoice cho báo cáo trên. Vì đây là mẫu QWeb nên bạn có thể truy cập tất cả các trường của đối tượng docs mà mẫu nhận được.

Theo mặc định, bối cảnh hiển thị cũng sẽ hiển thị các mục sau:

tài liệu

bản ghi cho báo cáo hiện tại

doc_id

danh sách id cho bản ghi docs

doc_model

mô hình cho các bản ghi docs

Nếu bạn muốn truy cập các bản ghi/mô hình khác trong mẫu, bạn sẽ cần a custom report, tuy nhiên trong trường hợp đó, bạn sẽ phải cung cấp các mục ở trên nếu cần.

Mẫu có thể dịch

Nếu bạn muốn dịch báo cáo (chẳng hạn sang ngôn ngữ của đối tác), bạn cần xác định hai mẫu:

  • Mẫu báo cáo chính

  • Tài liệu có thể dịch

Sau đó, bạn có thể gọi tài liệu có thể dịch từ mẫu chính của mình với thuộc tính t-lang được đặt thành mã ngôn ngữ (ví dụ: fr hoặc en_US) hoặc thành trường bản ghi. Bạn cũng sẽ cần duyệt lại các bản ghi liên quan với ngữ cảnh phù hợp nếu bạn sử dụng các trường có thể dịch được (như tên quốc gia, điều kiện bán hàng, v.v.)

Cảnh báo

Nếu mẫu báo cáo của bạn không sử dụng các trường bản ghi có thể dịch được thì việc duyệt lại bản ghi bằng ngôn ngữ khác là không cần thiết và sẽ ảnh hưởng đến hiệu suất.

Ví dụ: hãy xem báo cáo Đơn đặt hàng từ mô-đun Bán hàng

<!-- Main template -->
<template id="report_saleorder">
    <t t-call="web.html_container">
        <t t-foreach="docs" t-as="doc">
            <t t-call="sale.report_saleorder_document" t-lang="doc.partner_id.lang"/>
        </t>
    </t>
</template>

<!-- Translatable template -->
<template id="report_saleorder_document">
    <!-- Re-browse of the record with the partner lang -->
    <t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)" />
    <t t-call="web.external_layout">
        <div class="page">
            <div class="oe_structure"/>
            <div class="row">
                <div class="col-6">
                    <strong t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoice and shipping address:</strong>
                    <strong t-if="doc.partner_shipping_id != doc.partner_invoice_id">Invoice address:</strong>
                    <div t-field="doc.partner_invoice_id" t-options="{&quot;no_marker&quot;: True}"/>
                <...>
            <div class="oe_structure"/>
        </div>
    </t>
</template>

Mẫu chính gọi mẫu có thể dịch với doc.partner_id.lang là tham số t-lang nên sẽ được hiển thị bằng ngôn ngữ của đối tác. Bằng cách này, mỗi Lệnh bán sẽ được in bằng ngôn ngữ của khách hàng tương ứng. Nếu bạn chỉ muốn dịch phần nội dung của tài liệu nhưng vẫn giữ đầu trang và chân trang ở ngôn ngữ mặc định, bạn có thể gọi bố cục bên ngoài của báo cáo theo cách này:

<t t-call="web.external_layout" t-lang="en_US">

Mẹo

Xin lưu ý rằng điều này chỉ hoạt động khi gọi các mẫu bên ngoài, bạn sẽ không thể dịch một phần tài liệu bằng cách đặt thuộc tính t-lang trên nút xml ngoài t-call. Nếu bạn muốn dịch một phần của mẫu, bạn có thể tạo một mẫu bên ngoài với mẫu một phần này và gọi nó từ mẫu chính bằng thuộc tính t-lang.

Mã vạch

Mã vạch là hình ảnh được bộ điều khiển trả về và có thể dễ dàng được nhúng vào báo cáo nhờ cú pháp QWeb (ví dụ: xem thuộc tính):

<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>

Nhiều tham số hơn có thể được truyền dưới dạng chuỗi truy vấn

<img t-att-src="'/report/barcode/?
    barcode_type=%s&amp;value=%s&amp;width=%s&amp;height=%s'%('QR', 'text', 200, 200)"/>

Nhận xét hữu ích

  • Các lớp Twitter Bootstrap và FontAwgie có thể được sử dụng trong mẫu báo cáo của bạn

  • CSS cục bộ có thể được đặt trực tiếp vào mẫu

  • CSS toàn cầu có thể được chèn vào bố cục báo cáo chính bằng cách kế thừa mẫu của nó và chèn CSS của bạn

    <template id="report_saleorder_style" inherit_id="report.style">
      <xpath expr=".">
        <t>
          .example-css-class {
            background-color: red;
          }
        </t>
      </xpath>
    </template>
    
  • Nếu có vẻ như báo cáo PDF của bạn thiếu kiểu, vui lòng kiểm tra các hướng dẫn này.

Định dạng giấy

Định dạng giấy là bản ghi của report.paperformat và có thể chứa các thuộc tính sau:

tên (bắt buộc)

chỉ hữu ích như một cách ghi nhớ/mô tả báo cáo khi tìm kiếm một báo cáo trong danh sách sắp xếp nào đó

`` mô tả``

một mô tả nhỏ về định dạng của bạn

`` định dạng``

hoặc định dạng được xác định trước (A0 đến A9, B0 đến B10, Pháp lý, Thư, Báo lá cải,...) hoặc tùy chỉnh; A4 theo mặc định. Bạn không thể sử dụng định dạng không tùy chỉnh nếu bạn xác định kích thước trang.

dpi

đầu ra dpi; 90 theo mặc định

margin_top, margin_bottom, margin_left, margin_right

kích thước lề tính bằng mm

page_height, page_width

kích thước trang tính bằng mm

`` định hướng``

Phong cảnh hoặc Chân dung

dòng_tiêu đề

boolean để hiển thị dòng tiêu đề

`` khoảng cách tiêu đề``

khoảng cách tiêu đề tính bằng mm

Ví dụ:

<record id="paperformat_frenchcheck" model="report.paperformat">
    <field name="name">French Bank Check</field>
    <field name="default" eval="True"/>
    <field name="format">custom</field>
    <field name="page_height">80</field>
    <field name="page_width">175</field>
    <field name="orientation">Portrait</field>
    <field name="margin_top">3</field>
    <field name="margin_bottom">3</field>
    <field name="margin_left">3</field>
    <field name="margin_right">3</field>
    <field name="header_line" eval="False"/>
    <field name="header_spacing">3</field>
    <field name="dpi">80</field>
</record>

Báo cáo tùy chọn

Theo mặc định, hệ thống báo cáo xây dựng các giá trị hiển thị dựa trên mô hình đích được chỉ định thông qua trường model.

Tuy nhiên, trước tiên, nó sẽ tìm một mô hình có tên report.module.report_name và gọi _get_report_values(doc_ids, data) của mô hình đó để chuẩn bị dữ liệu hiển thị cho mẫu.

Điều này có thể được sử dụng để bao gồm các mục tùy ý để sử dụng hoặc hiển thị trong khi hiển thị mẫu, chẳng hạn như dữ liệu từ các mô hình bổ sung:

from odoo import api, models

class ParticularReport(models.AbstractModel):
    _name = 'report.module.report_name'

    def _get_report_values(self, docids, data=None):
        # get the report action back as we will need its data
        report = self.env['ir.actions.report']._get_report_from_name('module.report_name')
        # get the records selected for this rendering of the report
        obj = self.env[report.model].browse(docids)
        # return a custom rendering context
        return {
            'lines': docids.get_lines()
        }

Cảnh báo

Khi sử dụng báo cáo tùy chỉnh, các mục liên quan đến tài liệu "mặc định" (doc_ids, doc_modeldocs) sẽ không được bao gồm. Nếu bạn muốn chúng, bạn sẽ cần phải tự mình đưa chúng vào.

Trong ví dụ trên, ngữ cảnh hiển thị sẽ chứa các giá trị "toàn cục" cũng như dòng mà chúng tôi đặt vào đó nhưng không có gì khác.

Phông chữ tùy chỉnh

Nếu muốn sử dụng phông chữ tùy chỉnh, bạn sẽ cần thêm phông chữ tùy chỉnh của mình và less/CSS liên quan vào gói nội dung web.reports_assets_common. Việc thêm (các) phông chữ tùy chỉnh của bạn vào web.assets_common hoặc web.assets_backend sẽ không làm cho phông chữ của bạn có sẵn trong báo cáo QWeb.

Ví dụ:

<template id="report_assets_common_custom_fonts" name="Custom QWeb fonts" inherit_id="web.report_assets_common">
    <xpath expr="." position="inside">
        <link href="/your_module/static/src/less/fonts.less" rel="stylesheet" type="text/less"/>
    </xpath>
</template>

Bạn sẽ cần xác định @font-face của mình trong tệp less này, ngay cả khi bạn đã sử dụng trong một gói nội dung khác (không phải web.reports_assets_common).

Ví dụ:

@font-face {
    font-family: 'MonixBold';
    src: local('MonixBold'), local('MonixBold'), url(/your_module/static/fonts/MonixBold-Regular.otf) format('opentype');
}

.h1-title-big {
    font-family: MonixBold;
    font-size: 60px;
    color: #3399cc;
}

Sau khi bạn đã thêm less vào gói nội dung của mình, bạn có thể sử dụng các lớp - trong ví dụ này là h1-title-big - trong báo cáo QWeb tùy chỉnh của bạn.

Báo cáo là các trang web

Báo cáo được mô-đun báo cáo tạo động và có thể được truy cập trực tiếp qua URL:

Ví dụ: bạn có thể truy cập báo cáo Đơn đặt hàng ở chế độ html bằng cách truy cập http://<server-address>/report/html/sale.report_saleorder/38

Hoặc bạn có thể truy cập phiên bản pdf tại http://<server-address>/report/pdf/sale.report_saleorder/38

1

không quan trọng đối tượng python:datetime thực sự ở múi giờ nào (bao gồm cả không có múi giờ), múi giờ của nó sẽ được đặt thành UTC một cách vô điều kiện trước khi được điều chỉnh theo múi giờ của người dùng