Moduladatok meghatározása¶
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.
Adattípusok¶
Törzsadatok¶
A törzsadatok általában a modul technikai vagy üzleti követelményeinek részét képezik. Más szavakkal, az ilyen adatok gyakran szükségesek a modul megfelelő működéséhez. Ezek az adatok mindig telepítésre kerülnek a modul telepítésekor.
Korábban már találkoztunk technikai adatokkal, mivel meghatároztunk nézeteket és akciókat. Ezek egyfajta törzsadatok.
A technikai adatok mellett üzleti adatok is meghatározhatók, például országok, valuták, mértékegységek, valamint teljes ország lokalizáció (jogi jelentések, adómeghatározások, számlatükör), és még sok más…
Demó adatok¶
In addition to master data, which is required for a module to work properly, we can also provide data for demonstration purposes:
Segítsen az értékesítési képviselőknek gyorsan bemutatókat készíteni.
Legyen egy működő adatkészlet a fejlesztők számára, hogy új funkciókat tesztelhessenek, és láthassák, hogyan néznek ki ezek az új funkciók olyan adatokkal, amelyeket esetleg nem ők adtak hozzá.
Tesztelje, hogy az adatok helyesen töltődnek be, hiba nélkül.
Állítsa be a legtöbb funkciót, hogy gyorsan használható legyen új adatbázis létrehozásakor.
A demó adatok automatikusan betöltődnek, amikor elindítja a szervert, hacsak nem mondja kifejezetten, hogy nem szeretné. Ez megtehető az adatbázis kezelőben vagy a parancssorban.
$ ./odoo-bin -h
Usage: odoo-bin [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
Common options:
[...]
--without-demo=WITHOUT_DEMO
disable loading demo data for modules to be installed
(comma-separated, use "all" for all modules). Requires
-d and -i. Default is none
[...]
$ ./odoo-bin --addons-path=... -d db -i account --without-demo=all
Adatnyilatkozat¶
Manifeszt¶
Hivatkozás: a témával kapcsolatos dokumentáció megtalálható itt: Module Manifests.
Az adatok vagy CSV-ben, vagy XML-ben vannak deklarálva. Minden adatot tartalmazó fájlt hozzá kell adni a manifesztbe, hogy betöltődjenek.
A manifestban az új adatok hozzáadásához használandó kulcsok a data a törzsadatokhoz és a demo a demó adatokhoz. Mindkét értéknek egy karakterláncok listájának kell lennie, amelyek az adatokat deklaráló fájlok relatív útvonalait képviselik.
Általában a demó adatok egy demo mappában vannak, a nézetek és műveletek egy views mappában, a biztonsággal kapcsolatos adatok egy security mappában, és más adatok egy data mappában.
Ha a munkafája így néz ki:
estate
├── data
│ └── master_data.xml
├── demo
│ └── demo_data.xml
├── models
│ ├── *.py
│ └── __init__.py
├── security
│ └── ir.model.access.csv
├── views
│ └── estate_property_offer_views.xml
├── __init__.py
└── __manifest__.py
A manifestnek így kell kinéznie:
# -*- coding: utf-8 -*-
{
"name": "Real Estate",
"depends": [
...
],
"data": [
"security/ir.model.access.csv", # CSV and XML files are loaded at the same place
"views/estate_property_offer_views.xml", # Views are data too
"data/master_data.xml", # Split the data in multiple files depending on the model
],
"demo": [
"demo/demo_data.xml",
]
"application": True,
}
CSV¶
Hivatkozás: a témával kapcsolatos dokumentáció megtalálható itt: CSV adatok fájlok.
A legegyszerűbb módja az egyszerű adatok deklarálásának a CSV formátum használata. Ez azonban korlátozott a funkciók tekintetében: használja hosszú, egyszerű modellek listájához, de inkább az XML-t részesítse előnyben más esetekben.
id,field_a,field_b,related_id:id
id1,valueA1,valueB1,module.relatedid
id2,valueA2,valueB2,module.relatedid
Javaslat
Az IDE-je valószínűleg rendelkezik egy kiterjesztéssel a CSV fájlok szintaxis kiemeléséhez
Exercise
Adjon hozzá néhány alapértelmezett ingatlan típusokat az estate modulhoz: Lakóingatlan, Kereskedelmi, Ipari és Földterület. Ezeket mindig telepíteni kell.
XML¶
Hivatkozás: a témával kapcsolatos dokumentáció megtalálható itt: Data Files.
Amikor a létrehozandó adatok összetettebbek, hasznos vagy akár szükséges lehet XML-ben megtenni.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_a">valueA1</field>
<field name="field_b">valueB1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_a">valueA2</field>
<field name="field_b">valueB2</field>
</record>
</odoo>
Exercise
Hozzon létre néhány demó adatot az estate modulhoz.
Mező |
Értékek |
Értékek |
|---|---|---|
név |
Nagy villa |
Lakókocsi |
állapot |
Új |
Cancelled |
leírás |
Egy szép és nagy villa |
Otthon egy lakókocsi parkban |
irányítószám |
12345 |
54321 |
elérhetőség_dátuma |
2020-02-02 |
1970-01-01 |
várható_ár |
1 600 000 |
100 000 |
eladási_ár |
120 000 |
|
hálószobák |
6 |
1 |
lakóterület |
100 |
10 |
homlokzatok |
4 |
4 |
garázs |
Igaz |
Hamis |
kert |
Igaz |
|
kert_terület |
100000 |
|
kert_tájolás |
Dél |
Adatbővítés¶
During the Core Training, we saw in the Chapter 12: Inheritance chapter we could inherit (extend) an existing view. This was a special case of data extension: any data can be extended in a module.
Amikor új mezőket ad hozzá egy meglévő modellhez egy új modulban, előfordulhat, hogy szeretné kitölteni ezeket a mezőket azokban a rekordokban, amelyeket a függőségi modulokban hoztak létre. Ezt úgy teheti meg, hogy megadja a kiterjeszteni kívánt rekord xml_id-ját. Ez nem fogja lecserélni, ebben az esetben a field_c mezőt az adott értékre állítjuk mindkét rekord esetében.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_c">valueC1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_c">valueC2</field>
</record>
</odoo>
ref¶
Kapcsolódó mezők beállíthatók a ref kulcs használatával. Ennek a kulcsnak az értéke az összekapcsolni kívánt rekord xml_id-ja. Ne feledje, hogy a xml_id a modul nevéből áll, ahol az adat először van deklarálva, ezt követi egy pont, majd a rekord id-ja (csak az id is működik, ha abban a modulban van, amelyik deklarálja).
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Exercise
Hozzon létre néhány demó adat ajánlatot az Ön által létrehozott ingatlanokhoz.
Hozzon létre ajánlatokat a base-ben meghatározott partnerek használatával.
Partner |
Ingatlan |
Ár |
Érvényesség |
|---|---|---|---|
Azure Interior |
Nagy villa |
10000 |
14 |
Azure Interior |
Nagy villa |
1500000 |
14 |
Deco Addict |
Nagy villa |
1500001 |
14 |
Exercise
Győződjön meg arról, hogy mindkét demó tulajdonság létrehozásra került, és a Tulajdonság típusa Lakóingatlanra van állítva.
kiértékelés¶
The value to assign to a field is not always a simple string and you might need to compute it. It can also be used to optimize the insertion of related values, or because a constraint forces you to add the related values in batch. See :Add X2many fields.
<odoo>
<record id="id1" model="tutorial.example">
<field name="year" eval="datetime.now().year+1"/>
</record>
</odoo>
Exercise
Az Ön által hozzáadott ajánlatoknak mindig a modul telepítéséhez viszonyított dátumban kell lenniük.
search¶
Néha szükséges az ORM hívása egy search végrehajtásához. Ez nem lehetséges a CSV formátummal.
<odoo>
<record id="id1" model="account.move.line">
<field name="account_id" search="[
('user_type_id', '=', ref('account.data_account_type_direct_costs')),
('company_id', '=', obj().env.company.id)]
"/>
</record>
</odoo>
Ebben a kódrészletben szükséges, mert a törzsadatok a telepített lokalizációtól függenek.
függvény¶
Előfordulhat, hogy python kódot is végre kell hajtania az adatok betöltésekor.
<function model="tutorial.example" name="action_validate">
<value eval="[ref('demo_invoice_1')]"/>
</function>
Exercise
Validate one of the demo data offers by using the „Accept Offer” button. Refuse the others.
X2many mezők hozzáadása¶
Hivatkozás: a témával kapcsolatos dokumentáció megtalálható a Command.
Ha kapcsolódó adatokat kell hozzáadnia egy One2many vagy Many2many mezőben, ezt megteheti a Command metódusok használatával.
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_ids" eval="[
Command.create({
'name': 'My name',
}),
Command.create({
'name': 'Your name',
}),
Command.link(ref('model.xml_id')),
]"/>
</record>
</odoo>
Exercise
Hozzon létre egy új Tulajdonságot, de ezúttal néhány ajánlattal, amelyek közvetlenül a One2many mezőben lettek létrehozva, amely az Ajánlatokhoz kapcsolódik.
Az adatok elérése¶
Figyelem
Soha ne férjen hozzá a demó adatokhoz a demó adatok deklarációján kívül, még tesztekben sem.
Többféle módon lehet hozzáférni a mester/demó adatokhoz.
Python kódban használhatja az env.ref(self, xml_id, raise_if_not_found=True) metódust. Ez visszaadja az Ön által megadott xml_id-hez kapcsolódó rekordhalmazt.
XML-ben használhatja a ref kulcsot így
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Ez meghívja a ref metódust, és elmenti a visszaadott rekord azonosítóját a related_id mezőbe a tutorial.example típusú rekordnál, amelynek azonosítója id1.
CSV-ben az oszlop címének :id vagy /id utótaggal kell rendelkeznie.
id,parent_id:id,name
"child1","module.parent","Name1"
"child2","module.parent","Name2"
"child3","module.parent","Name3"
In SQL, it is more complicated, see the advanced section.
Figyelem
Az adatokat a felhasználó mindig törölheti. Mindig védekezően kódoljunk, ezt figyelembe véve.
Haladó¶
Mi az XML azonosító?¶
Mivel nem szeretnénk minden egyes SQL táblában egy xml_id oszlopot az adatbázisban, szükségünk van egy mechanizmusra annak tárolására. Ezt az ir.model.data modell segítségével tesszük.
Ez tartalmazza a rekord nevét (az xml_id), valamint a modult, amelyben definiálva van, a modellt, amely meghatározza, és annak azonosítóját.
Nincs frissítés¶
Azok a rekordok, amelyeket a noupdate jelzővel hoztak létre, nem frissülnek, amikor a modult frissítik, amely létrehozta őket, de létrejönnek, ha még nem léteztek.
Megjegyzés
odoo-bin -i module figyelmen kívül hagyja ezt a beállítást, és mindig betölti az adatokat. De általában nem szabad ezt tenni egy éles adatbázison.
<odoo noupdate="1">
<record id="id1" model="model">
<field name="fieldA" eval="True"/>
</record>
</odoo>
Importálás SQL-ként¶
Bizonyos esetekben van értelme közvetlenül SQL-ben végrehajtani az importálást. Ezt azonban nem javasoljuk, mivel megkerüli az ORM összes funkcióját, a számított mezőket (beleértve a metaadatokat) és a python korlátozásokat.
Megjegyzés
Általában a nyers SQL használata megkerüli az ACL-eket is, és növeli az injekciók kockázatát.
Hivatkozás: Biztonság az Odoo-ban
Segíthet jelentősen felgyorsítani az importálási időt nagy fájlokkal.
Összetettebb importálásokhoz, mint például a fordítások esetében.
Szükséges lehet az adatbázis inicializálása.