iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
Odoo

利用【AI】工具,聰明進行 Odoo 程式開發系列 第 10

Day10:個案一:學校圖書管理(6)-學生借閱及權限

  • 分享至 

  • xImage
  •  

使用者故事

作為一名讀者,我希望能在登入後查看書籍的可用性,並能在線預約或借閱書籍,以確保我能取得想要的書籍。

進行下列二個邏輯項次的開發

    1. 書籍可用性檢查
    1. 書籍借閱功能

ChatGPT 依邏輯2、3 產生對應程式碼

重點說明,相關細節可參考

https://github.com/kulius/odoo17_ithelp

書籍可用性檢查

要實現書籍可用性檢查的功能,首先需要在 Odoo 中產生一個專門的 library.book 搜尋視圖(View),該視圖不允許新增書籍,只允許查看書籍是否可借閱。這裡是具體的設計步驟:

    1. 模型設計:library.book
      我們不需要修改 library.book 模型,因為之前已經有了 is_borrowed 字段,該字段用來標記書籍的借出狀態。
    1. 視圖設計

我們將為 library.book 創建一個 tree 視圖和一個 search 視圖,並確保該視圖不允許新增書籍,只能進行查詢和檢視。讀者可以通過這個視圖來查看書籍的可借閱狀態。

<odoo>
    <!-- 書籍列表視圖,讀者只能查看書籍,不允許新增 -->
    <record id="view_library_book_tree_readonly" model="ir.ui.view">
        <field name="name">library.book.tree.readonly</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <tree create="false" delete="false" edit="false">
                <field name="name" string="書名"/>
                <field name="author" string="作者"/>
                <field name="isbn" string="ISBN"/>
                <field name="is_borrowed" string="是否已借出"/>
            </tree>
        </field>
    </record>

    <!-- 搜尋視圖 -->
    <record id="view_library_book_search" model="ir.ui.view">
        <field name="name">library.book.search</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <search>
                <field name="name" string="書名"/>
                <field name="author" string="作者"/>
                <field name="isbn" string="ISBN"/>
                <filter string="可借閱" name="available_books" domain="[('is_borrowed', '=', False)]"/>
                <filter string="已借出" name="borrowed_books" domain="[('is_borrowed', '=', True)]"/>
            </search>
        </field>
    </record>

    <!-- 專門供讀者使用的書籍操作動作,隱藏新增按鈕 -->
    <record id="action_library_books_readonly" model="ir.actions.act_window">
        <field name="name">書籍可用性檢查</field>
        <field name="res_model">library.book</field>
        <field name="view_mode">tree</field>
        <field name="view_id" ref="view_library_book_tree_readonly"/>
        <field name="search_view_id" ref="view_library_book_search"/>
        <field name="help" type="html">
            <p>此處可以查看書籍的可用狀態,您可以根據書名、作者、ISBN進行篩選。</p>
        </field>
    </record>
</odoo>

書籍借閱功能

為了在 view_library_book_tree_readonly 中新增「借出」按鈕,首先需要確保按鈕的功能只在書籍處於「可借閱」狀態時可見,並且按下按鈕後執行書籍的借閱操作(例如修改書籍狀態和記錄借閱人信息)。這裡是具體的設計步驟。

    1. 更新書籍模型的借閱操作
      library.book 模型中已經有 action_borrow 方法。此方法應該在按鈕被觸發時執行,用來將書籍標記為「已借出」,並更新借閱人和借閱日期。
    1. 更新視圖:在列表視圖中添加「借出」按鈕
<odoo>
    <!-- 更新書籍列表視圖,添加借出按鈕 -->
    <record id="view_library_book_tree_readonly" model="ir.ui.view">
        <field name="name">library.book.tree.readonly</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <tree create="false" delete="false" edit="false">
                <field name="name" string="書名"/>
                <field name="author" string="作者"/>
                <field name="isbn" string="ISBN"/>
                <field name="is_borrowed" string="是否已借出"/>
                <!-- 添加借出按鈕 -->
                <button name="action_borrow" type="object" string="借出" class="btn-primary"
                        attrs="{'invisible': [('is_borrowed', '=', True)]}"/>
            </tree>
        </field>
    </record>
</odoo>
  • 借閱操作 (action_borrow)

action_borrow 方法應該能夠檢查書籍狀態,並在按鈕被觸發後將書籍標記為「已借出」。

from odoo import models, fields, api, exceptions
from datetime import date

class LibraryBook(models.Model):
    _name = 'library.book'
    _description = '書籍資料'

    name = fields.Char(string='書名', required=True)
    author = fields.Char(string='作者')
    isbn = fields.Char(string='ISBN')
    is_borrowed = fields.Boolean(string='是否已借出', default=False)
    borrowed_by = fields.Many2one('library.student', string='借閱學生', readonly=True)
    borrow_date = fields.Date(string='借閱日期', readonly=True)

    def action_borrow(self):
        """
        當書籍可借閱時,允許讀者借閱,並記錄借閱信息
        """
        for record in self:
            if record.is_borrowed:
                raise exceptions.UserError(f"書籍 {record.name} 已被借出,無法再次借閱。")
            
            # 檢查是否已關聯借閱學生
            if not record.borrowed_by:
                raise exceptions.UserError('請選擇借閱的學生。')

            # 更新書籍狀態為已借出,並記錄借閱日期
            record.is_borrowed = True
            record.borrow_date = date.today()
            
            # 生成消息記錄
            record.message_post(body=f"書籍 {record.name} 已於 {record.borrow_date} 被學生 {record.borrowed_by.name} 借閱。")

本章結語

從管理面延伸到使用者操作層面

在本章中,我們探討了從管理層面的系統設計到具體使用者操作層面的功能實現過程。管理層的設計重點在於確保系統架構的完整性和可擴展性,從資料的存儲、狀態追蹤。

然而,僅有管理功能並不足夠,系統最終的目標是為使用者提供直觀且易於操作的介面與流程。在使用者操作層面,我們通過簡化操作邏輯、設計友好的使用者介面,來提升使用者的體驗。

在下一章節中,使用者不僅能夠查看書籍的可用性,還能夠通過簡單的操作完成書籍的預約與借閱,這些功能的實現正是系統管理層與使用者層結合的體現。


上一篇
Day9:個案一:學校圖書管理(5)-學生借閱,使用ChatGPT協助邏輯思考
下一篇
Day11:個案一:學校圖書管理(7)-學生預約書藉
系列文
利用【AI】工具,聰明進行 Odoo 程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言