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 Report and 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 Report links the 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 Action Keyword makes the 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.