第一章 使用開發(fā)者模式快速入門 Odoo 15

Odoo提供了一個快速應用開發(fā)框架,尤其適合構建商業(yè)應用。這類應用通常用于保存業(yè)務記錄和工作流。Odoo 不僅簡化了這類應用的構建,還提供了看板、日歷、圖表等視圖的豐富組件,用于創(chuàng)建難以抗拒的用戶界面。

本章我們直接進入實操,通過web 界面進行編碼一探Odoo 的內部,這甚至都不需要配置本地開發(fā)環(huán)境。這樣會讓我們直觀地感受 Odoo 應用所涉及到的組件。同時,我們還會了解一些查看已有應用及快速構建原型的基本工具。

本文主要內容有:

  • to-do (任務清單)應用
  • 掌握 Odoo 的基礎結構
  • 使用 Odoo SaaS 測試庫
  • 在服務器上安裝 Odoo
  • 激活開發(fā)者模式
  • 對模型添加自定義字段
  • 新建模型
  • 創(chuàng)建菜單項及動作
  • 配置訪問控制權限
  • 創(chuàng)建視圖

學習完本章,讀者會熟悉 Odoo 自定義和開發(fā)的主要組成部分。

技術準備

學習本章至少要求有一個現(xiàn)代瀏覽器,如 Firefox 或 Chrome。有瀏覽器并且可以聯(lián)網,就可以通過 Odoo SaaS測試庫學習本章,無需進行本地安裝。

當然讀者也可以使用本地安裝的 Odoo 實例。可以參見在服務器上安裝 Odoo一節(jié),其中講解了 Windows、Ubuntu 和紅帽企業(yè)版 Linux(RHEL)上安裝預打包版本。此外,還可以使用 Docker 安裝。

引入 to-do 清單應用

本章中我們會使用一個示例項目來演示所講解的概念。這個項目就是一個簡單的 to-do清單 Odoo應用。

使用這個應用我們可以新增清單,然后標記完成。比如可在項目中添加買雞蛋,然后在購買后勾選已完成。并且To-do 清單應僅對用戶自己可見,因而當前用戶僅能獲取自己的 to-do 列表。為了增加點趣味性,我們添加了一些復雜功能,允許 to-do清單包含一組和任務相關的用戶,即工作小組。

就該應用我們應考慮以下幾層:

  • 數(shù)據層:通過模型實現(xiàn)
  • 業(yè)務邏輯層:通過 Pyhon自動化編碼實現(xiàn)
  • 展示層:通過視圖實現(xiàn)

對于數(shù)據層,我們需要一個 To-do 清單模型,我們還將利用內置的 Contact(也稱之為 Partner)模型來支持工作組的功能。當然還要記得在新的模型中配置訪問權限。

業(yè)務邏輯層中我們使用框架處理增刪改查(CRUD)基本操作。本例中我們無需使用額外的自動化支持。我們需要在開發(fā)者模塊中使用 Python 代碼來使用自動化功能。我們暫不需要在開發(fā)的模板中使用,但可以在 Technical 菜單下的 Automated Actions 工具來通過 UI 界面實現(xiàn)這種業(yè)務邏輯。在本章后面的例子中會進行使用。

最后在展示層中我們將為應用添加菜單項,以及 to-do 模型的視圖。業(yè)務應用的基本視圖是用于查看已有記錄的列表視圖、深入查看記錄詳情的表單視圖。為增強易用性,我們還可以在列表視圖的搜索框中預置過濾項。搜索選項通過搜索視圖組件進行實現(xiàn)。

以下是創(chuàng)建 to-do 列表應用的步驟

  1. 新建 to-do 清單模型
  2. 創(chuàng)建菜單項并讓其對用戶可見
  3. 配置訪問控制權限
  4. 為 to-do 清單創(chuàng)建列表和表單視圖

新增的 to-do 清單模型包含如下字段

    • Description: 字符 類型
    • Is Done?標記:布爾型

應用的具體功能包含團隊功能:即可添加執(zhí)行同一任務的一組用戶。因此需要一個表示用戶的模型。Odoo 自帶就有Contact模型( 技術名稱為res.partner),可用于存儲個人、公司和地址。

任務清單模型應當包含一個工作團隊字段,可用于選擇一組用戶。我們希望僅有指定的人可被選擇加入工作團隊。因此我們需要修改 Contact 模型添加Is Work Team?標記。僅帶有此標記的用戶可添加至工作團隊。

為實現(xiàn)工作團隊的功能,我們需要向Contact 模型和表單視圖添加一個字段。在進入實施之前,我們先討論一些與 Odoo 框架相關的功能,然后學習如何準備要使用的環(huán)境。

理解 Odoo 的基本概念

對一初學 Odoo 的人可能有些概念不是那么一目了然。我們在學習之前先進行掌握。

有關 Odoo 和 Odoo 社區(qū)

Odoo 是一個是 Fabien 在比利時所創(chuàng)建的Odoo SA 公司所發(fā)布的軟件產品。Odoo 軟件產品是由公司主導的,也就是說路線圖及開發(fā)都由 Odoo SA 緊緊控制在手里。但同時又遵循開源的條例,歡迎社區(qū)貢獻代碼。

Odoo 軟件采取開源內核的商業(yè)模式,也就是說部分代碼是開源的、部分是自有產權?;谶@一模式,Odoo 發(fā)布了兩個版本。

社區(qū)版(CE)對外公開、開源,使用 LGPL 開源證書。

企業(yè)版(EE)僅對官方合作伙伴及持有專有證書的顧客開放,采取閉源代碼。

Odoo EE是 Odoo CE 內核上層的一堆模塊,提供一些可誘使用戶升級的高級功能。Odoo EE的收入為Odoo CE及Odoo EE的開發(fā)提供資金來源。Odoo創(chuàng)始人及 CEO Fabien Pinckaers 反復承諾會將80%的代碼放到社區(qū)版里開源,另20%放到自有的企業(yè)版中。

任何開源項目的最大資源都是圍繞其的社區(qū)。Odoo 有很多活躍的開源貢獻者。對于 Odoo 這個產品,社區(qū)貢獻了功能反饋、翻譯、安全問題報告、bug 修復并且偶爾會對內核產品進行一些技術改進。Odoo CE 的地址為https://github.com/odoo/odoo

除了 Odoo 的內核產品外,社區(qū)還發(fā)布一些新功能模塊。很多 Odoo 社區(qū)內的個人及公司將他們的 Git 倉庫以開源證書向公眾開放。他們也會在 Odoo 的官方商店 Odoo Apps 上發(fā)布應用。應用商店中可發(fā)布免費及付費模塊。

Odoo 的內核項目中不會添加這些社區(qū)模塊,因此社區(qū)模塊以分散的形式開發(fā),沒有共同的標準及品控。Odoo 社區(qū)聯(lián)盟(OCA)的成立就是為了解決這一問題。它納入了這些社區(qū)貢獻的模塊,并提供了通用代碼標準、指南、品控及工作流工具。OCA 的代碼倉庫位于https://github.com/OCA,可以在https://odoo-community.org/shop查看這些發(fā)布的模塊。

Odoo 產品的版本

在編寫本書時,Odoo 的最新穩(wěn)定版是 Odoo 15,在 GitHub 上的分支為15.0。這是在全書中使用的版本。Odoo 的大版本按年發(fā)布,每年10月在 Odoo 體驗大會上進行發(fā)布。

官方支持最新的三個穩(wěn)定版。發(fā)布版本15后,對13和14版本仍提供支持,但版本12就不再進行官方支持了。也就是說不再進行漏洞及安全問題修復了。

Odoo 的大版本之間數(shù)據庫是不兼容的。如果在 Odoo 15的服務端運行此前大版本中創(chuàng)建的數(shù)據,不會跑通。要在更新的 Odoo 版本中使用老數(shù)據庫需要進行頗為費力的遷移。

對于插件模塊也是如此。通常在一個大版本中開發(fā)的 Odoo 插件在另一個大版本中無法運行。在網上下載社區(qū)模塊時,請注意是否支持你所使用的 Odoo 版本。

大版本發(fā)布(如15.0)通常會有比較頻繁的升級,這大部分都是漏洞修復而非新功能的開發(fā)。這些升級確保 API 穩(wěn)定,即模型數(shù)據結構和視圖元素標識符保持穩(wěn)定。這很重要,因為這樣就不會因為上游內核模塊做出不兼容修改而導致自定義模塊崩潰。

Odoo 在線 SaaS 版本可能會使用中間版,有時也稱為 SaaS 版。它們也是官方支持的。當前支持的版本列表可見于https://www.odoo.com/documentation/user,在 Support 頁面的 Practical Information 中。

master 分支的版本會形成下一個大版本的更新,但在發(fā)布前其 API 并不穩(wěn)定,不應使用它構建自定義模塊。那會好比在流沙中前行,無法知道何時會出現(xiàn)導致自定義模塊崩潰的修改。請收下這個警告。

Odoo 的架構

了解Odoo 遵循多層架構以及我們使用的每種組件的角色會很有幫助。因此我們來學習下 Odoo 應用的架構并通過將其解構為多個組件層來幫助我們進行應用的開發(fā)。

Odoo 應用可以解構為三層:數(shù)據層、邏輯層和展示層:

圖1.1:Odoo 應用分層

數(shù)據層是最底端一層,負責數(shù)據存儲和持久化,Odoo 借助 PostgreSQL服務端來實現(xiàn)。Odoo 出于設計考慮僅支持 PostgreSQL 數(shù)據庫。文檔附件、圖片一類的二進制文件通常存儲在一個稱為 filestore(目錄) 的文件系統(tǒng)中。

小貼士: 也就是說 Odoo 實例的完整備份需包含數(shù)據庫導出文件和 filestore 的拷貝。

我們很少使用 SQL 直接與數(shù)據庫引擎進行交互 ,但在特定場景可能會需要用到。

Odoo 依賴于對象關系映射(ORM)作為應用和數(shù)據庫之間的接口。ORM 提供插件模塊與數(shù)據交互的應用程序接口(API)。我們使用ORM模型實現(xiàn)數(shù)據層。例如,用于客戶或供應商數(shù)據的Partner數(shù)據實體,以模型進行表示。

通常底層數(shù)據庫應僅由這一層訪問,因為它確保了安全權限控制和數(shù)據一致性。ORM 模型基于支持多個交互方法的Python對象類,如增刪改查(CRUD)基本操作。具體來說CRUD操作通過create() 、search() 、write()unlink() 模型方法實現(xiàn)。

邏輯層負責與數(shù)據層的所有交互,并由 Odoo 服務端處理??蓴U展CRUD操作來實現(xiàn)具體的業(yè)務邏輯。例如,create()write() 方法可實現(xiàn)默認值或其它的自動操作。可添加其它方法來強制驗證規(guī)則或自動計算字段值。

展示層用于展示數(shù)據并與用戶交互,通過軟件的客戶端實現(xiàn),負責用戶交互??蛻舳塑浖褂眠h程過程調用(RPC)運行 ORM 引擎及業(yè)務邏輯的Odoo 服務。ORM API調用發(fā)往Odoo服務端處理讀、寫、驗證或執(zhí)行其它操作。然后將結果返回客戶端做進一步處理。

Odoo自帶一個網頁客戶端。網頁客戶端支持所有業(yè)務應用所需的功能,如登錄會話、導航菜單、數(shù)據列表和表單。

有一個網站框架用于外部的開發(fā)前臺。它提供一些 CMS 功能,可用于創(chuàng)建靜態(tài)和動態(tài)網頁。網站框架使用controller組件來實現(xiàn)具體展示邏輯的代碼,與模型內部邏輯分離。頁面使用QWeb作為其渲染引擎。那是一些包含HTML標記外加循環(huán)、條件或調用其它模板的特有XML QWeb標簽。

Odoo 服務端 API 非常開放,包含所有的服務端功能。官方Web 客戶端使用的 API 與其它應用的 API 并無不同。因此,其它的客戶端實現(xiàn)均可做到,并且可以在任何平臺上使用任意編程語言進行實現(xiàn)。可以創(chuàng)建桌面和移動端應用來提供不同用戶界面,這充分利用了 Odoo 為業(yè)務邏輯和數(shù)據持久性而生的數(shù)據和邏輯層。

使用 Odoo SaaS試用數(shù)據庫

使用Odoo最簡單的方式是使用Odoo的軟件即服務(SaaS)試用數(shù)據庫。這樣無需進行任何安裝,僅需進入官網https://odoo.com/點擊Try it free按鈕。

會要求選擇一個應用來在新數(shù)據庫中進行安裝。在本章的學習中,你可以選擇任何應用,讀者大可自由選擇。如果你實在拿不定主意,不妨使用CRM應用。

圖1.2 – Odoo SaaS試用數(shù)據庫的初始應用選取

新的SaaS數(shù)據庫使用最新的Odoo SaaS版本,它是基于最近的穩(wěn)定版Odoo EE,同時帶有自己的小版本號。因此與Odoo最新穩(wěn)定的企業(yè)版版本號并不致。

免費數(shù)據庫有效期為15天。在寫本書時,Odoo SaaS版本還提供一個免費方案讓你可以在到期后繼續(xù)使用(要求安裝一個以上的應用)。

在工作站上安裝 Odoo

使用Odoo SaaS測試庫是本章的默認選項。在本書之后的章節(jié)中,我們會使用本地Odoo安裝。在第二章 Odoo 15開發(fā)之開發(fā)環(huán)境準備中,會進行相應的引導。

值得一提的是Odoo還有一些預打包的安裝包。我們這里簡要地進行說明,以供讀者了解:

  • 在你的操作系統(tǒng)上使用預打包安裝程序安裝Odoo:如果是Odoo新手又希望快速獲得一個本地環(huán)境的話這是一個很好的選擇。預打包安裝軟件支持如下操作系統(tǒng):Windows (EXE安裝軟件); Debian/Ubuntu (DEB包)和CentOS/RHEL (RPM包)。
  • 使用 Docker 容器安裝 Odoo:如果用過 Docker 并在操作系統(tǒng)中安裝了 Docker 這會是一個好選項。如果不太了解 Docker,可以采用上一種方法,以名學習 Docker影響到正課(學習 Odoo 開發(fā))。

可通過https://download.odoo.com下載這些安裝包。包含所有穩(wěn)定版的Odoo,以及與最新開發(fā)版本相對應的 master 分支。我們會在下面的小節(jié)講解這些選項。

有關安裝Odoo的更多知識,請參見官方文檔。

使用一鍵安裝包在 Windows 上安裝

Odoo為Windows提供了一個一鍵安裝包,包含運行Odoo所需的所有:Python 3運行時環(huán)境、PostgreSQL數(shù)據庫以及安裝了依賴的Odoo服務端。

可通過https://download.odoo.com下載安裝包。在首頁選擇相應的版本:15 (stable) - Community Edition。每日構建包位于15.0/nightly/windows,最新包在頁面底部。

安裝包非常易于使用。在安裝結束時Odoo會自動啟動。

還會創(chuàng)建開機啟動的Windows服務用于自動啟動Odoo和PostgreSQL。在通過其它如源碼方式安裝時應注意這一點,在Windows安裝包安裝后會占用8069端口,這樣其它安裝就無法使用該端口了。

使用預打包安裝包在 Linux 上安裝

Odoo下載站點(https://download.odoo.com) 還提供對Debian系(含Ubuntu)和RHEL/CentOS的官方包下載倉庫。

在首頁上對于有對應系統(tǒng)安裝包(aptyum) 的安裝指南。請確保將命令行示例中的Odoo版本修改為對應的版本,如15.0

# Debian 系
wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
echo "deb http://nightly.odoo.com/15.0/nightly/deb/ ./" >> /etc/apt/sources.list
apt-get update && apt-get install odoo
# RHEL/CentOS
yum-config-manager --add-repo=https://nightly.odoo.com/15.0/nightly/rpm/odoo.repo
yum update && yum install odoo

在Linux系統(tǒng)中安裝Odoo 15之前,應當先安裝好PostgreSQL數(shù)據庫。這樣Odoo就可以創(chuàng)建并配置其用戶了。

使用 Docker 容器安裝 Odoo

Docker為在運行應用提供了一個便利的多平臺解決方案。可用于在Windows、Linux和macOS上運行應用。相比于傳統(tǒng)的虛擬機容器技術使用簡單、資源利用率高。

首先需要在操作系統(tǒng)中安裝Docker。Docker Desktop是社區(qū)版的,免費使用。可通過https://www.docker.com進行下載。安裝最新版本 Docker時最好參照該網站。Docker依賴于虛擬硬件技術,請確保在基本輸出輸出系統(tǒng) (BIOS)中啟用該功能。

有關安裝和運行Docker的通用指南請見https://docs.docker.com/engine/install。

例如對于Ubuntu系統(tǒng),詳細地的安裝說明位于https://docs.docker.com/engine/install/ubuntu/。

關于安裝后的重要步驟,如以非root用戶運行Docker,請參見https://docs.docker.com/engine/install/linux-postinstall/。

Windows系統(tǒng)中的Docker桌面需要使用Hyper-V,僅在Windows 10的企業(yè)版和教育版中才有。最新安裝詳情請見https://docs.docker.com/desktop/windows/install/。

Mac上的Docker桌面需要使用macOS 10.14或更新版本。最新的詳情請見https://docs.docker.com/desktop/mac/install/。

注: 在Windows和macOS版本中曾經可使用Docker Toolbox作為替代,但這一發(fā)行版已被廢棄。Docker Toolbox打包了VirtualBox,提供了預配置的shell用于在命令行操作Docker容器。參見https://docs.docker.com/toolbox/獲取更多詳情。

Odoo 在Docker Hub上的官方Docker鏡像位于https://hub.docker.com/_/odoo。這里我們可以看到使用Odoo Docker鏡像的基本指南。運行Odoo時會創(chuàng)建兩個Docker容器:一個用于PostgreSQL數(shù)據庫,另一個用于Odoo服務端。

安裝及操作均通過命令行實現(xiàn)。通過如下命令啟動PostgreSQL的Docker容器:

$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13

這樣會通過互聯(lián)網下載最新的PostgreSQL鏡像并啟動一個以后臺任務運行的容器。

接著,安裝、運行Odoo服務端容器,聯(lián)結剛剛啟動的PostgreSQL容器,對外暴露端口8069

$ docker run -t -p 8069:8069 --name odoo --link db:db odoo:15.0 -d odoo15

此時便可在終端窗口看到實時的 Odoo 服務器日志,在瀏覽器中訪問http://localhost:8069即可打開 Odoo 實例。

注: 如果8069端口被占用了,則Odoo 服務啟動會失敗。比如端口可能被正在運行的 Odoo 服務端所占用。此時我們需要查找停止占用該端口的服務(比如查找運行中的服務列表)或者使用-p 參數(shù)指定其它端口來運行 Odoo。如修改為8070端口(-p 8070:8069)。還可通過-d <dbname>參數(shù)修改實例所需使用的數(shù)據庫名稱。

以下Docker 的幾個基本命令會有助于管理容器:

  • docker stop <name>:停止容器
  • docker start <name>:啟動容器
  • docker start -a <name>:啟動容器并附帶輸出,如在命令終端中輸出的服務器日志
  • docker attach <name>:重新添加容器輸出至當前終端窗口
  • docker ps:列出當前 Docker 容器

以上就是操作 Docker 容器的基本命令。

萬一在運行容器時出現(xiàn)問題,可以執(zhí)行如下命令重新來過:

$ docker container stop db
$ docker container rm db
$ docker container stop odoo
$ docker container rm odoo

Docker 技術的應用非常廣泛,學習起來也很有趣。Docker官網上有不錯的文檔可供學習,可先通過https://www.docker.com/get-started開始學習。

啟用開發(fā)者工具

要實現(xiàn)我們的項目,這里需要用到Odoo開發(fā)者工具。通過開啟開發(fā)者模式即可使用這些工具。

開發(fā)者模式對于查看和修改當前Odoo的配置很有用??芍苯油ㄟ^用戶界面自定義Odoo應用并快速添加、修改功能??捎盟鲂┬⌒薷?,比如創(chuàng)建帶有自己菜單、視圖及底層數(shù)據模型的應用。

注意:開發(fā)者暴露了Odoo應用的大量內部配置,可對其進行修改。但能力越大,責任真大,所以應謹慎修改。在線上系統(tǒng)中請保持在拷貝數(shù)據庫中進行這些修改。如果出現(xiàn)問題,還有機會通過升級所影響的應用(或是base模塊)在解決問題,但不是100%保證。

這種通過開發(fā)者工具的自定義開發(fā)相對于在后續(xù)章節(jié)講到的編程工具而言存在其局限性。如它無法添加或擴展默認的 ORM 方法。

借助于開者模式(通過Odoo Studio應用)的自定義開發(fā)不易于集成到結構性開發(fā)流,如版本控制、自動化測試及質量測試、預發(fā)布和生產環(huán)境改進的工作流。

本文我們主要使用開發(fā)者模式來介紹在 Odoo 框架中應用配置數(shù)據是如何進行組織的,以及如何在開發(fā)者模式下完成簡單的自定義或原型解決方案。

開啟開發(fā)者模式

從Odoo 13開始,通過Settings > General Settings頁面開啟開發(fā)者模式。在接近底部的地方會發(fā)現(xiàn)一個Developer Tools的版塊。在這里可以找到Activate the developer mode鏈接。點擊該鏈接就會在當前瀏覽器窗口中開啟開發(fā)者模式功能:

圖1.3 – Settings頁面中的開發(fā)者工具選項

注意需要至少安裝了一個應用后才會出現(xiàn)General Settings菜單。如果找不到該菜單,請安裝一個應用,如ContactsCRM等任一應用。

Odoo 13中的變化:Odoo 10到12版本,開發(fā)者模式都是通過Settings > Dashboard頁面右下角處開啟。而對于Odoo 9及之前的版本,開發(fā)者模式是在網頁右上角中的User菜單的About對話窗口中激活,

啟用了開發(fā)者模式后,會出現(xiàn)如下的菜單:

  • 菜單欄中,右上角聊天和活動圖標左側會新增一個開發(fā)者工具的小蟲子圖標。
  • Settings應用中,頂欄中會出現(xiàn)TechnicalTranslations菜單項。

圖1.4 – 開啟了開發(fā)者模式后的設置頁面

開啟開發(fā)者模式后在網頁視圖上會出現(xiàn)一些額外信息,即在將鼠標懸停在字段上,會有一個提示框顯示相關的技術信息。

注: 我們也可以通過修改當前的 URL 來進入開發(fā)者模式,這樣就無需進入 Settings 頁面。僅需修改鏈接中的.../web#...為.../web?debug=1#...。比如修改http:///localhost:8069/web#home為http://localhost_8069/web?debug#home

使用帶資源的開發(fā)者模式

為了加載更快,網頁客戶端對JavaScriptCSS資源進行了最小化壓縮。這會給調試帶來困難。

Activate the developer mode (with assets) 選項會阻止這種最小化壓縮,讓每個資源單獨加載。對于在網頁客戶端中進行調試這很有用處,但也會因開銷開讓頁面的瀏覽變慢。

小貼士:Firefox和Chrome瀏覽器都有插件可提供一個按鈕,方便開啟及禁用Odoo中的開發(fā)者模式。請在插件商店中搜索Odoo Debug。

說說 Odoo Studio

值得一提的是Odoo企業(yè)版和SaaS版都提供了Odoo Studio應用,這是一個交互的應用構造器。我們不會使用到它,因為本書的示例均使用 Odoo 社區(qū)版,社區(qū)版中沒有這一功能。

Odoo Studio提供了一套用戶友好的界面,用于完成本章中講解的交互式開發(fā)功能及一些其它功能,比如可以將自定義功能導出到文件中。

這里我們會使用開發(fā)者模式(有時也被稱為debug模型)及Technical菜單,這兩者在Odoo所有的版本中都可用。Odoo Studio中所構建的大部分功能通過這兩個工具也可完成,不過對于非開發(fā)者來說確實也難些。

對模型添加自定義字段

向已有表單添加自定義字段是一種很覺的自定義,無需創(chuàng)建自定義模塊通過用戶界面就可實現(xiàn)。

我們的to-do清單應用中,希望選擇一組人共同操作to-do清單項??梢栽谒麄兊膒artner表單設置一個標記來進行指定。我們將通過向Contact模型添加一個Is Work Team? 標記來實現(xiàn)。

Contact模型是Odoo內核自帶的,即使未安裝任何應用也可以使用。但這樣就沒有菜單選項來訪問它了。

如果在主菜單中沒有Contacts應用的話,請進行安裝。打開頂級菜單的Apps項,搜索該應用進行安裝。

圖1.5 – Apps菜單中添加Contacts應用

安裝完成后即可在頂級菜單中找到 Contacts 項。

對模型添加字段

我們先在數(shù)據模型中添加自定義字段。

點擊Contacts應用菜單項查看聯(lián)系人主視圖。點擊開發(fā)者工具小蟲圖標并選擇View Fields選項。

ODOO 12中的變化

開發(fā)者菜單中的View Fields選項是在Odoo 12中新增的,可通過Settings >Technical >Database Structure菜單添加、編輯字段??梢允褂?strong>Models或Fields選項。

此時會看到當前模型Contact所有已有字段的列表。點擊左上角的Create按鈕、填入新字段的以下詳情:

  • Field Name: x_is_work_team
  • Field Label: Is Work Team?
  • Field Type: boolean

圖1.6 – 創(chuàng)建Is Work Team?字段

字段名(Field Name)必須以 x_開頭。這是通過開發(fā)者工具創(chuàng)建模型和字段強制要求的(否則保存時會提示Custom fields must have a name that starts with 'x_' !)。通過插件模塊的自定義開發(fā)沒有這一限制。

點擊Save,就會在字段列表中新增這個字段。默認,列表視圖顯示80條記錄,因此需要點擊右上角的右鍵瀏覽下一頁查看新字段,或者也可以編輯箭頭旁的記錄數(shù)。

對表單視圖添加字段

現(xiàn)在Contact模型中就有一個新字段(前面也提到過也稱為Partner模型)。但在用戶界面中仍不可見。需要為其給定一個視圖。我們會添加一個聯(lián)系人表單視圖。

回到Contacts的列表并打開表單視圖,可通過選擇已有的聯(lián)系人或點擊Create按鈕。

現(xiàn)在需要決定在表單的哪里添加這個字段。例如,我們應在Tags標簽后進行添加。這會是使用的擴展點。

將鼠標懸浮在字段上,會顯示其技術信息,如下圖所示:

圖1.7 – 帶有技術詳情提示信息的Tags字段

接下,我們需要找到該字段的技術名稱??赏ㄟ^將鼠標懸停在字段標簽之上。這樣我們可以看到該字段的名稱為category_id。

現(xiàn)在可以擴展表單視圖添加字段。點擊開發(fā)者工具小蟲圖標,選取Edit View: Form選項。這會打開表單定義的容器。

圖1.8 – 表單視圖編輯窗口

Architecture標簽頁下,可以看到基礎視圖的XML??梢灾苯舆M行編輯,但這不是個好做法,因為在模塊升級時修改會丟失。正確的方式是通過創(chuàng)建一個擴展視圖來對其編輯。

安裝額外的模型可以對基礎視圖添加更多的字段及視覺元素。這是通過使用擴展視圖完成的,并且可在Inherited Views標簽頁下查看。我們會在這里為聯(lián)系人表單視圖添加我們的擴展。

Inherited Views列表中,點擊底部的Add a line ,使用如下的值創(chuàng)建擴展視圖:

  • View Name: 添加一些短描述,如Contacts Form extensions for To-do App。
  • Architecture: 這會要求一個指定擴展點及所添加內容的XML片斷。使用<field name="category_id" position="after"><field name="x_is_work_team"/></field>。

擴展視圖應當像下圖這樣:

圖1.9 – 創(chuàng)建擴展視圖來添加x_is_work_team字段

現(xiàn)在點擊Save & Close,如果所填XML沒有錯誤,會加到Inherited Views列表,其中會包含我們添加的擴展。點擊Save按鈕完成對表單視圖的修改,通過點擊右上角的x關閉Edit Form: View窗口。

修改已完成,但需要重新加載表單才能看到修改。重新加載頁面,現(xiàn)在Tags字段下面應該會出Is Work Team? 字段,如下圖所示:

圖1.10 – 帶有Is Work Team? 字段的聯(lián)系人表單視圖

這樣就完成了在表單視圖中添加自定義字段的步驟。表單只是這些視圖類型中的一種。下一節(jié)中詳細討論視圖的類型。

了解視圖類型

我們剛剛操作了一種視圖類型,表單視圖。但用戶界面中還使用了其它的視圖類型。

Contacts的初始視圖類型為看板視圖,以數(shù)據卡片顯示一些字段。看視圖還可以按列組織卡片。例如,CRM應用以這種初始視圖形式顯示,稱為管道視圖。在看板視圖中,開發(fā)者菜單中顯示Edit View: Kanban選項。

列表視圖(有時也稱為樹狀視圖)以列表顯示記錄。在列表視圖中,開發(fā)者菜單會顯示Edit View: List選項。

最后,搜索視圖控制看板視圖及列表視圖右上角搜索框的行為,以及其下的按鈕:FiltersGroup By。在搜索框可見時,開發(fā)者菜單會顯示一個Edit View: ControlPanelView選項。

視圖類型并不僅限于這些,還有其它的類型,我們會在第十章 Odoo 15開發(fā)之后臺視圖 - 設計用戶界面中進行探討。

可通過Settings > Technical > User Interface > Views菜單項查看所有的視圖定義。

一種更詳細的方式是使用Settings > Technical > Database Structure > Models來所要的模型(本例為res.partner,也稱之為Contact),并打開Views標簽。

圖1.11 – Contact模型的數(shù)據庫結構

這里,我們可以看到所選模型的所有視圖定義??梢酝ㄟ^View Type列看到不同類型視圖的記錄,以及基礎視圖及它們的擴展。修改或新增視圖記錄會即刻生效,在下次重新加載視圖時即可看到修改。

按視圖類型排序有助于查看同一視圖類型的所有擴展。

基礎視圖是Inherited View字段,有些為空。視圖類型并不僅限于一種基礎視圖。例如,Contact模型(res.partner)的表單視圖有多個基礎視圖,如base.view_partner_formbase.view_partner_simple_form

視圖還有一個Sequence字段。Sequence序號最小的基礎視圖為默認顯示的視圖。在查看表單視圖定義時,會看到這個Sequence值。窗口動作用于菜單項,可指定具體使用的基礎視圖。我們提到,如果未定義某個視圖,會使用序號最小的那個。

新建模型

模型是構建應用的基本組件,包含了所需使用到的數(shù)據結構和存儲。接下來我們就為 To-do 清單應用添加模型,有三個字段:

  • Description文本
  • Is done? 標記
  • Work team(即在清單中相互協(xié)作的用戶列表)

模型名應使用單數(shù)形式,因此新模型的名稱應為To-do Item。模型技術名稱必須為有效的數(shù)據庫對象標識符,因此我們應使用字母和下劃線,避免使用其它符號。因為通過Technical菜單創(chuàng)建的模型必須帶有x_ 前綴,這個新模型的技術名稱使用x_todo_item。

通過菜單Settings > Technical > Database Structure > Models進入模型定義頁面。

點擊Models列表中的Create按鈕創(chuàng)建新模型:

  1. 填入基本定義值:在Model Description字段中輸入To-do Item,Model字段輸入x_todo_item。

  2. 默認,模型會在字段列表中包含x_name字段。這是在列表中顯示記錄或在其它記錄引用它時顯示的標題??捎米?strong>To-do Item的標題,因此編輯修改相應的Field Label列(改為 Title)。

  3. 接下來添加Is Done? 字段。這應當很明確。在Fields列表中,點擊底部的Add a line打開新的視圖表單,輸入如下值:

    1. Field Name: x_is_done
    2. Field Label: Is Done?
    3. Field Type: boolean

    然后點擊Save & Close按鈕,再點擊模型表單中的Save。


    圖1.12 – 新建字段表單

  4. 接下來的Work Team字段應該會更有挑戰(zhàn)性了。不僅是因為這是一個引用Contact (res.partner)模型中記錄的關聯(lián)字段,而且它還是一個多值選擇字段。
    所幸的是Odoo支持多對多關聯(lián)。本例正是如此,因為每條任務清單可關聯(lián)多個聯(lián)系人,而每個聯(lián)系人又可關聯(lián)多條任務清單。
    Fields列表中添加Work Team字段,需要再次點擊表單的Edit按鈕,接著點擊Add a line打開新增字段表單。然后輸入如下值:

    1. Field Name: x_work_team_ids
    2. Field Label: Work Team
    3. Field Type: many2many
    4. Related Model: res.partner
    5. Domain: [('x_is_work_team', '=', True)]

    多對多字段有一些專有的基礎屬性:Relation Table, Column 1Column 2。這些會自動進行填寫,通常使用默認值即可。在第六章 Odoo 15開發(fā)之模型 - 結構化應用數(shù)據中會詳細討論到這些屬性。
    Domain屬性是可選的,它為所展示的記錄定義了一個過濾器。我們使用它來將聯(lián)系人限定為勾選了Is Work Team? 標記的人。否則會在選項中出現(xiàn)所有聯(lián)系人。

    Domain 表達式遵循Odoo 獨有的語法 - 一個包含三個值的可迭代對象,每個對象是一個過濾條件,表示待過濾的字段名、過濾運算符及過濾所使用的值。詳細的解釋參見第七章 Odoo 15開發(fā)之記錄集 - 使用模型數(shù)據。

    小貼士: Odoo有一個交互式的 domain 過濾向導可幫助生成作用域表達式。訪問Settings > Technical > User Interface > User-defined Filters菜單。在表單中選中目標模型后,Domain字段會顯示一個 + Add filter按鈕用于添加過濾條件。下面的文本框會動態(tài)地顯示作用域表達式代碼。

  5. 在完成后,點擊模型表單的Save。創(chuàng)建好新模型后,會自動添加一些字段。ORM引擎在所有模型中添加了它們,在進行審計時會很有幫助:


    圖1.13 – To-do清單模型的數(shù)據庫結構
    現(xiàn)在to-do列表應用的底層模型就緒了,但用戶還是無法訪問。為此,需要配置訪問權限。在下一節(jié)中我們進行學習。

創(chuàng)建菜單項和動作

現(xiàn)在已經有了存儲任務清單的模型,我們希望在用戶界面中添加它??稍赨I中添加菜單項實現(xiàn)。

我們會創(chuàng)建一個直接打開任務列表的頂級菜單。一些應用(如Contacts)正是這樣,而另一些則是頂欄下的子菜單。

菜單的定義位于Settings應用的Technical > User Interface > Menu Items 中:

圖1.14 – Technical菜單中的Menu Items選項

我們執(zhí)行如下步驟創(chuàng)建菜單項:

  1. 進行上圖的頁面,點擊Create,輸入如下值:

    1. Menu: To-do
    2. Parent Menu: 留空
    3. Action: 選擇 ir.actions.act_window
    4. Action字段旁的選擇框中輸入To-do Items, 在下拉列表中選擇Create and Edit... ,這時會打開Create: Action 表單彈窗。
  2. Create: Action表單中,設置如下值:

      1. Action Name: To-do Items
      2. External ID Object: x_todo_item (目標模型的技術名稱)。
      3. 此時,動作定義應該是下面這樣:

    圖1.15 – Create: Action表單

  3. 點擊Create: Action 表單中的Save。然后在Menu Items表單中點擊Save,然后to-do列表應用的菜單項就差不多可以使用了。

菜單的修改要求對整個頁面重新加載才可以看到。大多數(shù)瀏覽器可通過F5快捷鍵來重新加載。但如果現(xiàn)在刷新頁面的話,是看不到To-do菜單的。為什么呢?我們現(xiàn)在還看不到菜單的原因是還沒有給用戶授權訪問。

在對用戶展示菜單項之前需要配置訪問權限。我們在本章中會進行處理,但在那之前,有必要更深入地討論一下窗口動作。

了解窗口動作

本例中,對不帶有子菜單項的頂級菜單項直接添加了一個動作。但菜單可以是包含父子關系的樹狀菜單項。枝葉菜單項擁有一個關聯(lián)動作,定義選中后的行為。動作名就是在展示視圖中使用的標題。

有好多種動作類型,最重要的有窗口、報表和服務端動作。窗口(window)動作是最常用到的,用于在客戶端中展示視圖。報表(report)動作用于運行報表,而服務端(server)動作用于定義自動化任務

這里我們關注的是用于顯示視圖的窗口動作。剛剛創(chuàng)建的to-do清單菜單項使用了一個直接通過Menu Item表單創(chuàng)建的窗口動作。我們也可以通過Settings > Technical > Actions菜單項查看、編輯這個窗口動作。本例中我們感興趣的是窗口動作菜單選項。

小貼士: 很多情況下,使用開發(fā)者工具菜單中的Edit Action選項會更為方案,它提供了編輯當前視圖窗口動作的快捷方式。

配置訪問控制權限

Odoo自帶有權限控制機制,用戶僅能使用已授權的功能。這就意味著我們創(chuàng)建的任務清單模型用戶是訪問不到的。。

Odoo 12中的變化
****admin
用戶現(xiàn)在也像其它用戶一樣受權限控制所限制。在此前的 Odoo 版本中,admin 都作為特權用戶不受權限規(guī)則控制。這一情況發(fā)生了變化,admin必須要獲得授權才能訪問模型數(shù)據。

訪問權限通過用戶組定義。組有時也稱為訪問控制列表(ACL),定義訪問模型的權限。用戶隸屬于組。因此,每個用戶的權限依賴于其所屬組。

對這個項目,我們會創(chuàng)建一個to-do組,將其分配給訪問該項功能的用戶。

此外,我們還可以定義記錄規(guī)則(有時稱作行級權限),用于限制每個用戶可訪問哪些記錄。

本項目中 to-do 項為每個用戶私有,所以用戶僅能訪問自己創(chuàng)建的記錄。

安全組

訪問控制基于組。通過安全組對模型設置權限,控制組內用戶所能使用的菜單項。要做更精細化的控制,我們可以通過記錄規(guī)則對指定菜單項、視圖、字段甚至是數(shù)據記錄進行權限控制,在下一小節(jié)中會進行講解。

安全組還可以對應用進行管理,通常每個應用有兩個組:用戶組(User)可執(zhí)行日常操作、管理員組(Manager)可對應用執(zhí)行所有配置。

下面我們?yōu)?em>to-do清單應用新建一個安全組。

Settings頂級菜單中,導航至Users & Companies > Groups,使用如下值新建一條記錄:

  • Application: 留空
  • Name: To-do User
  • Inherited 標簽下: 添加一行,選擇User types / Internal User

效果如下:

圖1.16 – To-Do User安全組

我們的安全組繼承了 Internal User組。組的繼承表示該組的成員也是所繼承組的成員,并對所有的用戶累加授權的權限。Internal User 是基礎權限組,通常應用的安全組都繼承它。

在 Application 下拉列表中還沒有to-do 應用,所以我們直接通過組表單來添加。我們還,那么這個組的成員也會自動(遞歸)成為所繼承組的成員,以獲取他們原有的權限。

Odoo 12中的變化
在 Odoo 12之前,Internal User
組稱作雇員(Employee),這只是表面上的修改,代碼中標識符(XML id)仍然和此前版本相同:base.group_user。

安全訪問控制列表

現(xiàn)在我們可以將組To-do User授權給指定模型了。

最簡單的方式是使用Groups表單中的Access Rights標簽。使用如下值添加一行:

  • Name: To-do Item User Access
  • Object: 在列表中選擇To-do Item
  • 勾選Read Access, Write Access, Create Access和Delete Access:勾選所有這些復選框來授予對應的權限。

模型權限也可通過Settings > Technical > Security > Access Rights菜單進行管理。

我們無需單獨向 Contact 模型添加權限,因為我們的組繼承了Internal User組,已經獲取了相應權限。

對用戶分配安全組

現(xiàn)在可以將 admin 用戶添加到新建權限組來測試新增的權限設置:

  1. 在菜單中點擊Users & Companies > Users,打開Mitchell Admin用戶的表單,點擊Edit。
  2. 在Access Rights標簽下的 Other 版塊,會發(fā)現(xiàn)一個名為 To-do User 的復選框用于將用戶加入權限組。勾選后點擊 Save 保存表單。

圖1.17 – Mitchel Admin用戶表單

如果一切操作都正確的話,我們就可以看到 To-do 應用頂級菜單。應該需要重新加載瀏覽器頁面強制刷新菜單項。

我們還沒有為其創(chuàng)建任何視圖,但優(yōu)秀的Odoo框架自動為我們生成一些基本視圖:

圖1.18 – 任務清單默認表單視圖

安全記錄規(guī)則

在對模型賦予訪問權限時,默認用戶可以訪問到它的所有記錄。但有時我們要限制每個用戶所能訪問的記錄。通過記錄規(guī)則可以實現(xiàn)這一點。

記錄規(guī)則通過對模型定義 domain 過濾器來對讀和寫操作進行控制。

比如我們這里的 to-do 清單應用,任務項應為每個用戶私有的,我們不希望其他用戶看到自己的記錄。需要添加記錄規(guī)則來過濾出創(chuàng)建者自己的記錄,考慮如下幾點:

  • 框架會自動添加create_uid字段,并存儲創(chuàng)建記錄的用戶。因此可使用它來知道每條記錄的創(chuàng)建者。
  • 域運行上下文包含一個user變量,其中含有當前用戶的瀏覽器記錄。因此我們可以使用點號運算符訪問其屬性,如user.id的值。

我們可在作用域表達式中使用如下來實現(xiàn)目標:

[('create_uid', '=', user.id)]

通過菜單中的Settings > Technical > Security > Record Rules 或開發(fā)者菜單的View Record Rules選項進入記錄規(guī)則設置頁。進行頁面后使用如下值新建記錄規(guī)則:

  • Name: 一個描述性的標題,如 To-do Own Items
  • ****Model: 在下拉列表中選擇模型,此處為To-do Item
  • Access Rights: 規(guī)則所授予的操作,這里保留全部勾選
  • Rule Definition (Domain Filter) : 填寫 [('create_uid', '=', user.id)]
  • Groups: 這部分包含所應用的安全組。點擊Add a line 、選擇To-do User

此時記錄規(guī)則的定義如下:

圖1.19 – To-do User Own Items記錄規(guī)則

此時就完成了記錄規(guī)則的設定?,F(xiàn)在可以試試用 Admin 和 Demo 用戶(需提前將 Demo 用戶加入到安全組)分別創(chuàng)建幾個任務項。各自應該只能看到自己創(chuàng)建的任務了。

了解超級用戶賬號

Odoo包含一個內置的像root那樣的超級用戶,它擁有特殊權限、可不受權限控制的限制。它用于那些需忽略權限控制的內部操作或動作。這個超級用戶名為OdooBot,在數(shù)據庫創(chuàng)建時自動創(chuàng)建,在數(shù)據庫中的ID為1。

Odoo 12中的變化

在Odoo 12之前。用于系統(tǒng)配置的默認admin用戶也是超級用戶。因此,admin用戶默認不受權限控制。在Odoo 12中進行了調整?,F(xiàn)在,默認的admin用戶是一個普通用戶,但默認它被設為所有Odoo應用的管理員。

超級用戶沒有登錄密碼,但可以激活該賬號。在通過Admin \ Setting組用戶登錄時,開發(fā)者菜單中會有一個Become Superuser選項。

也可以直接在登錄界面進行超級用戶模式。這時需要通過修改URL添加 ?debug=1來開啟開發(fā)者模式(如http://localhost:8069/web/login?debug=1)。然后中在Login按鈕下方就會出現(xiàn)Login as superuser選項。

在啟用了超級用戶后,右上角的當前用戶顯示為 OdooBot,該區(qū)域會變成黃黑相間的條狀,以清晰地告知用戶開啟了超級用戶。

注意:

僅在絕對必要時才應使用超級用戶。超級用戶不受權限控制這點會導致數(shù)據的不一致性,比如在多公司場景下,所以應盡量避免。

創(chuàng)建視圖

我們創(chuàng)建了To-do Item模型,并且通過菜單項可在用戶界面中訪問到它。下面我們?yōu)槠鋭?chuàng)建兩個基本的視圖:列表視圖和表單視圖。

列表視圖中用戶瀏覽已有記錄的最基本方式。有時,可在列表視圖中直接編輯記錄,但更常見的是點擊記錄訪問表單視圖來編輯記錄數(shù)據。

創(chuàng)建列表視圖

我們可在Settings > Technical > User Interface > Views中管理視圖。在該頁面點擊Create按鈕,輸入如下值:

  • View Name: To-do List View

  • View Type: Tree

  • Model: x_todo_item

  • Architecture:這個標簽應包含視圖結構的XML。使用如下XML代碼:

```
<tree>
  <field name="x_name" />
  <field name="x_is_done" />
</tree>
```

這時視圖的定義如下所示:

圖1.20 – 任務清單列表視圖定義

列表視圖的基本結構相當簡單,它包含一個<tree>元素,內部含有一個或多個對應視圖中所顯示字段的<field>元素。

在列表視圖中還可以做其它有趣的操作,我們會在第十章 Odoo 15開發(fā)之后臺視圖 - 設計用戶界面中進行更詳細的探討。

創(chuàng)建表單視圖

表單視圖也可以通過Settings > Technical > User Interface > Views創(chuàng)建。通過點擊Create創(chuàng)建另一條視圖記錄,填入如下值:

  • View Name: To-do Form View

  • View Type: Form

  • Model: x_todo_item

  • Architecture:在該標簽內,輸入如下XML 代碼:

```
<form>
  <group>
    <field name="x_name" />
    <field name="x_is_done" />
    <field name="x_work_team_ids" 
          widget="many2many_tags"
          context="{'default_x_is_work_team': True}" />
  </group>
</form>
```

注: 如果不指定 View Type,將會通過視圖定義代碼來自動識別。

表單視圖結構根節(jié)點為<form>元素,包含<field>等元素。其它相關元素將在第十章 Odoo 15開發(fā)之后臺視圖 - 設計用戶界面中進行學習。對x_work_team_ids工作組字段,我們使用了一個指定的微件many2many_tags,它會以按扭行標簽的形式代替普通列表顯示關聯(lián)記錄。

還可以看到在x_work_team_ids工作組字段中使用了一個context屬性。默認,關聯(lián)字段允許我們直接新建關聯(lián)中使用的記錄。因此,用戶可以通過Work Team字段直接新建Partner記錄。因為只有標記為Is Work Team? 的聯(lián)系可供選擇,我們希望默認創(chuàng)建的聯(lián)系人都啟用該標記。這就是default_x_is_work_team上下文鍵干的事,為通過該字段創(chuàng)建的記錄設置默認值。

這樣我們就新建好了表單視圖。如果現(xiàn)在使用To-Do 菜單項新建清單任務或打開列表中已有的記錄,會看到剛剛所添加的表單視圖。

創(chuàng)建搜索視圖

我們可以在Odoo的視圖界面左上角中看到一個搜索框。搜索框讓我們可以在指定的字段中進行搜索。在搜索框下面有FiltersGroup By 按鈕,提供了一些預定義選項。

搜索視圖是一種控制這些行為的UI元素。它定義了在搜索框中輸入時所做的搜索以及FiltersGroup By按鈕內的選項。

視圖可以通過Settings > Technical > User Interface菜單或Odoo 13起開發(fā)者菜單的Edit ControlPanelView選項進行編輯,更早的版本中使用Edit Search View。

當前任務清單模型還未定義過搜索視圖,所以我們應當新建一個。我們?yōu)檫^濾菜單添加一個選項來過濾出未完成的清單。

在新增View表單中填入如下值并點擊Save

  1. View Name: To-do Search View

  2. View Type: Search

  3. Model: x_todo_item

  4. Architecture: 在該標簽下添加如下XML 代碼:

```
<search>
  <filter name="item_not_done"
    string="Not Done"
    domain="[('x_is_done', '=', False)]" />
</search>
```

此后,重新打開或加載任務清單視圖時,在Filters的選項列表中就會出現(xiàn)Not Done選項。

對視圖啟用默認過濾器

默認就開啟這個過濾器會比較好,在不需要時刪除。

在點擊To-do菜單項時,它運行一個窗口動作打開To-do列表視圖。窗口動作的context對象可用于設置默認過濾器,類似于對字段設置默認值。

我們使用如下步驟:

  1. 打開To-do菜單進入任務清單列表視圖
  2. 打開開發(fā)者工具菜單并選擇Edit Action。這時將彈出一個用于打開當前視圖的窗口動作表單。在General Settings標簽欄的Filters版塊中,有一個Context ValueDomain Value字段。
  3. Context Value字段中,輸入 {'search_default_item_not_done': True}

search_default_ 前綴指示默認選取一個具體的過濾器,這里為item_not_done?,F(xiàn)在如果點擊To-do菜單項,會看到在搜索框中默認啟用了Not Done,并且用戶可以自由取消選擇。

Domain Value字段也可用戶對顯示的記錄設置過濾器,但設置的過濾器用戶無法移除。

小結

在本章中,我們不僅總覽了 Odoo 的組件,還利用開發(fā)者模式深入到 Odoo 內部來理解這些組件如何共同協(xié)作創(chuàng)建應用。

我們還使用這些工具創(chuàng)建了一個簡易的應用,包含模型、視圖和對應的菜單。并且學習了如何通過開發(fā)者工具查看已有應用或在用戶界面中直接進行快速自定義操作。

下一章中我們將學習如何通過源碼安裝Odoo,以及準備Odoo模塊開發(fā)所使用的開發(fā)環(huán)境。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容