PDF jelentések készítése¶
Fontos
This tutorial is an extension of the Server framework 101 tutorial. Make sure you have
completed it and use the estate module you have built as a base for the exercises in this
tutorial.
We were previously introduced to QWeb where it was used to build a kanban view. Now we will expand on one of QWeb’s other main uses: creating PDF reports. A common business requirement is the ability to create documents to send to customers and to use internally. These reports can be used to summarize and display information in an organized template to support the business in different ways. Odoo can additionally add our company’s header and footer to our reports with minimal extra effort.
A témával kapcsolatos dokumentáció megtalálható a QWeb sablonok, QWeb Jelentések, és a Jelentés műveletek (ir.actions.report) szekcióban az Akciók referencia részében.
Fájlstruktúra¶
A PDF jelentés nagy részét a QWeb sablon alkotja. Általában szükség van egy megfelelő ir.actions.report-re is, hogy a jelentést be lehessen illeszteni a modul üzleti logikájába. Nincs szigorú szabály a fájlnevekre vagy azok elhelyezkedésére vonatkozóan, de ez a két rész általában 2 külön fájlban van tárolva a modul könyvtárának legfelső szintjén található report mappában. Ha egy modulnak sok vagy több hosszú jelentéssablonja van, akkor azokat gyakran logikusan szervezik különböző fájlokba, amelyeket a bennük található jelentés(ek) után neveznek el. A jelentésekhez tartozó összes művelet általában ugyanabban a fájlban van tárolva, amely _reports.xml-re végződik, függetlenül attól, hogy hány jelentést tartalmaz.
Ezért várható, hogy a munkafája valahogy így fog kinézni:
estate
├── models
│ ├── *.py
│ └── __init__.py
├── report
│ ├── estate_property_templates.xml
│ └── estate_property_reports.xml
├── security
│ └── ir.model.access.csv
├── views
│ └── *.xml
├── __init__.py
└── __manifest__.py
Ne felejtse el hozzáadni azokat a fájlokat, amelyekbe a sablonja és az akciónézete kerül, a __manifest__.py fájlhoz. Ebben az esetben a fájlokat a data listához kell hozzáadnia, és ne feledje, hogy a manifesztben felsorolt fájlok sorrendben töltődnek be!
Alapjelentés¶
Megjegyzés
Goal: at the end of this section, we will be able to print a report that displays all offers for a property.
Ingatlan példánkban számos hasznos jelentést készíthetünk. Egy egyszerű jelentés, amit készíthetünk, az, amely megjeleníti egy ingatlan összes ajánlatát.
Jelentés adatai¶
Mielőtt bármit is tennénk, először szükségünk van néhány adatra, hogy kitöltsük a jelentéseinket, különben ez az útmutató nem lesz túl érdekes. Jelentések készítésekor szüksége lesz néhány adatra, hogy tesztelje a jelentéskódját, és ellenőrizze, hogy a kapott megjelenés a vártnak megfelelő-e. Jó ötlet olyan adatokkal tesztelni, amelyek a várható használati esetek többségét vagy mindegyikét lefedik. Egyszerű jelentésünkhöz egy jó reprezentációs készlet a következő:
At least 3 properties where 1 is „sold”, 1 is „offer received” and 1 is „new”.
At least 2-3 offers for our „sold” and „offer received” properties
Ha még nincs ilyen adathalmazod, akkor a következőket teheted:
Töltsd ki a Moduladatok meghatározása oktatóanyagot (ha még nem tetted meg), és add hozzá a további eseteket a demó adataidhoz (lehet, hogy új adatbázist kell létrehoznod a demó adatok betöltéséhez).
Hozd létre manuálisan az adatokat az adatbázisodban.
Copy this data file into a new directory (data) in your estate module and copy these lines into your __manifest__.py file (you may need to create a new database to load in the demo data).
Folytatás előtt kattints végig az adataidon az adatbázisodban, és győződj meg róla, hogy az adataid a vártnak megfelelőek. Természetesen hozzáadhatod az adatokat a jelentéskód megírása után is, de akkor nem tudod fokozatosan tesztelni a kódod részeit írás közben. Ez hosszú távon megnehezítheti a hibák ellenőrzését és a kód hibakeresését bonyolult jelentések esetén.
Minimális sablon¶
A minimal viable template is viewable under the „Minimal viable template” section of the Jelentés sablon documentation. We can modify this example to build our minimal property offers template file:
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="report_property_offers">
<t t-foreach="docs" t-as="property">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<div class="page">
<h2>
<span t-field="property.name"/>
</h2>
<div>
<strong>Expected Price: </strong>
<span t-field="property.expected_price"/>
</div>
<table class="table">
<thead>
<tr>
<th>Price</th>
</tr>
</thead>
<tbody>
<t t-set="offers" t-value="property.mapped('offer_ids')"/>
<tr t-foreach="offers" t-as="offer">
<td>
<span t-field="offer.price"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>
A fájlunkban található legtöbb Odoo-specifikus (azaz nem HTML) elem a minimálisan életképes sablon szakaszban van kifejtve. Néhány további funkció a sablonunkban:
The use of the
class="table"attribute, so our table has some nice formatting. Twitter Bootstrap (we’re using its table class in this case), and Font Awesome (useful for adding icons) classes can be used in your report template.A
t-set,t-value,t-foreachést-ashasználata, hogy végig tudjunk menni az összesoffer_idselemen.
Ha már ismered a weboldal sablonmotorokat, akkor a QWeb direktívák (azaz a t- parancsok) valószínűleg nem igényelnek sok magyarázatot, és csak nézd meg a dokumentációját, majd ugorj a következő alfejezetre.
Ellenkező esetben javasolt, hogy olvass róluk többet (a Wikipedia jó magas szintű leírást ad), de az általános elképzelés az, hogy a QWeb lehetőséget biztosít arra, hogy dinamikusan generáljunk webkódot Odoo adatok és egyszerű parancsok alapján. Azaz a QWeb hozzáférhet rekordhalmaz adatokhoz (és metódusokhoz), és egyszerű programozási műveleteket hajthat végre, mint például ideiglenes változók beállítása és elérése. Például, a fenti példában:
t-setcreates a temporary variable called „offers” that has its value set byt-valueto the currentestate.propertyrecordset’soffer_ids.A
t-foreachést-ashasználata egyenértékű a Python-ban:
for offer in offers:
Jelentés művelet¶
Most, hogy van egy sablonunk, elérhetővé kell tennünk az alkalmazásunkban egy ir.actions.report segítségével. Egy gyakorlati példa az ir.actions.report-ra itt található, amely ehhez a sablonhoz tartozik. Tartalmát mind részletesen elmagyarázza a dokumentáció.
An ir.actions.report is primarily used via the Print menu of a model’s view. In the practical
example, the binding_model_id specifies which model’s views the report should show, and Odoo
will auto-magically add it for you. Another common use case of the report action is to link it to
a button as we learned in Chapter 9: Ready For Some Action?. This is handy for reports
that only make sense under specific conditions. For example, if we wanted to make a „Final Sale”
report, then we can link it to a „Print Sale Info” button that appears in the form view only when
the property is „Sold”.
Észrevehetted, vagy talán elgondolkodtál azon, miért ismétli a jelentéssablonunk a rekordhalmazt. Amikor a sablonunk több mint egy rekordot kap, egy PDF jelentést tud készíteni az összes rekordról. A Nyomtatás menü használata a lista nézetben több rekord kiválasztásával ezt fogja bemutatni.
Készíts jelentést¶
Végül most már tudod, hol hozd létre a fájljaidat, és hogyan kell kinéznie a fájlok tartalmának. Jó jelentéskészítést!
Exercise
Készíts jelentést.
Add hozzá az ingatlanajánlatok jelentését a minimális sablon alfejezetből az Ingatlan nézetek Nyomtatás menüjéhez.
Fejleszd a jelentést további adatok hozzáadásával. Hivatkozz ennek a szakasznak a Céljára, hogy lásd, milyen további adatokat adhatsz hozzá, és bátran adj hozzá még többet is.
Bónusz: Készítsen egy extra rugalmas jelentést azáltal, hogy hozzáad némi logikát, így ha egy ingatlanra nincsenek ajánlatok, akkor nem hozunk létre táblázatot, hanem inkább írunk valamit arról, hogy még nincsenek ajánlatok. Tipp: szüksége lesz
t-ifést-elsehasználatára.
Ne felejtse el ellenőrizni, hogy a PDF jelentései megfelelnek-e az elvárt adatoknak.
Al-sablonok¶
Megjegyzés
Cél: ennek a szakasznak a végén lesz egy al-sablonunk, amelyet 2 jelentésben használunk.
Két fő oka van az al-sablonok használatának. Az egyik az, hogy a kód könnyebben olvashatóvá válik, amikor extra hosszú vagy bonyolult sablonokkal dolgozunk. A másik az, hogy ahol lehetséges, újra felhasználjuk a kódot. Egyszerű ingatlanajánlat-jelentésünk hasznos, de az ingatlanajánlatok információinak felsorolása több jelentéssablonhoz is hasznos lehet. Egy példa erre egy jelentés, amely felsorolja egy értékesítő összes ingatlanának ajánlatait.
Nézze meg, hogy megérti-e, hogyan kell hívni egy al-sablont azáltal, hogy elolvassa a dokumentációt róla és/vagy megnéz egy példát (ne feledje, hogy a QWeb ugyanazokat a vezérlési folyamatokat használja, függetlenül attól, hogy jelentésről vagy nézetről van szó az Odoo-ban.)
Exercise
Hozzon létre és használjon al-sablont.
Ossza fel az ajánlatok táblázati részét saját sablonjába. Ne felejtse el ellenőrizni, hogy az eredeti jelentése továbbra is helyesen nyomtatódik-e utána.
Add a new report for
res.usersthat allows you to print all of the Real Estate Properties that are visible in their form view (i.e. in the „Settings” app). Include the offers for each of those saleman’s properties in the same report. Hint: since thebinding_model_idin this case will not be within the estate module, you will need to useref="base.model_res_users".A végső eredménynek hasonlítania kell ennek a szakasznak a Cél képére.
Ne feledje ellenőrizni, hogy a jelentései megfelelnek-e az elvárt adatoknak!
Jelentés öröklés¶
Megjegyzés
Cél: ennek a szakasznak a végén örökölni fogjuk az ingatlan jelentést az estate_account modulban.
Az öröklés a QWeb-ben ugyanazokat az xpath elemeket használja, mint a nézetek öröklése. Egy QWeb sablon azonban más módon hivatkozik a szülő sablonjára. Még egyszerűbb ezt megtenni, ha csak hozzáadjuk az inherit_id attribútumot a template elemhez, és egyenlővé tesszük a module.parent_template_id-val.
We didn’t add any new fields to any of the estate models in estate_account, but we can still add information
to our existing property report. For example, we know that any „Sold” properties will already have an invoice
created for them, so we can add this information to our report.
Exercise
Örököljön egy jelentést.
Bővítse ki az ingatlan jelentést, hogy tartalmazzon néhány információt a számláról. Inspirációért tekintse meg ennek a szakasznak a Célját (azaz nyomtasson egy sort, amikor az ingatlan Kész, ellenkező esetben ne nyomtasson semmit).
Ismételten ne feledje ellenőrizni, hogy a jelentései megfelelnek-e az elvárt adatoknak!
További funkciók¶
Az összes következő extra funkció részletesen le van írva a QWeb Jelentések dokumentációban, beleértve mindegyik megvalósításának módját.
Fordítások¶
Mindannyian tudjuk, hogy az Odoo több nyelven is használható az automatikus és kézi fordításoknak köszönhetően. A QWeb jelentések sem kivételek! Vegye figyelembe, hogy néha a fordítások nem működnek megfelelően, ha felesleges szóközök vannak a sablon szövegtartalmában, ezért próbálja meg elkerülni ezeket, amikor csak lehetséges (különösen a vezető szóközöket).
A jelentések weboldalak¶
Valószínűleg már unja hallani, hogy a QWeb HTML-t hoz létre, de ismét elmondjuk! A jelentések QWeb-ben való írásának egyik nagyszerű tulajdonsága, hogy megtekinthetők a webböngészőben. Ez hasznos lehet, ha egy hiperhivatkozást szeretne beágyazni, amely egy adott jelentéshez vezet. Vegye figyelembe, hogy a szokásos biztonsági ellenőrzések továbbra is érvényesek lesznek, hogy megakadályozzák az illetéktelen felhasználókat a jelentések elérésében.
Vonalkódok¶
Az Odoo beépített vonalkód képalkotóval rendelkezik, amely lehetővé teszi a vonalkódok beágyazását a jelentéseibe. Nézze meg a megfelelő kódot, hogy lássa az összes támogatott vonalkód típust.