Звіти QWeb¶
Звіти пишуться в HTML/QWeb, як представлення веб-сайтів в Odoo. Ви можете використовувати звичайні інструменти потоку керування QWeb. Саму візуалізацію PDF виконує wkhtmltopdf.
Звіти оголошуються за допомогою дії report і Шаблон звіту для дії, яку потрібно використовувати.
Якщо це корисно чи необхідно, можна вказати Формат сторінки для звіта звіту.
Шаблон звіту¶
Шаблони звітів завжди надаватимуть такі змінні:
time
посилання на
time
зі стандартної бібліотеки Pythonuser
Запис
res.user
для користувача, який друкує звітres_company
запис для компанії поточного
user
website
поточний об’єкт веб-сайту, якщо такий є (цей елемент може бути присутнім, але
Немає
)web_base_url
базова URL-адреса для веб-сервера
context_timestamp
функція, яка приймає
datetime.datetime
у UTC1 і перетворює його на часовий пояс користувача, який друкує звіт
Мінімальний життєздатний шаблон¶
Мінімальний шаблон виглядатиме так:
<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>
Виклик external_layout
додасть у ваш звіт верхній і нижній колонтитули за умовчанням. Тіло PDF-файлу буде вмістом <div class="page">
. id
шаблону має відповідати імені, указаному в декларації звіту; наприклад account.report_invoice
для наведеного вище звіту. Оскільки це шаблон QWeb, ви можете отримати доступ до всіх полів об’єктів docs
, отриманих шаблоном.
За замовчуванням контекст візуалізації також відображатиме такі елементи:
docs
записи для поточного звіту
doc_ids
список ідентифікаторів для записів
docs
doc_model
модель для записів
docs
Якщо ви бажаєте отримати доступ до інших записів/моделей у шаблоні, вам знадобиться власний звіт, однак у такому випадку вам доведеться надати елементи вище, якщо вони вам потрібні.
Шаблони для перекладу¶
Якщо ви бажаєте перекладати звіти (наприклад, на мову партнера), вам потрібно визначити два шаблони:
Шаблон основного звіту
Перекладний документ
Потім ви можете викликати перекладний документ зі свого основного шаблону, вказавши атрибут t-lang
у код мови (наприклад, fr
або en_US
) або в поле запису. Вам також потрібно буде повторно переглянути пов’язані записи з відповідним контекстом, якщо ви використовуєте поля, які можна перекладати (наприклад, назви країн, умови продажу тощо.)
Попередження
Якщо ваш шаблон звіту не використовує поля записів, що перекладаються, повторний перегляд запису іншою мовою не є обов’язковим і вплине на продуктивність.
Для прикладу розглянемо звіт про Замовлення на продаж із модуля Продажі:
<!-- 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>
Головний шаблон викликає перекладний шаблон із doc.partner_id.lang
як параметр t-lang
, тому він буде відображено мовою партнера. Таким чином, кожне замовлення на продаж буде надруковано мовою відповідного клієнта. Якщо ви бажаєте перекласти лише тіло документа, але зберегти верхній і нижній колонтитули мовою за замовчуванням, ви можете викликати зовнішній макет звіту таким чином:
<t t-call="web.external_layout" t-lang="en_US">
Порада
Зверніть увагу, що це працює лише під час виклику зовнішніх шаблонів, ви не зможете перекласти частину документа, встановивши атрибут t-lang
на вузлі xml, відмінному від t-call
. Якщо ви бажаєте перекласти частину шаблону, ви можете створити зовнішній шаблон із цим частковим шаблоном і викликати його з основного за допомогою атрибута t-lang
.
Штрих-коди¶
Штрих-коди - це зображення, які повертає контролер, і їх можна легко вставляти у звіти завдяки синтаксису QWeb (наприклад, див. атрибути):
<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>
Більше параметрів можна передати як рядок запиту
<img t-att-src="'/report/barcode/?
barcode_type=%s&value=%s&width=%s&height=%s'%('QR', 'text', 200, 200)"/>
Корисні зауваження¶
У шаблоні звіту можна використовувати класи Twitter Bootstrap і FontAwesome
Локальний CSS можна розмістити безпосередньо в шаблоні
Глобальний CSS можна вставити в основний макет звіту, успадкувавши його шаблон і вставивши свій CSS:
<template id="report_saleorder_style" inherit_id="report.style"> <xpath expr="."> <t> .example-css-class { background-color: red; } </t> </xpath> </template>
Якщо виявляється, що у вашому PDF-звіті відсутні стилі, перегляньте ці інструкції.
Формат сторінки¶
Паперові формати є записами report.paperformat
і можуть містити такі атрибути:
name
(обов’язково)корисно лише як мнемоніка/опис звіту, якщо шукати його в певному списку
description
невеликий опис вашого формату
format
попередньо визначений формат (від A0 до A9, від B0 до B10, Legal, Letter, Tabloid,…) або
custom
; А4 за замовчуванням. Ви не можете використовувати неспеціальний формат, якщо ви визначаєте розміри сторінки.dpi
вихід DPI; 90 за замовчуванням
margin_top
,margin_bottom
,margin_left
,margin_right
розміри полів у мм
page_height
,page_width
розміри сторінки в мм
orientation
Альбом або портрет
header_line
логічне значення для відображення рядка заголовка
header_spacing
відстань між заголовками в мм
Приклад:
<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>
Користувальницькі звіти¶
За замовчуванням система звітування створює значення відтворення на основі цільової моделі, указаної в полі model
.
Однак спочатку він шукатиме модель під назвою report.module.report_name
і викличе цю модель _get_report_values(doc_ids, data)
, щоб підготувати дані відтворення для шаблону.
Це можна використовувати для включення довільних елементів для використання або відображення під час рендерингу шаблону, таких як дані з додаткових моделей:
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()
}
Попередження
Під час використання спеціального звіту «за замовчуванням» пов’язані з документом елементи (doc_ids
, doc_model
і docs
) не будуть включені. Якщо ви хочете їх, вам потрібно буде включити їх самостійно.
У наведеному вище прикладі контекст візуалізації міститиме «глобальні» значення, а також рядки
, які ми туди додали, але більше нічого.
Спеціальні шрифти¶
Якщо ви хочете використовувати користувацькі шрифти, вам потрібно буде додати свій власний шрифт і пов’язаний з ним less/CSS до набору ресурсів web.reports_assets_common
. Додавання користувацьких шрифтів до web.assets_common
або web.assets_backend
не зробить ваш шрифт доступним у звітах QWeb.
Приклад:
<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>
Вам потрібно буде визначити свій @font-face
у цьому меншому файлі, навіть якщо ви використовували його в іншому пакеті ресурсів (окрім web.reports_assets_common
).
Приклад:
@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;
}
Після того, як ви додали менше до свого набору ресурсів, ви можете використовувати класи - у цьому прикладі h1-title-big
- у вашому спеціальному звіті QWeb.
Звіти – це веб-сторінки¶
Звіти динамічно генеруються модулем звітів, і до них можна отримати прямий доступ через URL:
Наприклад, ви можете отримати доступ до звіту про замовлення на продаж у режимі html, перейшовши за адресою http://<адреса-сервера>/report/html/sale.report_saleorder/38
Або ви можете отримати доступ до PDF-версії за адресою http://<адреса-сервера>/report/pdf/sale.report_saleorder/38
- 1
не має значення, у якому часовому поясі фактично знаходиться об’єкт
python:datetime
(включно з відсутністю часового поясу), його часовий пояс буде беззастережно встановлено на UTC перед тим, як його буде налаштовано відповідно до користувача