Chapter 11: Add The Sprinkles

Our real estate module now makes sense from a business perspective. We created specific views, added several action buttons and constraints. However our user interface is still a bit rough. We would like to add some colors to the list views and make some fields and buttons conditionally disappear. For example, the «Sold» and «Cancel» buttons should disappear when the property is sold or cancelled since it is no longer allowed to change the state at this point.

Ez a fejezet csak egy nagyon kis részét fedi le annak, amit a nézetekben meg lehet valósítani. Ne habozzon elolvasni a referencia dokumentációt a teljesebb áttekintés érdekében.

Referencia: a fejezethez kapcsolódó dokumentáció megtalálható itt: Rekordok megtekintése és Nézet architektúrák.

Beágyazott nézetek

Megjegyzés

Cél: a szakasz végén egy specifikus ingatlanlista kerüljön hozzáadásra az ingatlantípus nézethez:

Beágyazott listanézet

Az ingatlan modulban hozzáadtunk egy ajánlatlistát egy ingatlanhoz. Egyszerűen hozzáadtuk az offer_ids mezőt a következővel:

<field name="offer_ids"/>

A mező az estate.property.offer specifikus nézetét használja. Bizonyos esetekben szeretnénk meghatározni egy specifikus listanézetet, amelyet csak egy űrlap nézet kontextusában használunk. Például szeretnénk megjeleníteni az ingatlantípushoz kapcsolódó ingatlanok listáját. Azonban csak 3 mezőt szeretnénk megjeleníteni az átláthatóság érdekében: név, várható ár és állapot.

Ehhez meghatározhatunk beágyazott listanézeteket. Egy beágyazott listanézet közvetlenül egy űrlap nézeten belül van meghatározva. Például:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test_model"
    _description = "Test Model"

    description = fields.Char()
    line_ids = fields.One2many("test_model_line", "model_id")


class TestModelLine(models.Model):
    _name = "test_model_line"
    _description = "Test Model Line"

    model_id = fields.Many2one("test_model")
    field_1 = fields.Char()
    field_2 = fields.Char()
    field_3 = fields.Char()
<form>
    <field name="description"/>
    <field name="line_ids">
        <list>
            <field name="field_1"/>
            <field name="field_2"/>
        </list>
    </field>
</form>

A test_model űrlap nézetében meghatározunk egy specifikus listanézetet a test_model_line számára a field_1 és field_2 mezőkkel.

Egy példa található itt.

Exercise

Adjon hozzá egy beágyazott lista nézetet.

  • Adja hozzá a One2many mezőt property_ids az estate.property.type modellhez.

  • Adja hozzá a mezőt az estate.property.type űrlap nézethez, ahogy az ebben a szakaszban a Cél részben látható.

Widgetek

Referencia: a szakaszhoz kapcsolódó dokumentáció megtalálható a Mezők hivatkozás alatt.

Megjegyzés

Cél: a szakasz végére az ingatlan állapotát egy speciális widget segítségével kell megjeleníteni:

Állapotsáv widget

Négy állapot jelenik meg: Új, Ajánlat érkezett, Ajánlat elfogadva és Eladva.

Amikor mezőket adtunk hozzá a modelljeinkhez, (szinte) soha nem kellett aggódnunk amiatt, hogy ezek a mezők hogyan fognak kinézni a felhasználói felületen. Például, egy dátumválasztó biztosított egy Date mezőhöz, és egy One2many mező automatikusan listaként jelenik meg. Az Odoo a mező típusától függően választja ki a megfelelő «widget»-et.

However, in some cases, we want a specific representation of a field which can be done thanks to the widget attribute. We already used it for the tag_ids field when we used the widget="many2many_tags" attribute. If we hadn’t used it, then the field would have displayed as a list.

Minden mezőtípushoz tartozik egy widget készlet, amely finomhangolhatja a megjelenítést. Néhány widget további opciókat is elfogad. Kimerítő lista található a Mezők hivatkozás alatt.

Exercise

Használja az állapotsor widgetet.

Használja a statusbar widgetet annak érdekében, hogy megjelenítse az estate.property state állapotát, ahogyan azt ennek a szakasznak a Célja ábrázolja.

Tipp: egy egyszerű példa található itt.

Figyelem

Ugyanaz a mező többször egy nézetben

Adjon hozzá egy mezőt csak egyszer egy listához vagy űrlap nézethez. Többszöri hozzáadás nem támogatott.

Lista sorrendje

Referencia: a szakaszhoz kapcsolódó dokumentáció megtalálható a Modellek hivatkozás alatt.

Megjegyzés

Cél: a szakasz végére minden lista alapértelmezés szerint determinisztikus sorrendben jelenjen meg. Az ingatlantípusok manuálisan rendezhetők.

Az előző gyakorlatok során több listanézetet hoztunk létre. Azonban soha nem határoztuk meg, hogy alapértelmezés szerint milyen sorrendben kell megjeleníteni a rekordokat. Ez nagyon fontos sok üzleti esetben. Például az ingatlan modulunkban szeretnénk, ha a legmagasabb ajánlatok a lista tetején jelennének meg.

Modell

Az Odoo többféle módot kínál az alapértelmezett sorrend beállítására. A leggyakoribb mód az _order attribútum közvetlen meghatározása a modellben. Ily módon a lekért rekordok determinisztikus sorrendet követnek, amely konzisztens lesz minden nézetben, beleértve a programozott kereséseket is. Alapértelmezés szerint nincs megadott sorrend, ezért a rekordok nem determinisztikus sorrendben kerülnek lekérésre a PostgreSQL függvényében.

Az _order attribútum egy olyan karakterláncot vesz fel, amely mezők listáját tartalmazza, amelyeket a rendezéshez használnak. Ez SQL-ben egy order_by klauzulává lesz átalakítva. Például:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test_model"
    _description = "Test Model"
    _order = "id desc"

    description = fields.Char()

A rekordjaink csökkenő id szerint vannak rendezve, ami azt jelenti, hogy a legmagasabb az első.

Exercise

Adja hozzá a modell rendezését.

Határozza meg a következő sorrendeket a megfelelő modellekben:

Modell

Rendezés

estate.property

Csökkenő ID

estate.property.offer

Csökkenő ár

estate.property.tag

Név

estate.property.type

Név

Megtekintés

A rendezés lehetséges a modell szintjén. Ennek az az előnye, hogy következetes sorrendet biztosít mindenhol, ahol rekordlistát kérünk le. Azonban lehetőség van egy adott sorrend meghatározására közvetlenül egy nézetben is a default_order attribútumnak köszönhetően (példa).

Kézi

Mind a modell, mind a nézet szerinti rendezés rugalmasságot biztosít a rekordok rendezésekor, de van még egy eset, amit le kell fednünk: a kézi rendezés. Egy felhasználó szeretné a rekordokat az üzleti logika szerint rendezni. Például, az ingatlan modulunkban szeretnénk az ingatlantípusokat kézzel rendezni. Valóban hasznos, ha a leggyakrabban használt típusok a lista tetején jelennek meg. Ha ingatlanügynökségünk főként házakat értékesít, kényelmesebb, ha a «Ház» az «Apartman» előtt jelenik meg.

Ehhez egy sequence mezőt használunk a handle widgettel kombinálva. Nyilvánvalóan a sequence mezőnek kell lennie az első mezőnek a _order attribútumban.

Exercise

Adja hozzá a kézi rendezést.

  • Adja hozzá a következő mezőt:

Modell

Mező

Típus

estate.property.type

Sorrend

Egész szám

  • Adja hozzá a sorrendet az estate.property.type lista nézethez a megfelelő widgettel.

Tipp: itt találhat példát: model és view.

Attribútumok és opciók

Túl költséges lenne részletezni az összes elérhető funkciót, amelyek lehetővé teszik a nézet megjelenésének finomhangolását. Ezért a leggyakoribbakra fogunk koncentrálni.

Űrlap

Megjegyzés

Cél: ennek a szakasznak a végére az ingatlan űrlap nézet a következőkkel fog rendelkezni:

  • Gombok és mezők feltételes megjelenítése

  • Címke színek

Űrlap nézet szórásokkal

Az ingatlan modulunkban szeretnénk módosítani néhány mező viselkedését. Például nem szeretnénk, ha az ingatlan típusát létrehozhatnánk vagy szerkeszthetnénk az űrlap nézetből. Ehelyett azt várjuk, hogy a típusokat a megfelelő menüben kezeljék. Emellett szeretnénk színt adni a címkéknek. Ezeknek a viselkedési testreszabásoknak a hozzáadásához hozzáadhatjuk az options attribútumot több mező widgethez.

Exercise

Widget opciók hozzáadása.

  • Adja hozzá a megfelelő opciót a property_type_id mezőhöz, hogy megakadályozza az ingatlan típus létrehozását és szerkesztését az ingatlan űrlap nézetből. További információért tekintse meg a Many2one widget dokumentációt.

  • Adja hozzá a következő mezőt:

Modell

Mező

Típus

estate.property.tag

Szín

Egész szám

Ezután adja hozzá a megfelelő opciót a tag_ids mezőhöz, hogy színválasztót adjon a címkékhez. További információért tekintse meg a FieldMany2ManyTags widget dokumentációt.

In Chapter 5: Finally, Some UI To Play With, we saw that reserved fields were used for specific behaviors. For example, the active field is used to automatically filter out inactive records. We added the state as a reserved field as well. It’s now time to use it! A state field can be used in combination with an invisible attribute in the view to display buttons conditionally.

Exercise

Gombok feltételes megjelenítésének hozzáadása.

Használja az invisible attribútumot a fejléc gombok feltételes megjelenítésére, ahogy ebben a szakaszban a Cél ábrázolja (figyelje meg, hogyan változnak a «Sold» és «Cancel» gombok, amikor az állapot módosul).

Tipp: ne habozzon keresni az invisible= kifejezést az Odoo XML fájlokban néhány példáért.

Általánosabban, lehetséges egy mezőt invisible, readonly vagy required állapotúvá tenni más mezők értéke alapján. Vegye figyelembe, hogy az invisible más elemekre is alkalmazható a nézetben, mint például a button vagy a group.

Az invisible, readonly és required bármilyen Python kifejezést tartalmazhat értékként. A kifejezés adja meg azt a feltételt, amelyben a tulajdonság érvényes. Például:

<form>
    <field name="description" invisible="not is_partner"/>
</form>

Ez azt jelenti, hogy a description mező láthatatlan, amikor az is_partner False. Fontos megjegyezni, hogy egy mező, amelyet az invisible használ, jelen kell legyen a nézetben. Ha nem kell megjeleníteni a felhasználónak, használhatjuk az invisible attribútumot annak elrejtésére.

Exercise

Használja az invisible-t.

  • Tegye láthatatlanná a kert területét és tájolását az estate.property űrlap nézetben, amikor nincs kert.

  • Tegye láthatatlanná az «Accept» és «Refuse» gombokat, miután az ajánlat állapota be van állítva.

  • Do not allow adding an offer when the property state is «Offer Accepted», «Sold» or «Cancelled». To do this use the readonly attribute.

Figyelem

A nézetben használt (feltételes) readonly attribútum hasznos lehet az adatbeviteli hibák elkerülésére, de ne feledje, hogy ez nem nyújt semmilyen biztonsági szintet! A szerver oldalon nincs ellenőrzés, ezért mindig lehetséges az RPC híváson keresztül írni a mezőre.

Lista

Megjegyzés

Cél: ezen szakasz végére az ingatlan és ajánlat lista nézeteknek szín dekorációkkal kell rendelkezniük. Ezenkívül az ajánlatok és címkék közvetlenül a listában szerkeszthetők lesznek, és az elérhetőségi dátum alapértelmezés szerint rejtve lesz.

Lista nézet dekorációkkal és opcionális mezővel Szerkeszthető lista

Amikor a modell csak néhány mezővel rendelkezik, hasznos lehet a rekordokat közvetlenül a lista nézeten keresztül szerkeszteni, és nem kell megnyitni az űrlap nézetet. Az ingatlan példában nincs szükség az űrlap nézet megnyitására, hogy ajánlatot adjunk hozzá vagy új címkét hozzunk létre. Ezt a editable attribútumnak köszönhetően lehet elérni.

Exercise

Tegye szerkeszthetővé a lista nézeteket.

Tegye szerkeszthetővé az estate.property.offer és estate.property.tag lista nézeteket.

Másrészt, amikor egy modell sok mezővel rendelkezik, csábító lehet túl sok mezőt hozzáadni a lista nézethez, ami átláthatatlanná teheti azt. Alternatív módszer a mezők hozzáadása, de opcionálisan rejtetté tétele. Ezt az optional attribútumnak köszönhetően lehet elérni.

Exercise

Tegyen egy mezőt opcionálissá.

Tegye az estate.property lista nézetben a date_availability mezőt opcionálissá és alapértelmezés szerint rejtetté.

Végül, a színkódok hasznosak a rekordok vizuális kiemelésére. Például az ingatlan modulban szeretnénk a visszautasított ajánlatokat piros színnel, az elfogadott ajánlatokat pedig zöld színnel megjeleníteni. Ezt a decoration-{$name} attribútumnak köszönhetően lehet elérni (a teljes listáért lásd Mezők):

<list decoration-success="is_partner==True">
    <field name="name"/>
</list>

Azok a rekordok, ahol az is_partner értéke True, zöld színnel lesznek megjelenítve.

Exercise

Adjon hozzá néhány dekorációt.

Az estate.property lista nézetben:

  • Az ajánlatot kapott ingatlanok zöldek

  • Az elfogadott ajánlatú ingatlanok zöldek és félkövérek

  • Az eladott ingatlanok halványak

Az estate.property.offer lista nézetben:

  • A visszautasított ajánlatok pirosak

  • Elfogadott ajánlatok zöldek

  • Az állapotnak már nem szabad láthatónak lennie

Tippek:

  • Ne feledje, hogy minden attribútumban használt mezőnek a nézetben kell lennie!

  • If you want to test the color of the „Offer Received” and „Offer Accepted” states, add the field in the form view and change it manually (we’ll implement the business logic for this later).

Statisztikai gombok

Megjegyzés

Cél: ennek a szakasznak a végén lesz egy statisztikai gomb az ingatlantípus űrlap nézetén, amely megmutatja az adott típusú ingatlanokhoz kapcsolódó összes ajánlat listáját, amikor rákattintanak.

Statisztikai gomb

Ha már használt néhány funkcionális modult az Odoo-ban, valószínűleg már találkozott «statisztikai gombbal». Ezek a gombok az űrlap nézetének jobb felső sarkában jelennek meg, és gyors hozzáférést biztosítanak a kapcsolódó dokumentumokhoz. Az ingatlan modulunkban szeretnénk egy gyors linket az adott ingatlantípushoz kapcsolódó ajánlatokhoz, ahogy azt ennek a szakasznak a Cél-ja ábrázolja.

A bemutató ezen pontján már láttuk a legtöbb koncepciót ennek megvalósításához. Azonban nincs egyetlen megoldás, és még mindig zavaró lehet, ha nem tudja, honnan kezdje. Az edzés során lépésről lépésre leírjuk a megoldást. Mindig hasznos lehet példákat találni az Odoo kódbázisában az oe_stat_button keresésével.

A következő gyakorlat kicsit nehezebb lehet, mint az előzőek, mivel feltételezi, hogy képes önállóan példákat keresni a forráskódban. Ha elakad, valószínűleg van valaki a közelben, aki segíthet ;-)

A gyakorlat bevezeti a Kapcsolódó mezők fogalmát. A legegyszerűbb módja annak megértésére, ha úgy tekintjük, mint egy számított mező speciális esetét. A description mező következő definíciója:

...

partner_id = fields.Many2one("res.partner", string="Partner")
description = fields.Char(related="partner_id.name")

egyenértékű ezzel:

...

partner_id = fields.Many2one("res.partner", string="Partner")
description = fields.Char(compute="_compute_description")

@api.depends("partner_id.name")
def _compute_description(self):
    for record in self:
        record.description = record.partner_id.name

Valahányszor a partner neve megváltozik, a leírás módosul.

Exercise

Adjon hozzá egy statisztikai gombot az ingatlantípushoz.

  • Adja hozzá a property_type_id mezőt az estate.property.offer-hez. Meghatározhatjuk kapcsolódó mezőként a property_id.property_type_id-n, és tároltként állíthatjuk be.

Ennek a mezőnek köszönhetően egy ajánlat kapcsolódni fog egy ingatlantípushoz, amikor létrejön. Hozzáadhatja a mezőt az ajánlatok listanézetéhez, hogy megbizonyosodjon róla, hogy működik.

  • Adja hozzá az offer_ids mezőt az estate.property.type-hoz, amely az előző lépésben meghatározott mező One2many inverze.

  • Adja hozzá az offer_count mezőt az estate.property.type-hoz. Ez egy számított mező, amely megszámolja az adott ingatlantípushoz tartozó ajánlatok számát (ehhez használja az offer_ids-t).

Ezen a ponton minden információ rendelkezésére áll ahhoz, hogy megtudja, hány ajánlat kapcsolódik egy ingatlantípushoz. Ha kétségei vannak, adja hozzá közvetlenül az offer_ids-t és az offer_count-ot a nézethez. A következő lépés az, hogy megjelenítse a listát, amikor a statisztikai gombra kattint.

  • Create a stat button on estate.property.type pointing to the estate.property.offer action. This means you should use the type="action" attribute (go back to the end of Chapter 9: Ready For Some Action? if you need a refresher).

Ezen a ponton a statisztikai gombra kattintva az összes ajánlatnak meg kell jelennie. Még mindig ki kell szűrnünk az ajánlatokat.

  • Az estate.property.offer műveletnél adjon hozzá egy domaint, amely meghatározza, hogy a property_type_id egyenlő legyen az active_id-val (= az aktuális rekord, itt egy példa)

Looking good? If not, don’t worry, the next chapter doesn’t require stat buttons ;-)