Отчеты пишутся в формате HTML / QWeb, как и все обычные представления в Одо. Вы можете использовать обычное: ref: Инструменты потока управления QWeb <reference / qweb>
. Сама рендеринг PDF выполняется wkhtmltopdf.
Если вы хотите создать отчет по определенной модели, вам нужно будет определить это: ref: reference / reports / report
и: ref:` reference / reports / templates`, которые он будет использовать. Если вы хотите, вы также можете указать конкретный: ref: reference / reports / paper_formats
для этого отчета. Наконец, если вам нужен доступ к более чем вашей модели, вы можете определить класс: ref: reference / reports / custom_reports
, который даст вам доступ к большему количеству моделей и записей в шаблоне.
Отчет
Каждый отчет должен быть объявлен с помощью: ref: report action <reference / actions / report>
.
Для простоты для определения отчета доступен сокращенный элемент `` <report> [UNKNOWN NODE problematic], а не настраивать: ref: действие <reference / actions / report>
и его окружение вручную. Этот `` <report> `` может принимать следующие атрибуты:
id
Сгенерированная запись: term:
external id
name
(обязательно)Полезен только в качестве мнемоники/описания печатной формы, при поиске в списке форм
model
(обязательно)модель данных к которой относится ваша печатная форма
report_type
(обязательно)или
qweb-pdf
для создания PDF файлов печатных форм, илиqweb-html
для HTMLreport_name
имя печатной формы (которое будет присвоено выданному PDF файлу)
groups
: Класс: поле
~ odoo.fields.Many2many
для групп, разрешенных для просмотра / использования текущего отчетаattachment_use
Если установлено значение True, отчет будет сохранен как прикрепление к записи с использованием имени, сгенерированного выражением `` attachment'[UNKNOWN NODE problematic]; Вы можете использовать это, если вам нужно, чтобы ваш отчет генерировался только один раз (по юридическим причинам, например)
attachment
Выражение python, которое определяет имя отчета; Запись доступна как переменная `` объект``
paperformat
Внешний идентификатор формата бумаги, который вы хотите использовать (по умолчанию формат бумаги компании, если не указан)
Пример:
<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')"
/>
Шаблон отчета
Минимальный жизнеспособный шаблон
Минимальный шаблон будет выглядеть так:
<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``
- `` doc_model``
Модель для записей `` docs``
- 1 раза
Ссылка на: mod:
python: time
из стандартной библиотеки Pythonuser
Запись
res.user`
для пользователя, печатающего отчет- `` Res_company``
Запись текущей компании `` пользователь``
Если вы хотите получить доступ к другим записям / моделям в шаблоне, вам понадобится: ref: custom report <reference / reports / custom_reports>
.
Переводимые шаблоны
Если вы хотите перевести отчеты (например, на язык партнера), вам необходимо определить два шаблона:
Основной шаблон отчета
Переводимый документ
Затем вы можете вызвать переводимый документ из вашего основного шаблона с атрибутом `` 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-xs-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``.
Штрих-коды
Barcodes are images returned by a controller and can easily be embedded in reports thanks to the QWeb syntax (e.g. see Атрибуты):
<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>
Дополнительные параметры могут быть переданы как строка запроса
<img t-att-src="'/report/barcode/?
type=%s&value=%s&width=%s&height=%s'%('QR', 'text', 200, 200)"/>
Полезные заметки
Щебетать классы 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 отсутствуют стили, проверьте: ref:
эти инструкции <reference / backend / reporting / printed-reports / pdf-without-styles>
.
Формат бумаги
Форматы бумаги - это записи `` report.paperformat`` и могут содержать следующие атрибуты:
name
(обязательно)Полезен только в качестве мнемоники/описания печатной формы, при поиске в списке форм
- Описание
Небольшое описание вашего формата
format
Либо предопределенный формат (от A0 до A9, от B0 до B10, законный, буква, таблоид, ...) или `` custom``; A4 по умолчанию. Вы не можете использовать нестандартный формат, если вы определяете размеры страницы.
- DPI.
Выходной ДОИ; 90 по умолчанию
- `` Margin_top``,
margin_bottom`
,` margin_left``,margin_right`
Размеры полей в мм
- `` Page_height``, `` page_width``
Размер страницы в мм
- ориентированной позиции
Пейзаж или Портрет
- `` Header_line``
Boolean для отображения строки заголовка
- `` 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>
Пользовательские отчеты
Модель отчета имеет стандартную функцию `` get_html``, которая ищет модель с именем: samp: report. {Module.report_name}
. Если он существует, он будет использовать его для вызова движка QWeb; В противном случае будет использоваться общая функция. Если вы хотите настроить свои отчеты путем включения большего количества вещей в шаблон (например, записи других моделей), вы можете определить эту модель, перезаписать функцию `` render_html`` и передать объекты в словаре `` docargs`` :
from odoo import api, models
class ParticularReport(models.AbstractModel):
_name = 'report.module.report_name'
@api.model
def render_html(self, docids, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('module.report_name')
docargs = {
'doc_ids': docids,
'doc_model': report.model,
'docs': self,
}
return report_obj.render('module.report_name', docargs)
Отчеты - это веб-страницы
Отчеты динамически генерируются модулем отчета и могут быть доступны напрямую через URL:
Например, вы можете получить доступ к отчету о заказе на продажу в режиме html, перейдя в http: // <server-address> /report/html/sale.report_saleorder/38
Или вы можете получить доступ к PDF-версии по адресу http: // <server-address> /report/pdf/sale.report_saleorder/38