建立模組

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

詞彙表

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

  • odoo是 GitHub 使用者。

  • odoo-addons是 GitHub 儲存庫。

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

  • main是正式分支的名稱。

  • my_module是模組的名稱。

請視需要替換這些內容。

建立開發分支

分支檢視

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

  • Fork下,選擇 main 分支。

  • To下,輸入 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
    

測試模組

該分支應會出現在開發區段下的分支檢視導覽面板中。

開發分支範例

按一下分支名稱即可檢視其歷程記錄,包括您剛剛推送的變更。資料庫準備就緒後,按一下連線即可存取。

連線按鈕以存取資料庫

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

資料庫 Dashboard 上的新模組

使用正式資料進行測試

備註

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

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

您可以:

  • 將您的開發分支轉換為預備分支,只需拖放至預備區段即可。

  • 將其合併至現有的預備分支,只需拖放至該分支上即可。

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

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

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

安裝模組

應用程式應用程式安裝模組。由於模組可能不會直接顯示在應用程式清單中,請啟用開發者模式並按一下更新應用程式清單 ‣ 更新來更新應用程式清單。

備註

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

部署至正式環境

在預備分支中使用正式資料測試模組後,如果您認為已準備好用於正式環境,可以透過以下方式將分支合併至正式分支:

  • 將預備分支拖放至正式分支上。

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

這會將預備分支的最新變更合併至正式分支,並以這些變更更新正式伺服器。

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

安裝模組

應用程式應用程式安裝模組。由於模組可能不會直接顯示在應用程式清單中,請啟用開發者模式並按一下更新應用程式清單 ‣ 更新來更新應用程式清單。

加入變更

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

  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 套件)。但在特定條件下,`可以考慮安裝套件<https://www.odoo.sh/faq#install_dependencies>`_。這也適用於需要系統套件進行編譯的 Python 模組以及第三方 Odoo 模組。

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

例如,要在您的模組中使用 `Unidecode 函式庫<https://pypi.org/project/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檔案。