Odoo的開發(fā)模式和基本概念
Odoo提供了一個快速開發(fā)的框架尤其是比較適合商業(yè)場景的一些應用開發(fā),這些應用通常都是對一些業(yè)務上的記錄進行一些增刪改查的工作匈庭。不僅如此,Odoo還提供了豐富的組件用以制作用戶的交互浑劳,如看板阱持、日歷等日常功能。
以下我們分為五個板塊介紹Odoo:
首先魔熏,我們整體的對Odoo框架做一個整體的概覽衷咽,設置開發(fā)環(huán)境,并生成自己的第一個Odoo應用蒜绽;當整體熟悉了 Odoo的主要組件后镶骗,我們將深入,更細節(jié)地了解Odoo的三層業(yè)務架構躲雅,這三大板塊分別是模型層鼎姊、業(yè)務邏輯層、和表現(xiàn)層相赁;當我們建立了自己的應用后相寇,最后我們需要測試、發(fā)布到一個生產環(huán)境并維護钮科。
在這個章節(jié)中唤衫,我們會快速開始,在未搭建開發(fā)環(huán)境錢绵脯,首先建立Odoo的Web用戶界面佳励。我們將會學習一些關于Odoo架構的東西,幫助我們理解哪些組件比較適合蛆挫,然后我們會建立一個簡單的圖書館應用赃承,如何在現(xiàn)有模型中增加字段,如何新增新的模型璃吧,并為其新增自定義的用戶界面楣导,使其可用。
在我們親身使用開發(fā)者模式前畜挨,首先在一個更高的層級筒繁,看看Odoo的整體架構。
Odoo 架構
Odoo是一個多層的架構巴元,我們看到的主要有一下三層:數(shù)據(jù)毡咏、邏輯和表現(xiàn)層
數(shù)據(jù)層是最底的一層,它負責數(shù)據(jù)的存儲和持久化逮刨,Odoo使用 PostgreSQLSever來完成這一層工作呕缭,PostgreSQL是唯一被支持的關系型數(shù)據(jù)庫堵泽,這是設計者的選擇,其他的數(shù)據(jù)庫如MySQL等都不受支持恢总,其他諸如文檔迎罗、圖像等,通常以文件系統(tǒng)方式存儲片仿。
邏輯層是由Odoo服務器控制纹安,負責所有對數(shù)據(jù)層的交互。在正常情況下砂豌,只允許該層直接訪問數(shù)據(jù)庫以保證數(shù)據(jù)安全與同步厢岂。在Odoo的核心,有一個ORM(對象關系模型)引擎阳距,ORM提供提供豐富的API以供新增的模塊和數(shù)據(jù)交互使用塔粒。
舉個例子,合作商數(shù)據(jù)實體筐摘,像顧客和供應商卒茬,在ORM中作為一個模型,這個模型是一個Python的對象蓄拣,支持多種的交互方法扬虚,例如,create方法可以新建合作商記錄球恤,read方法可以查詢當前的記錄和詳細數(shù)據(jù)。這些在對象里的方法可以實現(xiàn)特定的業(yè)務邏輯荸镊,例如create方法可以設置某些默認值或者做某些驗證的規(guī)則咽斧,read方法可能支持某些字段的計算,為用戶的操作設定不同的權限躬存。
表現(xiàn)層作為展現(xiàn)數(shù)據(jù)與用戶交互.它是一個負責對所有用戶操作執(zhí)行的客戶端響應张惹。這個客戶端通過與ORM的API交互去完成讀、寫岭洲、驗證或執(zhí)行其他的一些操作宛逗,通過遠程方法調用(RPCS)去呼叫ORM的API方法調用。這些操作會發(fā)到odoo服務器做處理盾剩,然后將結果返回到客戶端以做進一步處理雷激。
在表現(xiàn)層里,Odoo提供了一個全功能開箱即用的Web客戶端告私,這個Web客戶端支持業(yè)務邏輯需要的所有屬性如:登錄會話屎暇,導航菜單,數(shù)據(jù)列表驻粟,表單等等根悼。雖然全局的外觀不像一個前端人員設想的那樣可定制化,但是它已經可以很輕松地區(qū)創(chuàng)建一個風格統(tǒng)一的用戶功能模塊。
其中一個補充的顯示層是集成的網(wǎng)站框架挤巡,他提供一個完成靈活性的頁面新建可準確地完成用戶的交互剩彬。像其他CMS框架一樣,旨在減少一些工作量和技術開發(fā)矿卑。這個網(wǎng)站框架支持Web控制器實現(xiàn)特定的邏輯代碼襟衰,使其余模型內的邏輯保持分離,前段開發(fā)人員可以有更大的自由發(fā)揮空間粪摘。
由于Odoo服務器API的開放性瀑晒,以致在幾乎所有的平臺和編程語言的客戶端實現(xiàn)也是可行的。利用Odoo的數(shù)據(jù)和邏輯層實現(xiàn)邏輯徘意,為用戶提供特定的用戶界面苔悦,如構建桌面應用程序,手機應用程序椎咧。
Odoo還有一個特別的第三方客戶端例子叫ERPpeek玖详,他是一個命令行客戶端。允許你鏈接遠程的Odoo服務器實現(xiàn)交互勤讽。這對于有經驗的Odoo開發(fā)人員和系統(tǒng)管理員來說蟋座,使用它去做服務器上的數(shù)據(jù),腳本檢查等高級操作與維護是非常有用的脚牍。后續(xù)我們將在第8章介紹ERPpeek向臀, 即與其他系統(tǒng)集成外部API。
開發(fā)者模式
許多Odoo的自定義都可以直接從用戶界面進行诸狭。
這是更改應用程序一個非橙颍快速的方法。它可以做一些小修改驯遇,例如增加一個字段芹彬,或者做一些較大的自定義,入建立幾個模型叉庐,視圖和菜單項舒帮。
與后面章節(jié)講述的,使用變成工具完成自定義的方式相比陡叠,這些通過用戶UI進行的自定義有不少的限制玩郊。舉個例子,我們不能添加或擴展ORM的方法匾竿,盡管自動化操作可以作為替代方法使用瓦宜,但他們不容易集成到結構化的開發(fā)工作流中,例如運行自動化測試或部署到多個環(huán)境中岭妖、再如質量保證临庇,預生產和生產反璃。
Odoo10.0的時候引入了Odoo Studio,這是一個應用程序設計器假夺,可以從用戶界面創(chuàng)建并進行定制淮蜈。我們不在這里討論Odoo Studio, 它雖然是一個用戶體驗友好的前端已卷,但正如我們在本章節(jié)中介紹到的梧田,它的自定義會得到相同的限制。Odoo Studio確實包含一個很重要的特性侧蘸,就是很方便的到處模塊進行定制裁眯。這對于高級用戶在SaaS實例或更簡單的自建平臺環(huán)境中非常有用。
本書的其余部分將介紹如何以結構化方式對ODOO進行二次開發(fā)讳癌,用代碼編輯器創(chuàng)建附加模塊穿稳。
但在本章中,我們先用開發(fā)者模式特性直接在Web用戶界面對界面進行定制晌坤,因為對于開發(fā)人員來說逢艘,了解和使用這些工具是非常重要的。
但更重要的骤菠,我們通過這些練習它改,需要完成一個目標:更好地理解Odoo應用程序的層次結構,以及他們的組件是如何組織的商乎。
廢話不多說央拖,我們開始來折騰這些工具吧。
圖書館項目介紹
我們會用一個簡單的項目來介紹這些開發(fā)工具:我們會新建一個簡單的圖書館應用截亦,這個應用主要是幫我們去記錄書本和他們的作者爬泥。它可以管理作家的列表和這些書是哪位作家創(chuàng)作的。
我們的圖書館應用需要兩個模型:作家和書本崩瓤。這兩模型屬于多對多的對應關系:每一個作家可以有多本書,每一本書可以有多個作家踩官。
Odoo已經提供了技術名稱為res.partner內置的伙伴關系模型却桶,以表示人員、組織和地址蔗牡。例如客戶颖系、供應商、聯(lián)系人和應用程序用戶都是合作伙伴辩越。我們使用這個模型用于圖書館應用的作者嘁扼,將使事情簡單很多。我們只需要在這個模型上增加一個是否為“作家”的標記黔攒,以及增加一個僅顯示作家的菜單即可趁啸。
而對于書本强缘,我們將創(chuàng)建一個全新的模型,相應的表達不傅,列表視圖以及訪問它們的菜單項旅掂。
創(chuàng)建一個工作數(shù)據(jù)庫
我們需要在一個Odoo測試數(shù)據(jù)庫上工作。
在第二章(安裝與部署開發(fā)環(huán)境)访娶,我們將會介紹如何通過源碼安裝Odoo商虐,并建立自己的開發(fā)環(huán)境。在這里我們先略過崖疤。我們現(xiàn)在現(xiàn)有的ODOO服務器上直接使用用戶的UI開始秘车。
如果你還沒有一個可用的Odoo已安裝的版本,你可以先在odoo.com建立一個測試數(shù)據(jù)庫來完成本章節(jié)劫哼。Odoo.com提供企業(yè)版的用戶接口叮趴,用戶界面和我們提供的截圖有些許不一致,但這并沒太大問題沦偎。要創(chuàng)建一個新的數(shù)據(jù)庫疫向,你可能會被問到選擇一個啟動應用程序,在這一章中沒有特定的應用程序需要遵循豪嚎,但如果你不確定選什么搔驼,選CRM就可以了。
Odoo遵循一個核心開放的商業(yè)模型侈询, 產品分為社區(qū)版和企業(yè)版兩個版本發(fā)布舌涨。企業(yè)版是在社區(qū)版基礎上構建的,它添加了一些高級功能扔字,包括改進的用戶界面囊嘉。在Odoo.com,你將使用企業(yè)版革为,在公共Github倉庫扭粱,你可以找到社區(qū)版。雖然這兩個版本外觀看起來不同震檩,但他們只是表面上的改變琢蛤,兩個版本的用戶界面特性是一樣的
現(xiàn)在,我們通過瀏覽器登錄并進入Odoo的數(shù)據(jù)庫抛虏。對于Odoo在線博其,地址會如http://<mydbname>.odoo.com。對于自己部署的實例迂猴,地址將會是http://<server-address>:8069慕淡。8069是Odoo的默認端口,如果你安裝時使用了不同的端口沸毁,應修改成對應的端口號峰髓。
我們將使用目錄里的應用程序——聯(lián)系人傻寂,所以我們首先安裝它,如果你還安裝儿普,打開頂部菜單崎逃,找到聯(lián)系人,點擊安裝眉孩。
現(xiàn)在我們可以使用這個實力開始工作了个绍,接下來的一步是激活開發(fā)者工具,這讓我們能訪問到Odoo的內部構件浪汪。
激活開發(fā)者模式
在設置界面的右下角巴柿,你可以找到激活開發(fā)者模式的鏈接,點擊它死遭,可以在瀏覽器窗口啟用一些開發(fā)者模式的特性广恢。
!對于Odoo9.0或之前的版本呀潭,開發(fā)者模式在用戶菜單下的钉迷,“關于”對話框窗口中激活,在網(wǎng)頁界面的右上角
我們還有一個激活開發(fā)者模式(帶有資源包)的選項钠署,它所做的是為了防止網(wǎng)頁客戶端壓縮網(wǎng)頁的資源包糠聪,這對于調試網(wǎng)頁是非常有用的,犧牲了速度為代價谐鼎。(下載的文件變大了舰蟆,自然網(wǎng)頁加載的速度會變慢)
為了加載得更快,Web客戶端會將JavaScript和CSS的資源包進行壓縮狸棍,這樣的話身害,就會對網(wǎng)頁調試帶來不便。激活開發(fā)者模式(帶資源包)選項會防止文件壓縮草戈,將網(wǎng)頁資源包單獨的塌鸯,為被壓縮的加載出來。
TIPS:你也可以不進行設置而啟用開發(fā)者模式唐片,只需編輯當前的URL后面加入?debug界赔,或者?debug=assets ,例如牵触,http://myserver/web#home將被更改為http://myserver/web?debug#home。雖然沒用點擊啟用它的連接咐低,但前端框架也支持調試標志揽思,使用?debug=assets 添加到對應的URL來禁止避免對Web前端的資源包進行壓縮。但要注意见擦,導航到其他頁面的時候钉汗,這個參數(shù)不會進行持久化羹令。
當開啟了開發(fā)者模式,我們將會看見有兩個額外的菜單可用:
- Debug菜單损痰,位于頂部菜單右側的Debug圖標福侈,在用戶名和頭像前面。
- 技術菜單條目卢未,在設置應用里
開發(fā)人員模式還支持有關表單字段的其他信息肪凛,鼠標指針停留在一個字段上時,工具會提示它的技術信息
我們將在下一步部分介紹和使用這些開發(fā)者模式的特性辽社。
在一個現(xiàn)有的模型上增加字段
增加一個定制字段是一個很常規(guī)的定制操作伟墙,可以直接通過用戶UI進行,不需要新增一個自定義模塊滴铅。
對于我們的圖書館應用戳葵,我們需要增加一個是否為作家的一個字段。作為基礎模型:合作伙伴模型的標記汉匙。以此可以列出所有的作家拱烁。
我們可以通過“設置”應用來完成這項操作,在 “技術->數(shù)據(jù)庫結構->模型” 菜單項目噩翠,查找到 res.partner 模型戏自,模型描述為“聯(lián)系人”的模型。點擊打開相應的表單視圖绎秒,你就可以看到合作伙伴模型具體的屬性浦妄,包括所有的字段列表:
現(xiàn)在,我們可以在列表在底部點擊新增一行了见芹,這時剂娄,一個彈出窗口將會顯示。
讓我們進行一下配置:
- 字段名稱:x_is_book_author
- 字段標簽: Is Book Author?
- 字段類型:布爾值
這個字段必須從x_開始玄呛。這時通過UI直接對模型新增字段強制的阅懦。對附加模塊沒有這個限制。
就這樣徘铝,點擊保存和關閉耳胎,我們新的字段就被添加到字段列表里面了。這個模型可能有超過80個字段惕它,你可能需要通過導航翻到下一頁才能看到他怕午,使用列表右上角的向右箭頭即可。
現(xiàn)在淹魄,點擊左上角的保存按鈕郁惜,保存這些修改。
我們現(xiàn)在新的字段已經對合作伙伴模型可用了甲锡,但對于用戶它還是不可見的兆蕉,因此我們需要將他加入到視圖中羽戒。
但是,在合作伙伴或叫聯(lián)系人模型表單里虎韵,點擊視圖的選項卡易稠,我們可以看到所有定義在res.partner模型上的視圖。你可以看到包蓝,每一個視圖是一個數(shù)據(jù)庫的記錄驶社。修改和增加視圖記錄的結果是,你會在頁面重載的的時候看見它养晋。
在視圖列表中有些重要的事情需要注意衬吆。
我們可以看見有多個視圖類型,如表單绳泉,樹形逊抡,搜索,或者看板零酪。搜索視圖實際上是對右上角搜索欄的可用篩選器定義冒嫡。其他的視圖類型是不同的數(shù)據(jù)顯示方式,其中比較基礎的樹形(用于列表視圖)和窗體(用于詳細信息)
樹形和列表都可以用來引用相同的視圖類型四苇,他們實際上是列表孝凌,而樹形這個名字是因為歷史的原因。在過去的列表視圖里面曾經有過一個“樹”的層次模型月腋。
如果你通過視圖類型進行排序蟀架,你會注意到相同的視圖類型可以有多個定義。實際上榆骚,我們可以有幾個基本的視圖定義片拍,如一個空的繼承視圖。我們也可以有多個擴展視圖妓肢,例如捌省,將字段添加到現(xiàn)有表單。
擴展視圖可以被其他擴展視圖擴展碉钠。在這種情況下纲缓,最后的擴展應用于前面的擴展都已應用于基本視圖之后。
對于res.partner模型喊废,我們看到兩種基本的表單形式的客戶端操作:res.partner.form 和 res.partner.simplified.form祝高。想這些操作在菜單項目中,可以指定要使用的特定基視圖污筷,如果沒有任何定義褂策,可以使用序列最少的一個。你可以把它想成默認視圖,單擊視圖行斤寂,我們將可以看到帶有的視圖的詳細信息,包括序列值揪惦。
要了解用戶界面某一處使用特定的視圖是什么遍搞,我們可以使用Debug菜單去檢查它。讓我們去試一試器腋,點擊聯(lián)系人溪猿,我們會收到一份聯(lián)系人名單,點擊任何卡片纫塌,將會顯示對應的表單視圖≌锵兀現(xiàn)在,我們點擊右上角的調試Debug菜單措左,選擇“編輯視圖:表單”選項:
這將顯示與我們以前在模型中看到的相同的詳細表單依痊,但是實際上視圖的定位位置,如你所建怎披。它是res.partner.form 頁面視圖
在體系架構方面中胸嘁,我們可以看到帶有視圖定義XML。我們可以編輯它來添加我們的新字段凉逛,雖然這是可行的性宏,但是從長遠來看,這不是一個好方法状飞。這個視圖屬于插件模塊毫胜,有時進行模塊升級,這些自定義將會被覆蓋或丟失诬辈。我們可以通過外部ID字段酵使,在這種情況下,它是base.view_partner_form自晰。所以我們知道這個視圖是屬于base模塊的凝化。
修改視圖的正確方法是創(chuàng)建集成的視圖擴展。
首先酬荞,我們需要從原始視圖中選擇一個元素作為擴展點搓劫。我們可以通過檢查基本視圖來選擇一個具有name屬性的XML元素。大多數(shù)情況下混巧,這將是一個<field>元素枪向。這里,我們將選擇<field name="category_id" ...>元素咧党。
現(xiàn)在秘蛔,我們打開Debug菜單,點擊編輯表單頁面選項,選擇繼承的視圖選項卡深员,點擊底部的“添加明細行”负蠕。
彈出窗口會顯示,創(chuàng)建:一個視圖繼承自哪一個倦畅?我們將會填寫以下信息:
-視圖名稱:聯(lián)系人-自定義是否一個作家
-結構:使用下面的XML:
<field name = "category_id" position="after">
<field name = "x_is_book_author" />
</field>
其他重要的欄目遮糖,如模型、視圖類型叠赐、及繼承視圖欲账,使用默認值即可。
我們現(xiàn)在保存并關閉芭概。在編輯表單視圖窗口保存然后關閉它赛不。我們可以看到更改已經剩下,然后我們重載這個表單視圖罢洲。就是要刷新整個瀏覽器頁面踢故,在大部分的瀏覽器上,我們可以試用快捷鍵F5進行刷新奏路。
增加菜單畴椰,模型和視圖
現(xiàn)在我們新增一個應用功能,而不是擴展現(xiàn)有的一個鸽粉,我們將繼續(xù)完成我們的圖書館項目
首先斜脂,我們需要新建一個圖書館的頂層菜單,我們現(xiàn)在已經新增了作家菜單條目触机,下一步帚戳,我們將創(chuàng)建一個書本的模型,并且增加一個菜單讓用戶可以試用它儡首,然后我們可以為書本模型創(chuàng)建列表和表單視圖片任。
創(chuàng)建菜單
現(xiàn)在我們已經有途徑去列出作家,它是一個合作伙伴列表蔬胯,使用作家標記進去區(qū)分对供。
現(xiàn)在,我們需要新增一個作家菜單使其可以打開這個列表氛濒,篩選掉一些不是作家的合作伙伴辐脖。一個好消息是梅屉,我們可以很簡單的重用了現(xiàn)有的合作伙伴視圖完成這個操作陷寝。
在此之前奉芦,我們首先要建立一個頂部入口菜單去顯示我們的靚仔圖書館應用,下面將包含作家和書籍兩個菜單骗奖。
我們可以在設置里面找到菜單的定制确徙,在“技術”->“用戶界面”-> "菜單項目"醒串,使用下面的信息創(chuàng)建一個新的菜單項目:
- 菜單:圖書館
- 上級菜單:(空)
- 動作:(空)
在子菜單選項卡中,點擊增加明細行鄙皇,新增一下一個子菜單信息如下:
- 菜單:圖書作者
- 上級菜單:圖書館(默認值)
- 動作:選擇 ir.actions.act_window, 在選項列表上右擊創(chuàng)建并編輯芜赌,開啟一個對話框去創(chuàng)建關聯(lián)的視窗操作。為視窗操作設置以下的值
- 動作名稱: 圖書作者
-
對象: res.partner (目標模型的技術名稱)
1-6.png
保存所有表單的信息育苟,圖書館應用的菜單樹已經可以使用了较鼓。
我們重新加載頁面,就可以看到菜單的更改违柏。我們可以看到生成了多級的菜單結構,子菜單項目有關聯(lián)的動作香椎,定義它在選中時發(fā)生什么漱竖。這個動作的名稱將用作呈現(xiàn)視圖的標題。
這里有多種動作可選畜伐,最重要的動作為窗口馍惹、報表和服務器動作。窗口動作是最常見的視圖玛界,在瀏覽器終端顯示視圖万矾。報表動作是用作運行報表。服務器動作是用作定義自動化任務慎框。
此時良狈,我們關心的是用于顯示視圖操作的窗口動作。
我們剛創(chuàng)建的圖書館作者菜單項使用了一個窗口操作笨枯,它是直接從菜單表單創(chuàng)建的薪丁,我們可以查看和從設置|技術|動作菜單選項編輯它,在特殊情況下馅精,我們對窗口操作菜單更感興趣严嗜。
碰巧我們創(chuàng)建的圖書作者太簡單了,而且確實如此洲敢。不要執(zhí)行我們想要的漫玄,它將于所有合作伙伴一起打開一個列表,不管他們是否這本書的作者压彭?集合睦优。我們需要解決這個問題。
打開窗口動作菜單項哮塞,查找我們最近創(chuàng)建的圖書作者操作并編輯它刨秆,我們關心篩選器的部分,在“常規(guī)設置”選項卡內忆畅。
TIP:在許多情況下衡未,使用Debug菜單中的Edit Action選項更方便尸执,它提供編輯用于訪問當前視圖窗口操作的便捷快捷方式。
域值字段可以有一個表達式缓醋,改表達式定義要顯示的記錄的過濾器如失,這種“域表達式”遵循特定的odoo語法,后面的章節(jié)對此進行解釋送粱,現(xiàn)在我們知道它是一個三胞胎列表就足夠了褪贵。
在我們的例子中,我們使用“域值”的表達式是:
| [('x_is_book_author', '=', True)]
為了可用性抗俄,我們還想要創(chuàng)建新的記錄有是否作者標記脆丁。我們可以在試圖上通過設置默認值操作來完成,這是通過上下文方式完成的动雹,上下文是Odoo傳遞會話信息的方式槽卫,包括要使用的默認值。后面幾章將詳細討論它胰蝠,現(xiàn)在我們只需要知道它是一個鍵值對字典歼培。以default_前綴的值為相應字段提供默認值。
在我們的例子中茸塞,上下文值需要的表達式是:
| {'default_x_is_book_author': True}
就是這樣躲庄。如果我們現(xiàn)在嘗試Library | Book Authors菜單選項,它應該只列出Is Book Author的合作伙伴?檢查標志钾虐,如果有的話噪窘。如果我們試著創(chuàng)建一個新的圖書作者,我們會看到那個是圖書作者嗎?默認情況下禾唁,復選框將被方便地選中效览。
我們使用的域過濾器不能被用戶刪除〉炊蹋可以設置可以刪除的默認過濾器丐枉,使用上下文啟用默認搜索過濾器。這是通過search_default_鍵完成的掘托,如第9章“后端視圖—設計用戶界面”中所述瘦锹。
創(chuàng)建一個自定義模型
我們現(xiàn)在有一個圖書館的以及菜單,以及有一個作者的菜單項闪盔,是時候添加一個圖書菜單去管理圖書的記錄弯院。
讓我們重新查詢,在設置-> 技術->數(shù)據(jù)結構->模型菜單泪掀,點擊新建听绳,填寫模型的信息如下:
- 模型描述:Book
- 模型: x_library_book
我們先保存