iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Odoo

前後端整合學習,不只是後端管理系列 第 15

【Day15】 odoo 資料庫串接(二) GET

  • 分享至 

  • xImage
  •  

在 Odoo 的開發中,操作資料庫是實現業務邏輯的重要一環。Odoo 的 ORM 系統為開發者提供了簡單而強大的工具,允許開發者通過 Python API 來輕鬆地對資料進行操作,而無需直接編寫 SQL 查詢。本文將以 Odoo 的 Repair 模組為例,展示如何使用 GET 請求來取得維修訂單資料,並展示如何使用 Postman 來測試這些 API。

Repair 模組簡介

Odoo 的 Repair 模組用於管理產品維修訂單。它記錄了維修流程的各個階段,並儲存了與維修相關的所有詳細信息,如產品、客戶、維修狀態、維修成本等。這個模組的核心模型是 repair.order,對應資料表 repair_order,用於存儲所有的維修訂單記錄。

使用 ORM 來取得 Repair 訂單資料

在 Odoo 中,ORM 提供了一個簡單的介面來查詢資料。以下是一個簡單的控制器範例,展示了如何使用 ORM 來取得所有的維修訂單資料,並將其通過 GET 請求返回。

  1. 建立控制器來處理 GET 請求

    首先,我們需要建立一個控制器來處理 GET 請求,該請求將返回所有維修訂單的資料。

    from odoo import http
    from odoo.http import request
    import json
    
    class RepairOrderController(http.Controller):
    
        @http.route('/repair/orders', type='http', auth='public', methods=['GET'], csrf=False)
        def get_repair_orders(self):
            # 使用 sudo 繞過權限檢查,檢索所有維修訂單
            repair_orders = request.env['repair.order'].sudo().search([])
    
            # 構建 JSON 響應
            order_list = []
            for order in repair_orders:
                order_list.append({
                    'id': order.id,
                    'name': order.name,
                    'product': order.product_id.name,
                    'customer': order.partner_id.name,
                    'state': order.state,
                    # 假設你需要成本,使用 invoice_id 或其他字段替代 repair_fee
                    'cost': order.amount_total if hasattr(order, 'amount_total') else 'N/A'
                })
    
            # 返回 JSON 響應
            return http.Response(
                json.dumps({'status': 'success', 'orders': order_list}),
                content_type='application/json'
            )
    

    在這個控制器中,我們定義了一個路由 /repair/orders。當訪問這個路由時,系統會使用 ORM 查詢 repair.order 模型中的所有訂單,並將其轉換為 JSON 格式返回給客戶端。

  2. 使用 Postman 測試 GET API

    現在,我們可以使用 Postman 來測試這個 API。Postman 是一個強大的 API 測試工具,允許我們發送 HTTP 請求並檢視伺服器的回應。

    1. 打開 Postman 並創建新請求

      打開 Postman,點擊 "New" 按鈕,選擇 "Request" 創建一個新請求。將請求命名為 "Get Repair Orders"。

    2. 設置 GET 請求

      • 方法:選擇 GET
      • URL:輸入 http://localhost:8069/repair/orders(假設 Odoo 正在本地端口 8069 上運行)。
      • Header:設置 Content-Typeapplication/json
      • 點擊 "Send" 發送請求。

      如果配置正確,你應該會收到一個 JSON 響應,包含所有維修訂單的詳細信息。

  3. 在後台新增資料後測試

    可以通過 Odoo 的後台介面手動新增一筆維修訂單,然後使用剛剛在 Postman 中設置的 GET 請求來檢查新資料是否被正確返回。這樣可以驗證 API 是否能夠動態反映資料庫中的變更。

    • 在 Odoo 後台進入 Repair 模組。
    • 創建一個新的 Repair Order,填寫相關的產品、客戶和其他信息,並保存。
    • 返回 Postman,重新發送 GET 請求。
    • 在回應中應該能夠看到剛剛新增的維修訂單數據。

總結

通過這篇文章,我們展示了如何使用 Odoo 的 ORM 來查詢資料,並通過 GET API 返回資料以供外部系統或應用程式使用。這種方法可以輕鬆地將 Odoo 中的業務數據暴露給其他服務,並確保數據的一致性。Postman 提供了一個便捷的環境來測試和驗證 API 功能,使得開發和調試變得更加高效。這種方法非常適合需要定期查詢或整合 Odoo 資料的場景。

https://ithelp.ithome.com.tw/upload/images/20240924/20165487RbYJRSAgpY.png

補充sudo

1. 為什麼 auth='public' 不工作?

當你使用 auth='public' 時,路由的訪問是公開的,任何人都可以訪問這個 API。然而,模型(如 repair.order)的讀取權限仍然受限於 Odoo 的訪問控制規則。

  • 匿名用戶(未登錄用戶)無法直接讀取 repair.order 模型,因為 Odoo 預設不會為匿名用戶提供這樣的權限。
  • 即使 auth='public' 允許所有用戶訪問這個路由,匿名用戶也仍然缺乏訪問 repair.order 的權限,導致 403 Forbidden 錯誤。

2. 解決方案:使用 sudo() 繞過權限檢查

要讓匿名用戶能夠訪問 repair.order 資料,你需要使用 sudo() 來繞過權限檢查,這樣可以忽略 Odoo 的權限規則,允許任何用戶(包括未登錄的用戶)讀取 repair.order 資料。

3. 為什麼需要 sudo()

Odoo 的權限系統非常嚴格,默認情況下,只有特定用戶組才能訪問某些模型。即使你將路由設置為 auth='public',Odoo 還會檢查用戶是否有權限訪問數據。當你使用 sudo(),你可以繞過這些檢查,允許公開訪問數據。

4. 何時應用 sudo()

當你確定 API 應該對所有用戶(包括未登錄用戶)公開時,並且該用戶不應受到 Odoo 權限系統的限制,你可以使用 sudo()。這會使得 API 以超級用戶身份運行,從而繞過權限檢查。

5. 如果不想使用 sudo()

如果你不希望繞過 Odoo 的權限系統,而是希望通過配置來讓未登錄用戶獲得訪問權限,你需要修改 Odoo 的權限配置。


上一篇
【Day14】 odoo 資料庫串接
下一篇
【Day16】 odoo 資料庫串接(三) POST
系列文
前後端整合學習,不只是後端管理19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言