Chapter 9: Ready For Some Action?¶
So far we have mostly built our module by declaring fields and views. We just introduced business logic in the previous chapter thanks to computed fields and onchanges. In any real business scenario, we would want to link some business logic to action buttons. In our real estate example, we would like to be able to:
törölni vagy eladottnak jelölni egy ingatlant
elfogadni vagy elutasítani egy ajánlatot
Valaki érvelhetne azzal, hogy ezeket a dolgokat már most is megtehetjük az állapot manuális megváltoztatásával, de ez nem igazán kényelmes. Ráadásul szeretnénk némi extra feldolgozást hozzáadni: amikor egy ajánlatot elfogadunk, szeretnénk beállítani az eladási árat és a vevőt az ingatlanhoz.
Objektum típus¶
Referencia: a témához kapcsolódó dokumentáció megtalálható a Műveletek és Hibakezelés hivatkozások alatt.
Megjegyzés
Cél: ennek a szakasznak a végén:
Lehetősége van egy tulajdonságot törölni vagy eladottnak jelölni:
A cancelled property cannot be sold and a sold property cannot be cancelled. For the sake of
clarity, the state field has been added on the view.
Lehetősége van egy ajánlatot elfogadni vagy elutasítani:
Amint egy ajánlat elfogadásra kerül, be kell állítani az eladási árat és a vevőt:
Ingatlan modulunkban szeretnénk az üzleti logikát néhány gombbal összekapcsolni. A leggyakoribb módja ennek:
Gomb hozzáadása a nézethez, például a nézet
headerrészébe:
<form>
<header>
<button name="action_do_something" type="object" string="Do Something"/>
</header>
<sheet>
<field name="name"/>
</sheet>
</form>
és ezt a gombot összekapcsolni az üzleti logikával:
from odoo import fields, models
class TestAction(models.Model):
_name = "test.action"
name = fields.Char()
def action_do_something(self):
for record in self:
record.name = "Something"
return True
By assigning type="object" to our button, the Odoo framework will execute a Python method
with name="action_do_something" on the given model.
Az első fontos részlet, amit meg kell jegyezni, hogy a metódus nevét nem előzi meg aláhúzás (_). Ezáltal a metódusunk egy nyilvános metódus, amely közvetlenül hívható az Odoo felületéről (egy RPC híváson keresztül). Eddig minden általunk létrehozott metódus (compute, onchange) belsőleg volt hívva, ezért privát metódusokat használtunk, amelyeket aláhúzás előz meg. Mindig privátként definiálja a metódusait, kivéve, ha azokat a felhasználói felületről kell hívni.
Vegye figyelembe azt is, hogy a self-en iterálunk. Mindig feltételezze, hogy egy metódus több rekordra is hívható; ez jobb újrafelhasználhatóságot biztosít.
Végül, egy nyilvános metódusnak mindig vissza kell adnia valamit, hogy XML-RPC-n keresztül hívható legyen. Ha kétségei vannak, egyszerűen return True.
Több száz példa található az Odoo forráskódjában. Egy példa erre a gomb egy nézetben és a hozzá tartozó Python metódus
Exercise
Törölje és állítsa be az ingatlant eladottnak.
Add the buttons «Cancel» and «Sold» to the
estate.propertymodel. A cancelled property cannot be set as sold, and a sold property cannot be cancelled.Hivatkozzon a Cél első képére a várt eredményért.
Tipp: hiba felvetéséhez használhatja a UserError függvényt. Rengeteg példa található az Odoo forráskódjában ;-)
Adja hozzá az «Accept» és «Refuse» gombokat az
estate.property.offermodellhez.Hivatkozzon a Cél második képére a várt eredményért.
Tipp: ha egy ikont gombként szeretne használni, tekintse meg ezt a példát.
Amikor egy ajánlatot elfogadnak, állítsa be a vevőt és az eladási árat a megfelelő ingatlanhoz.
Hivatkozzon a Cél harmadik képére a várt eredményért.
Figyelem: a valóságban csak egy ajánlat fogadható el egy adott ingatlanra!
Művelet típusa¶
In Chapter 5: Finally, Some UI To Play With, we created an action that was linked to a menu. You may be wondering if it is possible to link an action to a button. Good news, it is! One way to do it is:
<button type="action" name="%(test.test_model_action)d" string="My Action"/>
We use type="action" and we refer to the external identifier in the name.
In the next chapter we’ll see how we can prevent encoding incorrect data in Odoo.