iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Odoo

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

【Day16】 odoo 資料庫串接(三) POST

  • 分享至 

  • xImage
  •  

我們要來繼續我們的旅程了~

1. 修改控制器,添加 POST 請求處理

首先,在你的現有控制器中新增一個處理 POST 請求的路由,該路由將接收維修訂單的相關資料,並創建一個新的維修訂單。

修改控制器:

# POST 請求:創建一筆新的維修訂單
    @http.route('/repair/orders', type='http', auth='public', methods=['POST'], csrf=False)
    def create_repair_order(self):
        try:
            # 解析 JSON 
            data = json.loads(request.httprequest.data)

            # 如果沒有產品 ID,則創建一個新產品
            product = request.env['product.product'].sudo().search([('id', '=', data.get('product_id'))], limit=1)
            if not product:
                product = request.env['product.product'].sudo().create({
                    'name': data.get('product_name', 'Unnamed Product')
                })

            # 創建新的維修訂單
            new_order = request.env['repair.order'].sudo().create({
                'name': data.get('name', 'New Repair Order'),
                'product_id': product.id,
                'partner_id': data.get('partner_id'),
                'state': data.get('state', 'draft')
            })

            return http.Response(
                json.dumps({
                    'status': 'success',
                    'message': 'Repair order created successfully',
                    'order_id': new_order.id
                }),
                content_type='application/json'
            )

        except Exception as e:
            return http.Response(
                json.dumps({'status': 'error', 'message': str(e)}),
                content_type='application/json'
            )

2. 新增訂單的結構

POST 請求應包含訂單的詳細信息,如訂單名稱、產品 ID、客戶 ID、狀態等。這些資料將傳遞到控制器,並通過 Odoo ORM 在 repair.order 模型中創建新的記錄。

3. 使用 Postman 測試 POST 請求

步驟:

  1. 打開 Postman 並創建新請求

    • 打開 Postman,點擊 "New" 按鈕,選擇 "Request" 創建一個新請求。
    • 將請求命名為 "Create Repair Order"。
  2. 設置 POST 請求

    • 方法:選擇 POST
    • URL:輸入 http://localhost:8069/repair/orders(假設 Odoo 正在本地端口 8069 上運行)。
    • Header:設置 Content-Typeapplication/json
  3. 設置 Body

    • 選擇「Body」,選擇 raw 並設置格式為 JSON
    • 在 Body 中提供以下資料,根據實際情況填寫產品 ID 和客戶 ID:
    {
      "name": "Repair Order Test",
      "product_id": 1,
      "partner_id": 1,
      "state": "confirmed"
    }
    
    
  4. 發送請求

    • 點擊「Send」按鈕,發送 POST 請求。
  5. 查看響應

    • 如果一切順利,應該會返回類似以下的 JSON 響應:
    {
        "status": "success",
        "message": "Repair order created successfully",
        "order_id": 1
    }
    

    其中,order_id 是新創建的訂單的 ID。

4. 在 Odoo 後台檢查新訂單

當 POST 請求成功後,你可以登錄 Odoo 後台,進入 Repair 模組,查看新創建的維修訂單是否已經成功創建。

總結

通過以上步驟,你已經實現了通過 POST 請求來創建新的維修訂單,並且可以通過 Postman 測試這個 API 功能。

  • GET 請求:用於獲取所有維修訂單的資料。
  • POST 請求:用於創建新的維修訂單,通過 JSON 請求發送給 Odoo。

補充說明

在 Odoo 中,repair.order 模型中的 partner_id(客戶 ID)是必需的,因為每個維修訂單都需要與某個客戶相關聯。這意味著,當你創建一個新的維修訂單時,系統會希望你指定一個已經存在的客戶。

如果你不希望每次都要先為客戶創建帳號,這裡有幾種方案可以考慮:

方案 1:使用默認的「匿名客戶」記錄

Odoo 通常會在某些情況下使用一個默認的「匿名客戶」或「公共客戶」來處理不需要明確客戶的情況。你可以先在 Odoo 的「聯繫人」中創建一個公共客戶,然後在創建訂單時,默認使用這個客戶。

步驟:

  1. 在 Odoo 中創建公共客戶
    • 進入 Odoo 後台,選擇「聯繫人」模組。
    • 新增一個客戶,命名為「公共客戶」或「匿名客戶」。
  2. 在控制器中默認使用公共客戶
    修改你的控制器,當沒有提供 partner_id(客戶 ID)時,默認使用這個公共客戶的 ID。例如,假設「公共客戶」的 ID 是 1,則可以這樣處理:
from odoo import http
from odoo.http import request
import json

class RepairOrderController(http.Controller):

    # POST 請求:新增一筆維修訂單
    @http.route('/repair/orders/create', type='json', auth='public', methods=['POST'], csrf=False)
    def create_repair_order(self):
        try:
            # 從請求中提取資料
            data = request.jsonrequest

            # 如果沒有提供客戶 ID,則使用公共客戶的 ID(假設為 1)
            partner_id = data.get('partner_id', 1)

            # 創建新的維修訂單
            new_order = request.env['repair.order'].sudo().create({
                'name': data.get('name'),
                'product_id': data.get('product_id'),
                'partner_id': partner_id,  # 使用指定的客戶 ID,或默認為公共客戶
                'state': data.get('state', 'draft'),  # 默認狀態為 'draft'
                'repair_fee': data.get('repair_fee', 0.0),  # 默認維修費用為 0.0
            })

            # 返回成功訊息和新創建訂單的 ID
            return {
                'status': 'success',
                'message': 'Repair order created successfully',
                'order_id': new_order.id,
            }

        except Exception as e:
            return {
                'status': 'error',
                'message': str(e),
            }

在這段程式中,如果 partner_id 沒有在 POST 請求中提供,它將自動使用 ID 為 1 的「公共客戶」。

方案 2:允許創建訂單時不設置客戶

如果你確定在某些情況下維修訂單不需要客戶,你可以修改 repair.order 模型的字段屬性,將 partner_id 設置為非必填字段。這樣,你就可以創建不帶客戶的維修訂單。

修改模型:

如果你是開發者,可以自定義 repair.order 模型,讓 partner_id 變成可選的。如下所示:

from odoo import models, fields

class RepairOrder(models.Model):
    _inherit = 'repair.order'

    partner_id = fields.Many2one('res.partner', string='Customer', required=False)  # 移除必填限制

這段程式通過繼承 repair.order 模型並將 partner_id 字段的 required 屬性設置為 False,使得客戶成為可選字段。

注意:這樣做可能會影響到 Odoo 的其他功能,因為 Odoo 預設認為每個訂單應該關聯到一個客戶。所以這種方法應該謹慎使用。

方案 3:自動創建新客戶(如果沒有提供)

如果你的需求是當沒有客戶時自動創建一個新的客戶(例如匿名客戶),你可以修改控制器,在處理 POST 請求時檢查是否提供了 partner_id,如果沒有,則自動創建一個臨時或匿名客戶。

修改控制器:

from odoo import http
from odoo.http import request
import json

class RepairOrderController(http.Controller):

    # POST 請求:新增一筆維修訂單
    @http.route('/repair/orders/create', type='json', auth='public', methods=['POST'], csrf=False)
    def create_repair_order(self):
        try:
            # 從請求中提取資料
            data = request.jsonrequest

            # 如果沒有提供客戶 ID,則自動創建匿名客戶
            if not data.get('partner_id'):
                new_partner = request.env['res.partner'].sudo().create({
                    'name': 'Anonymous Customer',
                })
                partner_id = new_partner.id
            else:
                partner_id = data.get('partner_id')

            # 創建新的維修訂單
            new_order = request.env['repair.order'].sudo().create({
                'name': data.get('name'),
                'product_id': data.get('product_id'),
                'partner_id': partner_id,  # 使用新創建或指定的客戶 ID
                'state': data.get('state', 'draft'),
                'repair_fee': data.get('repair_fee', 0.0),
            })

            # 返回成功訊息和新創建訂單的 ID
            return {
                'status': 'success',
                'message': 'Repair order created successfully',
                'order_id': new_order.id,
            }

        except Exception as e:
            return {
                'status': 'error',
                'message': str(e),
            }

這段程式會在 partner_id 缺失的情況下自動創建一個匿名客戶,然後繼續創建維修訂單。

總結:

  • 方案 1:使用公共客戶:你可以在系統中創建一個「公共客戶」,然後在 POST 請求中默認使用這個客戶,避免每次都要新增客戶。
  • 方案 2:允許不設置客戶:將 partner_id 設置為非必填字段,但需要注意這可能影響到 Odoo 的其他業務邏輯。
  • 方案 3:自動創建匿名客戶:如果沒有提供客戶 ID,系統可以自動創建一個匿名客戶。

選擇合適的方案取決於你的具體業務需求。如果不希望每次手動創建客戶,使用公共客戶或自動創建客戶會是比較合適的選擇。


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

尚未有邦友留言

立即登入留言