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.
nameThe string that is shown on the menu.
report_nameThe name of the
trytond.report.Report.modelThe name of the
Model.reportThe path to the template file starting with the module directory.
template_extensionThe 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.