QWeb Jelentések

A jelentések HTML/QWeb formátumban íródnak, hasonlóan az Odoo webhely nézeteihez. Használhatja a szokásos QWeb vezérlési eszközöket. Maga a PDF renderelés a wkhtmltopdf által történik.

A jelentéseket egy jelentés művelet használatával deklarálják, és egy Jelentés sablon a művelethez.

Ha hasznos vagy szükséges, megadható egy Papírformátum a jelentéshez.

Jelentés sablon

A jelentés sablonok mindig a következő változókat biztosítják:

time

hivatkozás a time modulra a Python standard könyvtárból

user

res.user rekord a jelentést nyomtató felhasználóhoz

res_company

rekord az aktuális user cégéről

website

az aktuális weboldal objektum, ha van (ez az elem jelen lehet, de None)

web_base_url

a webszerver alap URL-je

context_timestamp

egy függvény, amely datetime.datetime típusú objektumot vesz át UTC-ben1 és átalakítja a jelentést nyomtató felhasználó időzónájába

Minimálisan életképes sablon

Egy minimális sablon így nézne ki:

<template id="report_invoice">
    <t t-call="web.html_container">
        <t t-foreach="docs" t-as="o">
            <t t-call="web.external_layout">
                <div class="page">
                    <h2>Report title</h2>
                    <p>This object's name is <span t-field="o.name"/></p>
                </div>
            </t>
        </t>
    </t>
</template>

Calling external_layout will add the default header and footer on your report. The PDF body will be the content inside the <div class="page">. The template’s id must be the name specified in the report declaration; for example account.report_invoice for the above report. Since this is a QWeb template, you can access all the fields of the docs objects received by the template.

Alapértelmezés szerint a renderelési környezet a következő elemeket is elérhetővé teszi:

docs

rekordok az aktuális jelentéshez

doc_ids

az docs rekordok azonosítóinak listája

doc_model

modell a docs rekordokhoz

Ha más rekordokhoz/modellekhez szeretne hozzáférni a sablonban, szüksége lesz egy egyedi jelentésre, azonban ebben az esetben biztosítania kell a fenti elemeket, ha szüksége van rájuk.

Fordítható sablonok

Ha jelentéseket szeretne lefordítani (például egy partner nyelvére), két sablont kell meghatároznia:

  • A fő jelentéssablon

  • A fordítható dokumentum

Ezután a fordítható dokumentumot a fő sablonból hívhatja meg a t-lang attribútum beállításával egy nyelvi kódra (például fr vagy en_US) vagy egy rekord mezőre. Szükséges lesz a kapcsolódó rekordok újra böngészése a megfelelő kontextussal, ha fordítható mezőket használ (mint például országnevek, értékesítési feltételek stb.)

Figyelem

Ha a jelentéssablon nem használ fordítható rekordmezőket, a rekord más nyelven történő újra böngészése nem szükséges, és hatással lesz a teljesítményre.

Például nézzük meg az Értékesítési Rendelés jelentést az Értékesítési modulból:

<!-- Main template -->
<template id="report_saleorder">
    <t t-call="web.html_container">
        <t t-foreach="docs" t-as="doc">
            <t t-call="sale.report_saleorder_document" t-lang="doc.partner_id.lang"/>
        </t>
    </t>
</template>

<!-- Translatable template -->
<template id="report_saleorder_document">
    <!-- Re-browse of the record with the partner lang -->
    <t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)" />
    <t t-call="web.external_layout">
        <div class="page">
            <div class="oe_structure"/>
            <div class="row">
                <div class="col-6">
                    <strong t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoice and shipping address:</strong>
                    <strong t-if="doc.partner_shipping_id != doc.partner_invoice_id">Invoice address:</strong>
                    <div t-field="doc.partner_invoice_id" t-options="{&quot;no_marker&quot;: True}"/>
                <...>
            <div class="oe_structure"/>
        </div>
    </t>
</template>

A fő sablon a fordítható sablont a doc.partner_id.lang paraméterrel hívja meg t-lang paraméterként, így a partner nyelvén lesz megjelenítve. Ily módon minden Értékesítési Rendelés a megfelelő ügyfél nyelvén lesz kinyomtatva. Ha csak a dokumentum törzsét szeretné lefordítani, de a fejlécet és a láblécet alapértelmezett nyelven szeretné megtartani, a jelentés külső elrendezését így hívhatja meg:

<t t-call="web.external_layout" t-lang="en_US">

Javaslat

Kérjük, vegye figyelembe, hogy ez csak külső sablonok hívásakor működik, nem lesz képes egy dokumentum részét lefordítani azáltal, hogy egy t-lang attribútumot állít be egy xml csomóponton, amely nem t-call. Ha egy sablon részét szeretné lefordítani, létrehozhat egy külső sablont ezzel a részleges sablonnal, és a fő sablonból hívhatja meg a t-lang attribútummal.

Vonalkódok

A vonalkódok képek, amelyeket egy vezérlő ad vissza, és könnyen beágyazhatók a jelentésekbe a QWeb szintaxisnak köszönhetően (pl. lásd attribútumok):

<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>

További paraméterek adhatók át lekérdezési karakterláncként

<img t-att-src="'/report/barcode/?
    barcode_type=%s&amp;value=%s&amp;width=%s&amp;height=%s'%('QR', 'text', 200, 200)"/>

Hasznos Megjegyzések

  • A Twitter Bootstrap és a FontAwesome osztályok használhatók a jelentéssablonban

  • Helyi CSS közvetlenül a sablonba helyezhető

  • Globális CSS beilleszthető a fő jelentés elrendezésébe a sablon öröklésével és a CSS beillesztésével:

    <template id="report_saleorder_style" inherit_id="report.style">
      <xpath expr=".">
        <t>
          .example-css-class {
            background-color: red;
          }
        </t>
      </xpath>
    </template>
    
  • Ha úgy tűnik, hogy a PDF jelentéséből hiányoznak a stílusok, kérjük, ellenőrizze ezeket az utasításokat.

Papírformátum

A papírformátumok a report.paperformat rekordjai, és a következő attribútumokat tartalmazhatják:

name (kötelező)

csak mnemonikus leírásként hasznos a jelentéshez, amikor egy lista valamelyik elemét keressük

leírás

a formátum rövid leírása

formátum

vagy egy előre definiált formátum (A0-tól A9-ig, B0-tól B10-ig, Legal, Letter, Tabloid,…) vagy custom; alapértelmezés szerint A4. Nem használhat nem egyedi formátumot, ha megadja az oldal méreteit.

dpi

kimeneti DPI; alapértelmezés szerint 90

felső_margó, alsó_margó, bal_margó, jobb_margó

margó méretek mm-ben

oldal_magasság, oldal_szélesség

oldal méretek mm-ben

tájolás

Fekvő vagy Álló

fejléc_vonal

logikai érték a fejléc vonal megjelenítéséhez

header_spacing

fejléc távolság mm-ben

Példa:

<record id="paperformat_frenchcheck" model="report.paperformat">
    <field name="name">French Bank Check</field>
    <field name="default" eval="True"/>
    <field name="format">custom</field>
    <field name="page_height">80</field>
    <field name="page_width">175</field>
    <field name="orientation">Portrait</field>
    <field name="margin_top">3</field>
    <field name="margin_bottom">3</field>
    <field name="margin_left">3</field>
    <field name="margin_right">3</field>
    <field name="header_line" eval="False"/>
    <field name="header_spacing">3</field>
    <field name="dpi">80</field>
</record>

Egyedi jelentések

Alapértelmezés szerint a jelentési rendszer a megadott model mezőn keresztül meghatározott célmodell alapján építi fel a megjelenítési értékeket.

Azonban először megkeresi a report.module.report_name nevű modellt, és meghívja annak _get_report_values(doc_ids, data) metódusát, hogy előkészítse a sablon megjelenítési adatait.

Ez használható tetszőleges elemek bevonására a sablon megjelenítése során, például további modellek adataira:

from odoo import api, models

class ParticularReport(models.AbstractModel):
    _name = 'report.module.report_name'

    def _get_report_values(self, docids, data=None):
        # get the report action back as we will need its data
        report = self.env['ir.actions.report']._get_report_from_name('module.report_name')
        # get the records selected for this rendering of the report
        obj = self.env[report.model].browse(docids)
        # return a custom rendering context
        return {
            'lines': docids.get_lines()
        }

Figyelem

When using a custom report, the „default” document-related items (doc_ids, doc_model and docs) will not be included. If you want them, you will need to include them yourself.

In the example above, the rendering context will contain the „global” values as well as the lines we put in there but nothing else.

Egyéni betűtípusok

Ha egyedi betűtípusokat szeretne használni, hozzá kell adnia az egyedi betűtípusát és a kapcsolódó less/CSS-t a web.reports_assets_common eszközköteghez. Az egyedi betűtípus(ok) hozzáadása a web.assets_common vagy web.assets_backend eszközkötegekhez nem teszi elérhetővé a betűtípust a QWeb jelentésekben.

Példa:

<template id="report_assets_common_custom_fonts" name="Custom QWeb fonts" inherit_id="web.report_assets_common">
    <xpath expr="." position="inside">
        <link href="/your_module/static/src/less/fonts.less" rel="stylesheet" type="text/less"/>
    </xpath>
</template>

Meg kell határoznia a @font-face-t ebben a less fájlban, még akkor is, ha már használta egy másik eszközkötegben (a web.reports_assets_common kivételével).

Példa:

@font-face {
    font-family: 'MonixBold';
    src: local('MonixBold'), local('MonixBold'), url(/your_module/static/fonts/MonixBold-Regular.otf) format('opentype');
}

.h1-title-big {
    font-family: MonixBold;
    font-size: 60px;
    color: #3399cc;
}

Miután hozzáadta a less fájlt az eszközkötegéhez, használhatja az osztályokat - ebben a példában a h1-title-big - az egyedi QWeb jelentésében.

A jelentések weboldalak

A jelentéseket a jelentés modul dinamikusan generálja, és közvetlenül elérhetők URL-en keresztül:

Például elérheti egy Értékesítési Rendelés jelentést html módban, ha ellátogat a http://<server-address>/report/html/sale.report_saleorder/38 címre

Vagy elérheti a pdf verziót a következő címen: http://<server-address>/report/pdf/sale.report_saleorder/38

1

nem számít, hogy a python:datetime objektum valójában milyen időzónában van (beleértve az időzóna nélküli állapotot is), az időzónája feltétel nélkül UTC-re lesz állítva, mielőtt a felhasználóhoz igazítanák