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 action và Mẫ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 Pythonngười dùng
bản ghi
res.user
dành cho người dùng in báo cáores_company
bản ghi cho công ty của
người dùng
hiện tạitrang 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 có
)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="{"no_marker": 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&value=%s&width=%s&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_model
và docs
) 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