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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                </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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
</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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                </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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                    </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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                    </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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                                </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="{&quot;widget&quot;: &quot;image&quot;, &quot;class&quot;: &quot;img-rounded&quot;}"/>
                                                </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.