iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Odoo

Odoo 魔法學院: 一步一腳印帶你成為客製化大師系列 第 23

[Day23] 用 JSON-RPC 實作客戶端 App: 實務上我會使用 OdooRPC

  • 分享至 

  • xImage
  •  

這次換 JSON-RPC 來實作簡單的客戶端 App,並且別重新造論子了,用 OdooRPC 吧! 你知道嗎,Odoo 原生的網頁前端就是使用 JSON-RPC 來跟後端溝通的。

今天會完成一個嫁接原本我們在 Library 模組上的功能,並從外部的 Python 環境中執行。

這次我們就略過 JSON-RPC 的細節 (詳細可以參考這 Link),直接往平日開發時我們會怎麼做開始吧!

OdooRPC

昨天我們試過了土法煉鋼的模式,這次我們要來使用客戶端的函式庫 OdooRPCOdooRPC 目前是由 Odoo Community Association (OCA) 維護的,可以直接從 PyPI 上直接下載。

(env15) ~$ pip3 install odoorpc
Collecting odoorpc
  Obtaining dependency information for odoorpc from https://files.pythonhosted.org/packages/20/60/8c5ea2a63151d6c1215e127909eeee3c16e792bbae92ab596dd921d6669d/OdooRPC-0.10.1-py2.py3-none-any.whl.metadata
  Downloading OdooRPC-0.10.1-py2.py3-none-any.whl.metadata (4.8 kB)
Downloading OdooRPC-0.10.1-py2.py3-none-any.whl (38 kB)
Installing collected packages: odoorpc
Successfully installed odoorpc-0.10.1

當然,你得先測試一下你安裝是否成功,像是直接使用 Python 直譯器。

(env15) ~# python3 
Python 3.7.3 (default, Jun 29 2023, 18:03:57) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import odoorpc
>>> api = odoorpc.ODOO("localhost", port=8070)
>>> api.login("library", "YOUR_DB_USERNAME", "YOUR_DB_PASSWORD")
>>> uid = api.env.uid
>>> print(uid)
2
>>> model = "library.book"
>>> Model = api.env[model]

這樣看來目前執行都是成功的了!

記得另一個終點機要啟動 Odoo Server 歐。 --- 文西

可以參考 OCA/odooRPC GitHub

客戶端實作

這邊是這次實作的 commit

這實作旨在讓大家基本了解 odoorpc 如何使用,以及跟原本的 XML-RPC 實作起來的差別在哪,我相信你會感受到明顯的差別。

第一部分,我們實作了一個簡易的調用 Odoo 圖書館系統的 API,主要包含初始化、創造、移除及搜尋,很多部分直接寫死,讓程式碼盡量精簡,比較好理解。

第二部分是做簡單的測試,先建立一本書,並用那本書的書名搜尋,再來移除書籍,在搜尋一次,應該就要找不到那本書了。

LibraryAPI

class LibraryAPI():
    _MODEL = "library.book"

    def __init__(self, host, port, db, username, password):
        self._api = odoorpc.ODOO(host, port=port)
        self._api.login(db, username, password)
        self._uid = self._api.env.uid
        self._model = self._api.env[self._MODEL]

    def search_read(self, title = None, domain = [], fields = ["id", "name"]):
        domain = [("name", "ilike", title)] if title else []
        return self._model.search_read(domain, fields)
    
    def create(self, title):
        return self._model.create({"name": title})

    def unlink(self, id):
        return self._model.unlink(id)

我們會跟 Odoo 伺服器建立連線,並且取出我們指定的 library.book model,這邊我們寫死,並且對 library.book model 銜接新增、搜尋、移除的功能。

可能要特別注意的是 domain 裡面的 "ilike",是指搜尋不分打小寫有包含的,詳細可以參考這篇

驗證

實作在這 Link,用我近期很喜歡的書舉例,現任微軟 CEO 寫的,強調用同理心完成企業的世紀變革,如今的微軟,很多策略皆是由他確立的,一改以往大家對微軟的刻板印象。

以下為實作的結果,可以對照程式碼會較清楚!

Output

(env15) # python3 library_odoorpc.py
*** Create ***
New book with ID 3 for title 刷新未來:重新想像AI+HI智能革命下的商業與變革
*** Search ***
3 刷新未來:重新想像AI+HI智能革命下的商業與變革
*** Delete ***
Book with ID 3 was deleted.
*** Search ***

上一篇
[Day22] 第一次用外部 API 就上手:最簡單的 Python 和 XML-RPC 結合
下一篇
[Day24] 設計管理者使用介面
系列文
Odoo 魔法學院: 一步一腳印帶你成為客製化大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言