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:
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
One2manymezőtproperty_idsazestate.property.typemodellhez.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:
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 |
|---|---|
|
Csökkenő ID |
|
Csökkenő ár |
|
Név |
|
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.
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
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_idmező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 |
|---|---|---|
|
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
readonlyattribute.
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.
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).
Keresés¶
Hivatkozás: az ehhez a szakaszhoz kapcsolódó dokumentáció megtalálható a Keresés és a Keresési alapértelmezések részekben.
Megjegyzés
Cél: a szakasz végére az elérhető tulajdonságok alapértelmezés szerint lesznek szűrve, és a lakóterületre való keresés olyan eredményeket ad, ahol a terület nagyobb, mint a megadott szám.
Végül, de nem utolsósorban, van néhány finomítás, amelyet szeretnénk alkalmazni a keresés során. Először is, azt szeretnénk, hogy az «Elérhető» szűrő alapértelmezés szerint legyen alkalmazva, amikor hozzáférünk a tulajdonságokhoz. Ennek érdekében a search_default_{$name} akció kontextust kell használnunk, ahol {$name} a szűrő neve. Ez azt jelenti, hogy meghatározhatjuk, mely szűrő(k) lesz(nek) alapértelmezés szerint aktiválva az akció szintjén.
Itt van egy példa egy akcióra a megfelelő szűrővel.
Exercise
Adjon hozzá egy alapértelmezett szűrőt.
Tegye az «Elérhető» szűrőt alapértelmezettként kiválasztottá a estate.property akcióban.
Egy másik hasznos fejlesztés a modulunkban az lenne, ha hatékonyan lehetne keresni a lakóterület alapján. A gyakorlatban a felhasználó «legalább» a megadott területű ingatlanokat szeretné keresni. Nem reális elvárás, hogy a felhasználók pontosan egy adott lakóterületű ingatlant akarjanak megtalálni. Mindig lehetséges egyéni keresést végezni, de ez kényelmetlen.
A keresési nézet <field> elemei rendelkezhetnek egy filter_domain-nel, amely felülírja a megadott mezőre történő kereséshez generált domaint. A megadott domainben a self a felhasználó által megadott értéket képviseli. Az alábbi példában a name és description mezőkön történő kereséshez használják.
<search string="Test">
<field name="description" string="Name and description"
filter_domain="['|', ('name', 'ilike', self), ('description', 'ilike', self)]"/>
</search>
Exercise
Módosítsa a lakóterület keresését.
Adjon hozzá egy filter_domain-t a lakóterülethez, hogy a megadott értékkel egyenlő vagy annál nagyobb területű ingatlanokat is tartalmazza.