作為一名讀者,我希望能在登入後查看書籍的可用性,並能在線預約或借閱書籍,以確保我能取得想要的書籍。
進行下列二個邏輯項次的開發
重點說明,相關細節可參考
https://github.com/kulius/odoo17_ithelp
要實現書籍可用性檢查的功能,首先需要在 Odoo 中產生一個專門的 library.book
搜尋視圖(View),該視圖不允許新增書籍,只允許查看書籍是否可借閱。這裡是具體的設計步驟:
library.book
library.book
模型,因為之前已經有了 is_borrowed
字段,該字段用來標記書籍的借出狀態。我們將為 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
中新增「借出」按鈕,首先需要確保按鈕的功能只在書籍處於「可借閱」狀態時可見,並且按下按鈕後執行書籍的借閱操作(例如修改書籍狀態和記錄借閱人信息)。這裡是具體的設計步驟。
library.book
模型中已經有 action_borrow
方法。此方法應該在按鈕被觸發時執行,用來將書籍標記為「已借出」,並更新借閱人和借閱日期。<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} 借閱。")
在本章中,我們探討了從管理層面的系統設計到具體使用者操作層面的功能實現過程。管理層的設計重點在於確保系統架構的完整性和可擴展性,從資料的存儲、狀態追蹤。
然而,僅有管理功能並不足夠,系統最終的目標是為使用者提供直觀且易於操作的介面與流程。在使用者操作層面,我們通過簡化操作邏輯、設計友好的使用者介面,來提升使用者的體驗。
在下一章節中,使用者不僅能夠查看書籍的可用性,還能夠通過簡單的操作完成書籍的預約與借閱,這些功能的實現正是系統管理層與使用者層結合的體現。