iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Odoo

30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用系列 第 26

【Day26】使用 GenAI 補上圖書館模組的缺陷:以實例來實驗 GenAI 環境下的策略

  • 分享至 

  • xImage
  •  

GenAI 時代下,處理大型專案需要分而治之 (Odoo 模組即是),處理 Odoo 模組需要 Odoo 知識。

GenAI 非常厲害,但它處理大型專案時的記憶能力有限。因此,學習如何將專案拆解成更小的單位並逐步實作,是成功完成專案的關鍵。

呼應第一天寫的文章,【Day01】GenAI 這麼強大,為什麼還要學程式呢?,以下來看看我的 GenAI 實作。

上個實作的缺失

可以很盡責跟你說,上一個實作有缺陷,首先,列舉幾個點:

  • 少了 __init__.py
  • 少了 Menu
  • 少了 Security Group

並且還有這個 Messenge,也是在述說沒有 Security Group

Rule access_library_books has no group, this is a deprecated feature. Every access-granting rule should specify a group.

我們就這幾個點依序使用 GenAI 克服。

少了 Menu

GenAI 提問

"""
# books.py
from odoo import models, fields

class Books(models.Model):
    _name = 'library.books'
    _description = 'Library Books'

    name = fields.Char(string='Book Name', required=True)
    isbn = fields.Char(string='ISBN')
    book_type = fields.Selection([
        ('paper', 'Paper'),
        ('ebook', 'E-Book'),
        ('other', 'Other')],
        string='Book Type', default='paper')
    description = fields.Text(string='Description')
    stock = fields.Integer(string='Stock')
    price_twd = fields.Float(string='Price (TWD)')
    average_rating = fields.Float(string='Average Rating', digits=(2, 2))
    publish_date = fields.Date(string='Publish Date')
    last_rent_date = fields.Datetime(string='Last Rent Date')
    rentable = fields.Boolean(string='Rentable', default=True)
    cover_image = fields.Binary(string='Cover Image')
"""

"""
book_views.xml
<odoo>
    <record id="view_book_form" model="ir.ui.view">
        <field name="name">library.books.form</field>
        <field name="model">library.books</field>
        <field name="arch" type="xml">
            <form string="Book">
                <sheet>
                    <group>
                        <field name="name"/>
                        <field name="isbn"/>
                        <field name="book_type"/>
                        <field name="description"/>
                        <field name="stock"/>
                        <field name="price_twd"/>
                        <field name="average_rating"/>
                        <field name="publish_date"/>
                        <field name="last_rent_date"/>
                        <field name="rentable"/>
                        <field name="cover_image" widget="image"/>
                    </group>
                </sheet>
            </form>
        </field>
    </record>

    <record id="view_book_tree" model="ir.ui.view">
        <field name="name">library.books.tree</field>
        <field name="model">library.books</field>
        <field name="arch" type="xml">
            <tree string="Books">
                <field name="name"/>
                <field name="isbn"/>
                <field name="book_type"/>
                <field name="stock"/>
                <field name="price_twd"/>
                <field name="average_rating"/>
                <field name="publish_date"/>
                <field name="last_rent_date"/>
                <field name="rentable"/>
            </tree>
        </field>
    </record>
</odoo>
"""

上面是使用 Odoo 17 客製化模組的 Model 和 View,請幫我補齊 Menu 欠缺的部分

GenAI 回答

要在 Odoo 17 中補齊 Library 模組的 Menu 定義,可以使用 ir.ui.menu 模型來新增目錄,並把你定義的 library.books 模型與相關視圖綁定到該目錄下。以下是完整的 book_menu.xml 補充部分:

<odoo>
    <!-- Action for Tree and Form views of Books -->
    <record id="action_book_list" model="ir.actions.act_window">
        <field name="name">Books</field>
        <field name="res_model">library.books</field>
        <field name="view_mode">tree,form</field>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">
                Create your first book record
            </p>
        </field>
    </record>

    <!-- Library main menu -->
    <menuitem id="menu_library_root" name="Library"/>

    <!-- Submenu for Books -->
    <menuitem id="menu_library_books" 
              name="Books" 
              parent="menu_library_root"
              action="action_book_list"/>
</odoo>

解釋:

  1. Action 定義 (action_book_list):這個 ir.actions.act_window 定義了一個動作,讓使用者可以透過樹狀視圖和表單視圖來瀏覽 library.books 資料。
  2. 主目錄 (menu_library_root):定義了一個主目錄 "Library"。
  3. 書籍子目錄 (menu_library_books):在 "Library" 主目錄下,定義了一個 "Books" 子目錄,點擊時會觸發前面定義的 action_book_list。

這樣,當你在 Odoo 17 中安裝這個模組後,應該會在應用程式介面看到 "Library" 主目錄,並且可以進入 "Books" 子目錄來管理書籍資料。

你可以將這段 XML 儲存為 book_menu.xml 並將它加到你的模組 __manifest__.py 文件中的 data 欄位中,如此安裝模組時會一併載入:

'data': [
    'views/book_views.xml',
    'views/book_menu.xml',
],

少了 Security Group & Access Rule

GenAI 提問

請新增最簡易的 Security Group 和 Access Rule

GenAI 回答

以下是如何新增最簡單的 Security Group 和 Access Rule,確保使用者只有在擁有正確的權限時才能查看、創建、修改或刪除 library.books 模型中的記錄。

Security Group & Access Rule 定義:
security/ir.model.access.csv (新增)

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_library_books_user,access.library.books.user,model_library_books,group_library_books_user,1,1,1,1

security/library_security.xml (新增)

<odoo>
    <!-- Security group for library users -->
    <record id="group_library_books_user" model="res.groups">
        <field name="name">Library Books User</field>
        <field name="category_id" ref="base.module_category_hidden"/>
    </record>
</odoo>

解釋:

  1. group_library_books_user:這是一個用於管理 Library 模組的 Security Group,稱為 "Library Books User"。這裡使用 module_category_hidden 將該群組分類隱藏,但你可以使用 base.module_category_tools 或其他類別來分類它。
  2. ir.model.access.csv:這個檔案定義了該 Security Group 對應的存取控制權限:
  • perm_read: 閱讀權限
  • perm_write: 修改權限
  • perm_create: 建立權限
  • perm_unlink: 刪除權限
    所有這些權限都被設置為 1,即允許此 Security Group 的成員進行閱讀、修改、建立和刪除書籍資料。

更新 manifest.py 文件:
確保在你的模組的 manifest.py 文件中,加入這些安全性設定的文件路徑:

'data': [
    'security/library_security.xml',
    'security/ir.model.access.csv',
    'views/book_views.xml',
    'views/book_menu.xml',
],

這樣你就定義了一個最簡易的 Security Group 及其 Access Rule,用來管理 library.books 模型的資料。

少了 __init__.py

GenAI 提問

請給我完整的 Module 結構,只需要檔名讓我檢查是否有缺檔案
library/
│
├── __init__.py
├── __manifest__.py
│
├── models/
│   ├── __init__.py
│   └── books.py
│
├── security/
│   ├── ir.model.access.csv
│   └── library_security.xml
│
├── views/
│   ├── book_views.xml
│   └── book_menu.xml
│
└── data/
    └── (可以用來放預設資料,如有需要)

各檔案功能:

  • __init__.py: 用於初始化模組,在 models/ 資料夾中的 books.py 文件需被匯入。
  • __manifest__.py: 包含模組的說明、依賴性、數據路徑等模組的基本定義。
  • models/: 用來定義模型資料夾,books.py 文件中包含 library.books 模型。
  • security/:
    • ir.model.access.csv: 用來定義模型的存取權限 (Access Rules)。
    • library_security.xml: 用來定義 Security Groups。
  • views/: 放置所有與視圖 (Views) 相關的 XML 檔案。
    • book_views.xml: 定義書籍的表單視圖 (Form View) 和樹狀視圖 (Tree View)。
    • book_menu.xml: 定義書籍的目錄項目 (Menu) 和動作 (Action)。
  • data/: (可選) 如果你有預設資料或需要初始化資料,可將檔案放置在此資料夾。
    確認檔案是否齊全後,你可以將這個模組安裝到 Odoo 17 中來測試。

小結

GenAI 在 Odoo 模組開發中的困境

  1. 專案範圍廣:Odoo 模組開發往往涉及多個檔案和資料夾,專案規模龐大。這導致 GenAI 難以一次性記住和處理全部資訊,特別是當專案橫跨多個模組和層次時。
  2. 缺乏背景知識:GenAI 雖然能生成代碼,但對 Odoo 的架構和開發細節不熟悉時,難以應對較複雜的場景。比如在生成時可能會出現小錯誤,而如果開發者缺乏經驗,除錯過程可能變得困難且耗時。

使用 GenAI 的策略

  1. 資訊拆解與請求聚焦:針對大型專案,開發者需要具備拆解能力,將具體的開發需求分解成小型模組或功能,並利用 GenAI 針對每個部分分別生成代碼,然後手動整合。這樣能提高代碼的生成準確度。
  2. 開發經驗的重要性:使用 GenAI 工具時,具備 Odoo 開發經驗的開發者能快速發現生成代碼中的潛在問題,並高效地進行修改和除錯。熟悉 Odoo 架構的開發者能更好地指導 GenAI 生成合適的代碼,提高整體工作效率。

上一篇
【Day25】用 GenAI 重做去年鐵人賽 Odoo 圖書館系統 【~Day10】
下一篇
【Day27】GenAI 擴充原有功能:ISBN 驗證 和 預設搜尋選項
系列文
30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言