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:

Törlés és eladásra jelölés

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:

Ajánlat elfogadása vagy elutasítása
  • Amint egy ajánlat elfogadásra kerül, be kell állítani az eladási árat és a vevőt:

Ajánlat elfogadása

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 header ré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.property model. 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.offer modellhez.

    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.