第14章:與其他模塊交互?
在 上一章節 中,我們使用繼承來修改模塊的行為。在我們的房地產場景中,我們希望更進一步,能夠為我們的客戶生成發票。Odoo提供了一個發票模塊,因此從我們的房地產模塊直接創建發票將非常方便,即一旦一個屬性被設置為 ‘已售出’,就在發票應用程序中創建一個發票。
具體示例:賬戶移動?
注解
目標 :本節結束時:
應創建一個新模塊
estate_account
當一處房產被售出時,應該為買家開具發票

任何時候我們與另一個模塊交互,都需要考慮到模塊化。如果我們打算將應用程序銷售給房地產機構,有些機構可能需要發票功能,而其他機構可能不需要。
鏈接模塊?
這種情況的常見方法是創建一個“鏈接”模塊。在我們的例子中,該模塊將依賴于“estate”和“account”,并將包含房地產屬性的發票創建邏輯。這樣,房地產和會計模塊可以獨立安裝。當兩者都安裝時,鏈接模塊提供新功能。
Exercise
創建一個鏈接模塊。
創建 estate_account
模塊,該模塊依賴于 estate
和 account
模塊。目前,它將是一個空殼。
提示:你已經在教程的 開始部分 中完成了這個步驟。這個過程非常相似。
當“estate_account”模塊出現在列表中時,請安裝它!您會注意到發票應用程序也被安裝了。這是預期的,因為您的模塊依賴于它。如果您卸載發票應用程序,您的模塊也將被卸載。
發票創建?
現在是生成發票的時候了。我們想要為 estate.property
模型添加功能,即在房產出售時添加一些額外的邏輯。這聽起來很熟悉嗎?如果不是,最好回到 上一章節 ,因為你可能錯過了一些內容 ;-)
首先,我們需要擴展在物業上按下“已售”按鈕時調用的操作。為此,我們需要在“estate_account”模塊中為“estate.property”模型創建一個 模型繼承 。目前,重寫的操作將簡單地返回“super”調用。也許一個例子會讓事情更清晰:
from odoo import models
class InheritedModel(models.Model):
_inherit = "inherited.model"
def inherited_action(self):
return super().inherited_action()
一個實際的例子可以在 這里 找到。
Exercise
添加發票創建的第一步。
在
estate_account
模塊的正確文件夾中創建一個名為estate_property.py
的文件。_inherit
模型estate.property
。覆蓋
action_sold
方法(您可能已經命名為其他名稱),返回super
調用。
提示:為確保其正常工作,請在覆蓋的方法中添加 print
或調試器斷點。
它是否工作?如果沒有,請檢查所有Python文件是否正確導入。
如果覆蓋功能正常工作,我們可以繼續創建發票。不幸的是,在Odoo中,沒有一種簡單的方法來知道如何創建任何給定的對象。大多數情況下,需要查看其模型以查找所需字段并提供適當的值。
學習的好方法是看看其他模塊已經如何做你想做的事情。例如,銷售的一個基本流程是從銷售訂單創建發票。這看起來是一個很好的起點,因為它正好是我們想要做的?;ㄐr間閱讀和理解 _create_invoices 方法。當你因為這個簡單的任務看起來非常復雜而哭泣時,我們可以繼續本教程。
創建發票需要以下信息:
一個
partner_id
:客戶a
move_type
: 它有多個 可能的值journal_id
:會計日記賬
這已經足夠創建一個空的發票了。
Exercise
添加發票創建的第二步。
在 action_sold
方法的覆蓋中創建一個空的 account.move
:
partner_id
取自當前的estate.property
move_type
應該對應于“客戶發票”
小費:
要創建一個對象,請使用
self.env[model_name].create(values)
,其中values
是一個dict
。create
方法不接受記錄集作為字段值。
當一個物業被標記為 ‘已售’,你現在應該在發票/客戶/發票中創建了一個新的客戶發票。
顯然,我們目前還沒有任何發票行。要創建發票行,我們需要以下信息:
name
: 該行的描述quantity
price_unit
此外,發票行需要與發票關聯。將所有行包含在發票創建中是將行鏈接到發票的最簡單和最有效的方法。為此,在 account.move
創建中包含了 invoice_line_ids
字段,它是一個 One2many
。One2many和Many2many使用特殊的“命令”,這些命令已經使用 Command
命名空間使其易于閱讀。該命名空間表示要在一組記錄上執行的三元組命令。三元組最初是執行這些命令的唯一選項,但現在使用命名空間是標準的。格式是將它們放在一個列表中,按順序執行。以下是一個簡單的示例,用于在創建 test.model
時包含一個One2many字段 line_ids
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
添加發票創建的第三步驟。
在創建 account.move
時添加兩個發票行。每個售出的物業將按以下條件進行開票:
銷售價格的6%
從行政費用中額外增加100.00
提示:按照上面的示例在創建時添加 invoice_line_ids
。每行需要 name
, quantity
和 price_unit
。
這一章可能是到目前為止最難的,但它是最接近Odoo開發實踐的。在 下一章 中,我們將介紹Odoo中使用的模板機制。