建立模組

在建立您的第一個模組之前,必須先建立 Odoo.sh 專案並取得 GitHub 儲存庫的網址。

詞彙表

  • ~/src是與您的 Odoo 專案相關的 Git 儲存庫所在的目錄。

  • odoo是 GitHub 使用者。

  • odoo-addons是 GitHub 儲存庫。

  • feature-1是開發分支的名稱。

  • main是正式分支的名稱。

  • my_module是模組的名稱。

請視需要替換這些內容。

建立開發分支

分支檢視

  • 在分支導覽面板中,按一下開發旁邊的 +(新開發分支)按鈕。

  • 分岔下,選擇 main分支。

  • 下,輸入 feature-1

分岔正式分支以在 Odoo.sh 上建立開發分支

建置完成後,您可以從 ~/src/user資料夾存取編輯器以及開發分支的程式碼。

建立模組結構

鷹架

雖然不是必要的,但建立基本架構可以避免手動設定 Odoo 基本模組結構的繁瑣工作。您可以使用odoo-bin執行檔建立新模組的基本架構。

編輯器終端機執行:

odoo-bin scaffold my_module ~/src/user/

小訣竅

如果您不想在電腦上安裝 Odoo,也可以下載此模組結構範本。將所有出現的my_module替換為您選擇的名稱。

將會產生以下結構:

my_module
├── __init__.py
├── __manifest__.py
├── controllers
│   ├── __init__.py
│   └── controllers.py
├── demo
│   └── demo.xml
├── models
│   ├── __init__.py
│   └── models.py
├── security
│   ├── ir.model.access.csv
│   └── models.py
└── views
    ├── templates.xml
    └── views.xml

警告

為模組命名時,僅使用英數字元(a-z0-9)或底線(_),因為模組名稱會用於 Python 類別,而在 Python 中,包含底線以外特殊字元的類別名稱是無效的。

取消註解以下檔案:

  • models/models.py:模型及其欄位的範例

  • views/views.xml:樹狀檢視和表單檢視,以及開啟這些檢視的選單

  • demo/demo.xml:範例模型的示範記錄

  • controllers/controllers.py:實作某些路由的控制器範例

  • views/templates.xml:控制器路由使用的兩個 qweb 檢視範例

  • __manifest__.py:您模組的資訊清單,包括標題、描述和要載入的資料檔案。取消註解存取控制清單資料檔案:

    # 'security/ir.model.access.csv',
    

手工

若要手動建立模組結構,請參閱Server framework 101教學課程,以了解模組的結構和每個檔案的內容。

推送到開發分支

  1. 執行以下命令,暫存要提交的變更:

    git add my_module
    
  2. 執行以下命令,提交您的變更:

    git commit -m "My first module"
    
  3. 執行以下命令,將變更推送到遠端儲存庫:

    編輯器終端機執行:

    git push https HEAD:feature-1
    

測試模組

該分支應該會出現在Development區段的Branches view導覽面板中。

開發分支範例

按一下分支名稱以查看其歷史記錄,包括您剛推送的變更。資料庫準備就緒後,按一下Connect存取它。

用於存取資料庫的連線按鈕

如果您的 Odoo.sh 專案設定為自動安裝該模組,它將直接出現在資料庫 Dashboard 上。否則,可以在Apps應用程式下進行安裝。

資料庫 Dashboard 上的新模組

使用正式資料進行測試

備註

此步驟需要正式資料庫。如果您還沒有,請建立一個。

在開發建置中使用示範資料測試模組並確認準備就緒後,您可以使用預備分支和正式資料進行測試。

您可以:

  • 將開發分支拖放到Staging區段,將其轉換為預備分支。

  • 將其拖放到現有預備分支上,將其合併到該分支中。

  • 使用 git merge 指令合併您的分支。

這會建立一個新的預備建置,複製正式資料庫並在使用您分支最新變更更新的伺服器上執行它。

資料庫準備就緒後,按一下Connect存取它。

安裝模組

Apps應用程式安裝模組。由於該模組可能不會直接出現在應用程式清單中,請啟用開發人員模式並按一下Update Apps List ‣ Update以更新應用程式清單。

備註

該模組不會自動安裝,因為預備建置的目的是測試變更在正式資料庫上的行為,因此您不希望自動安裝模組。

部署至正式環境

在預備分支中使用正式資料測試模組並確認已準備好投入正式環境後,您可以透過以下方式將您的分支合併到正式分支:

  • 將暫存分支拖放到生產分支上。

  • 使用git merge命令合併分支。

這會將暫存分支的最新變更合併到生產分支中,並更新生產伺服器。

資料庫準備就緒後,按一下連線即可存取。

安裝模組

Apps應用程式安裝模組。由於該模組可能不會直接出現在應用程式清單中,請啟用開發人員模式並按一下Update Apps List ‣ Update以更新應用程式清單。

加入變更

本節說明如何透過在模型中加入新欄位並部署來新增模組變更。

  1. 編輯器或從電腦開啟模組資料夾~/src/odoo-addons/my_module,然後開啟models/models.py檔案進行編輯。在描述欄位之後:

    description = fields.Text()
    

    加入日期時間欄位:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    
  2. 開啟views/views.xml檔案,在以下內容之後:

    <field name="value2"/>
    

    加入:

    <field name="start_datetime"/>
    
  3. 這些變更會透過將欄位加入資料表並修改視圖來改變資料庫結構。若要套用到現有資料庫(例如生產資料庫),這些變更需要更新模組。如果您希望在推送變更時由 Odoo.sh 平台自動執行更新,請開啟__manifest__.py並替換以下內容來增加模組清單中的版本:

    'version': '0.1',
    

    替換為:

    'version': '0.2',
    

    平台將偵測版本變更,並在部署新修訂版本時觸發模組更新。

  4. 接下來,推送變更

  5. 測試變更之後,您可以將變更合併到生產分支中,例如在 Odoo.sh 介面中將分支拖放到生產分支上。由於您增加了清單中的模組版本,平台將自動更新模組,新欄位將立即可用。否則,您可以在應用程式清單中手動更新模組

使用外部 Python 程式庫

如果您想使用預設未安裝的外部 Python 程式庫,可以定義requirements.txt檔案,列出模組所依賴的外部程式庫。平台將使用此檔案自動安裝專案所需的 Python 程式庫。

備註

  • 無法在 Odoo.sh 資料庫上安裝或升級系統套件(例如 apt 套件)。然而,在特定條件下,套件可考慮安裝。這也適用於需要系統套件進行編譯的 Python 模組以及第三方 Odoo 模組。

  • Odoo.sh 不支援 PostgreSQL 擴充功能,因此無法在 Odoo.sh 資料庫中安裝擴充功能(例如 PostGIS、ltree 等)。

例如,若要在模組中使用Unidecode 程式庫

  1. 在儲存庫的根資料夾中建立檔案requirements.txt

    • 從 Odoo.sh 編輯器建立並開啟檔案~/src/user/requirements.txt

    • 從您的電腦建立並開啟~/src/odoo-addons/requirements.txt檔案。

  2. 將以下內容加入檔案:

    unidecode
    
  3. 您現在可以在模組中使用該函式庫,例如從模型名稱欄位的字元中移除重音符號。為此,請開啟models/models.py檔案,在以下內容之前:

    from odoo import models, fields, api
    

    加入:

    from unidecode import unidecode
    
  4. 之後:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    

    加入:

    @api.model
    def create(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).create(values)
    
    def write(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).write(values)
    
  5. 編輯模組資訊清單__manifest__.py以增加模組版本,藉此安裝 Python 相依套件。

  6. 然後,推送變更

    小訣竅

    執行 git add requirements.txt 來暫存requirements.txt檔案。