4. eq_rmanager: Reports
Es sollen drei Arten von Reports entstehen. Jeweils einer für Quell- und Zielsprache sowie einer beide Sprachen enthält.
Auch die Reports müssen der Manifestdatei hinzugefügt werden.
'reports/header_footer_full_report.xml', 'reports/header_footer_subreport.xml', 'reports/report_sourcelanguage.xml', 'reports/report_targetlanguage.xml', 'reports/report_source_and_target.xml',
Auch Reports werden in XML definiert.
Report source:
<openerp> <data> <report id="report_session_source" model="requirement.line" string="Line Report(source language)" name="rmanager.report_session_view_source" file="rmanager.report_session_source" report_type="qweb-pdf" /> <template id="report_session_view_source"> <t t-call="report.html_container"> <t t-foreach="docs" t-as="doc"> <t t-call="rmanager.header_footer_subreport"> <div class="page"> <h2 t-raw="doc.name"/> <h4>requirement:</h4> <t t-foreach="doc.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections:</h4> <t t-foreach="doc.sections" t-as="section"> <p> <span t-raw="section.name"/></p> </t> <h4>description:</h4> <p> <span t-raw="doc.description"/></p> <t t-if="doc.image"> <h4>image: </h4> <p> <span t-field="doc.image" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> </t> </t> </t> </template> </data> </openerp>
Die Templatelanguage unterstützt if Ausdrücke. Damit ist es möglich ein Bild nur dann auszugeben wenn auch eines hinterlegt wurde.
<t t-if="doc.image"> <span t-field="doc.image" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </t>
Grundsätzlich können alle HTML Tags verwendet werden. Odoo erstellt dann eine druckbare Version.
Report target:
<openerp> <data> <report id="report_session_target" model="requirement.line" string="Line Report(target language)" name="rmanager.report_session_view_target" file="rmanager.report_session_target" report_type="qweb-pdf" /> <template id="report_session_view_target"> <t t-call="report.html_container"> <t t-foreach="docs" t-as="doc"> <t t-call="rmanager.header_footer_subreport"> <div class="page"> <h2 t-raw="doc.name_translated"/> <h4>requirements:</h4> <t t-foreach="doc.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections:</h4> <t t-foreach="doc.sections" t-as="section"> <p>section: <span t-raw="section.name"/></p> </t> <h4>description:</h4> <p>description translated: <span t-raw="doc.description_translated"/></p> <t t-if="doc.image_translated"> <h4>image translated: </h4> <p> <span t-field="doc.image_translated" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> </t> </t> </t> </template> </data> </openerp>
Sowohl die source wie auch die target Sprache ausgeben. Report source and target:
<openerp> <data> <report id="report_session_source_and_target" model="requirement.line" string="Line Report (source and target language)" name="rmanager.report_session_view_source_and_target" file="rmanager.report_session_source_and_target" report_type="qweb-pdf" /> <template id="report_session_view_source_and_target"> <t t-call="report.html_container"> <t t-foreach="docs" t-as="doc"> <t t-call="rmanager.header_footer_subreport"> <div class="page"> <div style="width: 50%; float:left;"> <h2 t-raw="doc.name"/> <h4>requirements: </h4> <t t-foreach="doc.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections: </h4> <t t-foreach="doc.sections" t-as="section"> <p>section: <span t-raw="section.name"/></p> </t> <h4>description: </h4> <p><span t-raw="doc.description"/></p> <t t-if="doc.image"> <h4>image: </h4> <p> <span t-field="doc.image" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> <div style="width: 50%; overflow: hidden;"> <h2 t-raw="doc.name_translated"/> <h4>requirements: </h4> <t t-foreach="doc.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections: </h4> <t t-foreach="doc.sections" t-as="section"> <p>section: <span t-raw="section.name"/></p> </t> <h4>description translated: </h4> <p><span t-raw="doc.description_translated"/></p> <t t-if="doc.image_translated"> <h4>image translated:</h4> <p> <span t-field="doc.image_translated" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> </div> </t> </t> </t> </template> </data> </openerp>
Als letztes noch das requirement mit allen sections als Report ausgeben. Es wird etwas css verwendet um das Blatt in zwei Teile zu trennen.
<openerp> <data> <report id="report_session_full" model="requirement" string="Full Report" name="rmanager.report_session_view_full" file="rmanager.report_session_full" report_type="qweb-pdf" /> <template id="report_session_view_full"> <t t-call="report.html_container"> <t t-foreach="docs" t-as="doc"> <t t-call="rmanager.header_footer_full_report"> <div class="page"> <t t-foreach="line" t-as="i"> <t t-foreach="i" t-as="li"> <div style="width: 50%; float:left;"> <h2 t-raw="li.name"/> <t t-foreach="li.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections: </h4> <t t-foreach="li.sections" t-as="section"> <p>section: <span t-raw="section.name"/></p> </t> <h4>description: </h4> <p><span t-raw="li.description"/></p> <t t-if="li.image_translated"> <h4>image: </h4> <p> <span t-field="li.image" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> <div style="width: 50%; overflow: hidden;"> <h2 t-raw="li.name_translated"/> <t t-foreach="li.requirement" t-as="requirement"> <p>requirement: <span t-raw="requirement.name"/></p> </t> <h4>sections: </h4> <t t-foreach="li.sections" t-as="section"> <p>section: <span t-raw="section.name"/></p> </t> <h4>description translated: </h4> <p><span t-raw="li.description_translated"/></p> <t t-if="li.image_translated"> <h4>image translated:</h4> <p> <span t-field="li.image_translated" t-field-options="{"widget": "image", "class": "img-rounded"}"/> </p> </t> </div> </t> </t> </div> </t> </t> </t> </template> </data> </openerp>
Report aus mehreren Modellen zusammenbauen
Sowohl die Quell- und die Zielsprache auszugeben ist etwas schwieriger. Von line kann auf requirement zugegriffen werden, aber in die andere Richtung gibt es kein Feld welches dies erlauben würde.
Möchte man nun bewerkstelligen dass der Report alle lines des entsprechenden requirements enthält, dann muss die render_html Methode für den entsprechnden Report überladen werden.
Mit
self.env[model].search([])
kann auf ein Objekt des entsprechenden models zugegriffen werden.
Möchte man nur bestimmete Werte auslesen, kann man zusätzlich die Ausgabe filtern.
self.env[model].search([(Feld in model als string, Operator, Vergleichsparameter)])
Im untern Beispiel wird das Modell 'requirement' nach der id des durch self übergebenen Modells durchsucht und zurückgegeben.(!!!Könnte man klarer schreiben!!!) self enthält nur die
from openerp import api, models class report_session_full(models.AbstractModel): _name = 'report.rmanager.report_session_view_full' @api.multi def render_html(self, data=None): req = self.env['requirement'].search([('id', '=', self.id)]) lines = self.env['requirement.line'].search([('requirement', '=', self.id)]) report_obj = self.env['report'] report = report_obj._get_report_from_name('rmanager.report_session_view_full') docargs = { 'doc_ids': req._ids, 'doc_model': report.model, 'docs': req, 'lines': lines, } return report_obj.render('rmanager.report_session_view_full', docargs)
req ist das model des Reports. Zusätzlich sollen aber auch alle lines, die zu diesem Report gehören, übergeben werden. Entsprechend wird die id des Models(self) mit der von requirement verglichen.
line = self.env['requirement.line'].search([('requirement', '=', self.id)])
Jetzt steht zusätzlich zu docs auch lines zur Verfügung. Der Report spricht die Beiden gleich an.