Chapter 13: Interact With Other Modules¶
In the previous chapter, we used inheritance to modify the behavior of a module. In our real estate scenario, we would like to go a step further and be able to generate invoices for our customers. Odoo provides an Invoicing module, so it would be neat to create an invoice directly from our real estate module, i.e. once a property is set to «Sold», an invoice is created in the Invoicing application.
Konkrét példa: Számlamozgás¶
Megjegyzés
Cél: ennek a szakasznak a végén:
Egy új
estate_accountmodult kell létrehozniAmikor egy ingatlant eladnak, számlát kell kiállítani a vevő részére
Bármikor, amikor egy másik modullal lépünk kapcsolatba, szem előtt kell tartanunk a modularitást. Ha azt tervezzük, hogy alkalmazásunkat ingatlanügynökségeknek értékesítjük, egyesek szeretnék a számlázási funkciót, míg mások nem.
Kapcsoló modul¶
Az ilyen esetekre a közös megközelítés egy «kapcsoló» modul létrehozása. Esetünkben a modul az estate és account moduloktól függne, és tartalmazná az ingatlan számla létrehozási logikáját. Így az ingatlan és a könyvelési modulok függetlenül telepíthetők. Amikor mindkettő telepítve van, a kapcsoló modul biztosítja az új funkciót.
Exercise
Hozzon létre egy kapcsoló modult.
Hozza létre az estate_account modult, amely az estate és account moduloktól függ. Egyelőre egy üres váz lesz.
Tip: you already did this at the beginning of the tutorial. The process is very similar.
Amikor az estate_account modul megjelenik a listában, folytassa a telepítéssel! Észre fogja venni, hogy a Számlázás alkalmazás is telepítve van. Ez várható, mivel a modulja függ tőle. Ha eltávolítja a Számlázás alkalmazást, a modulja is eltávolításra kerül.
Számla létrehozása¶
It’s now time to generate the invoice. We want to add functionality to the
estate.property model, i.e. we want to add some extra logic for when a property is sold.
Does that sound familiar? If not, it’s a good idea to go back to the
previous chapter since you might have missed
something ;-)
As a first step, we need to extend the action called when pressing the
«Sold» button on a property. To do so, we need to
create a model inheritance in the estate_account
module for the estate.property model. For now, the overridden action will simply return the
super call. Maybe an example will make things clearer:
from odoo import models
class InheritedModel(models.Model):
_inherit = "inherited.model"
def inherited_action(self):
return super().inherited_action()
Egy gyakorlati példa található itt.
Exercise
Adja hozzá a számla létrehozásának első lépését.
Hozzon létre egy
estate_property.pyfájlt azestate_accountmodul megfelelő mappájában._inheritazestate.propertymodellt.Írja felül az
action_soldmetódust (lehet, hogy másként nevezte el), hogy asuperhívást adja vissza.
Tipp: annak biztosítására, hogy működik, adjon hozzá egy print vagy egy debugger töréspontot a felülírt metódusban.
Működik? Ha nem, ellenőrizze, hogy minden Python fájl helyesen van-e importálva.
Ha a felülírás működik, továbbléphetünk és létrehozhatjuk a számlát. Sajnos nincs egyszerű módja annak, hogy megtudjuk, hogyan hozzunk létre bármilyen objektumot az Odoo-ban. Legtöbbször szükséges megvizsgálni a modelljét, hogy megtaláljuk a szükséges mezőket és megfelelő értékeket adjunk meg.
Jó módszer a tanulásra, ha megnézzük, hogyan csinálják más modulok azt, amit mi is szeretnénk. Például a Sales egyik alapvető folyamata a számla létrehozása egy értékesítési rendelésből. Ez jó kiindulópontnak tűnik, mivel pontosan azt csinálja, amit mi is szeretnénk. Szánjon időt az _create_invoices metódus elolvasására és megértésére. Amikor már túl van a síráson, mert ez az egyszerű feladat rettenetesen bonyolultnak tűnik, továbbléphetünk a bemutatóban.
A számla létrehozásához a következő információkra van szükség:
egy
partner_id: az ügyfélegy
move_type: több lehetséges értékkelegy
journal_id: a könyvelési napló
Ez elegendő egy üres számla létrehozásához.
Exercise
Adja hozzá a számlakészítés második lépését.
Hozzon létre egy üres account.move-t az action_sold metódus felülírásában:
a
partner_ida jelenlegiestate.property-ből származika
move_type-nak meg kell felelnie egy «Customer Invoice»-nak
Tippek:
objektum létrehozásához használd a
self.env[model_name].create(values)-t, ahol avaluesegydict.a
createmetódus nem fogad el rekordhalmazokat mezőértékként.
Amikor egy ingatlan «Sold» állapotra van állítva, most egy új vevői számlának kell létrejönnie a Számlázás / Vevők / Számlák alatt.
Nyilvánvalóan eddig még nincsenek számlasoraink. Számlasor létrehozásához a következő információkra van szükségünk:
name: a sor leírásaquantityprice_unit
Továbbá, egy számlasornak kapcsolódnia kell egy számlához. A legegyszerűbb és leghatékonyabb módja annak, hogy egy sort egy számlához kapcsoljunk, az, hogy az összes sort a számla létrehozásakor tartalmazzuk. Ehhez az invoice_line_ids mező szerepel az account.move létrehozásában, amely egy One2many. Az One2many és Many2many speciális «parancsokat» használnak, amelyeket az Command névtérrel emberi olvashatóvá tettek. Ez a névtér egy triplet parancsot képvisel, amelyet egy rekordhalmazon hajtanak végre. A triplet eredetileg az egyetlen lehetőség volt ezeknek a parancsoknak a végrehajtására, de most már szabványos a névtér használata. A formátum az, hogy egy listába helyezzük őket, amelyet sorban hajtanak végre. Itt van egy egyszerű példa egy One2many mező line_ids létrehozására egy test_model létrehozásakor:
from odoo import Command
def inherited_action(self):
self.env["test_model"].create(
{
"name": "Test",
"line_ids": [
Command.create({
"field_1": "value_1",
"field_2": "value_2",
})
],
}
)
return super().inherited_action()
Exercise
Adja hozzá a számlakészítés harmadik lépését.
Adjon hozzá két számlasort az account.move létrehozása során. Az eladott ingatlanok számlázása a következő feltételek szerint történik:
az eladási ár 6%-a
további 100,00 adminisztratív díjakból
Tipp: Adja hozzá az invoice_line_ids-t a létrehozáskor a fenti példa alapján. Minden sorhoz szükségünk van egy name, quantity és price_unit.
This chapter might be one of the most difficult that has been covered so far, but it is the closest to what Odoo development will be in practice. In the next chapter, we will introduce the templating mechanism used in Odoo.