Create report¶
A frequent requirement is to generate a printable document for a record.
For that we use trytond.report.Report
which provides the tooling to
render OpenDocument based on relatorio template.
First we create a trytond.report.Report
class in opportunity.py
:
from trytond.report import Report
...
class OpportunityReport(Report):
__name__ = 'training.opportunity.report'
And we register it in the Pool
as type report
in
__init__.py
:
def register():
...
Pool.register(
opportunity.OpportunityReport,
module='opportunity', type_='report')
Now we have to create a ir.action.report
and ir.action.keyword
in
opportunity.xml
:
<tryton>
<data>
...
<record model="ir.action.report" id="report_opportunity">
<field name="name">Opportunity</field>
<field name="report_name">training.opportunity.report</field>
<field name="model">training.opportunity</field>
<field name="report">opportunity/opportunity.fodt</field>
<field name="template_extension">odt</field>
</record>
<record model="ir.action.keyword" id="report_opportunity_keyword">
<field name="keyword">form_print</field>
<field name="model">training.opportunity,-1</field>
<field name="action" ref="report_opportunity"/>
</record>
</data>
</tryton>
The ir.action.report
links the trytond.report.Report
with the
Model
.
name
The string that is shown on the menu.
report_name
The name of the
trytond.report.Report
.model
The name of the
Model
.report
The path to the template file starting with the module directory.
template_extension
The template format.
And like for the wizard, the
ir.action.keyword
makes the trytond.report.Report
available as action
to any training.opportunity
.
Finally we create the OpenDocument template as opportunity.fodt
using
LibreOffice.
We use the Genshi XML Template Language implemented by relatorio using
Placeholder Text
.
The rendering context contains the variable records
which is a list of
selected record instances.
Here is an example of the directives to insert in the document:
<for each="opportunity in records">
Opportunity: <opportunity.rec_name>
Party: <opportunity.party.rec_name>
Start Date: <format_date(opportunity.start_date) if opportunity.start_date else ''>
End Date: <format_date(opportunity.end_date) if opportunity.end_date else ''>
Comment:
<for each="line in (opportunity.comment or '').splitlines()">
<line>
</for>
</for>
Note
We must render text field line by line because OpenDocument does not consider simple breakline.
Update database¶
As we have registered new report and XML records, we need to update the database with:
$ trytond-admin -d test --all
And restart the server and reconnect with the client to test rendering the report:
$ trytond
Next we create a a reporting model using SQL query.