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.

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