python odoo框架之新增 「待審核」訂單狀態
來自專欄 一隻爬蟲的轉行之路
參考文檔:openerp學習筆記 視圖繼承(tree、form、search)
實現最終的效果:
從日常生活的場景出發就是:
有人和你借錢,你先確定一下金額,再借給他的這麼一個過程。這裡增加的小功能,也就是雙方先確定下金額態度 的一個狀態。
從odoo框架的業務的工作流去理解:
在draft(新建訂單)——router(訂單中間狀態)的節點裡,新增加一個狀態「waiting-approval」(待審核)的這麼一個節點。其他功能正常運行。
思路:
1)首先通過繼承 添加一個新的狀態 waitingapproval
2)實現從draft——waitingapproval狀態
3)實現不影響其他節點,從 waitingapproval狀態——「確認訂單 」按鈕的 功能
註:
第三步 浪費了較多的時間,原來思考是重寫waiting的狀態方法,會破壞原先的所有功能結構,方法行不得,既然在不影響其他任何功能的前提下,就直接在 waiting跳轉 到「確認訂單」時,用replace去替換覆蓋原先的所有功能。
(以上是今天工作的思考部分,其實也浪費了不少時間,依舊是記錄思考問題的過程,代碼反而超級簡單)
代碼部分:
No1:增添一個新的狀態 waitingapproval
class SaleInherit(models.Model): _inherit = sale.order state = fields.Selection(selection_add=[(waitingapproval,u待審核)])
這是odoo11.0的寫法,真的很簡潔。
(以下順帶記錄下odoo8.0的寫法)
class SaleInherit(osv.Model): _inherit = sale.order _columns = { date_approve: fields.datetime(u審批日期, readonly=True, select=True, copy=False), state: fields.selection([(draft, Draft Quotation), (sent, Quotation Sent), (cancel, Cancelled), (waiting_date, Waiting Schedule), (waitingapproval, u待批准), # 新增 (progress, Sales Order), (manual, Sale to Invoice), (shipping_except, Shipping Exception), (invoice_except, Invoice Exception), (done, Done)], required=True, track_visibility=onchange), }
哈哈,odoo8.0的代碼量還是很經典的。
新增加完state後,記得繼承視圖。
<?xml version="1.0" encoding="utf-8"?><odoo> <record id="view_sale_order_approval_inherit" model="ir.ui.view"> <field name="name">View.Sale.Order.Approval.inherit</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/># form視圖 <field name="arch" type="xml"> #xpath定位,# button按鈕執行方法 <xpath expr="//button[@name=print_quotation]" position="after"> <button name="action_waitingapproval" states="draft,sent,sale" string="批准訂單" type="object"/> </xpath> </field> </record></odoo>
NO2:實現從draft——waitingapproval
這部分的功能就是
<button name="action_waitingapproval" states="draft,sent,sale" string="批准訂單" type="object"/>
的 button 出發函數 action_waitingapproval來實現。
@api.multi def action_waitingapproval(self): # 1)跳轉到待審核狀態, 2)『so』開頭的訂單才可以進入待審核狀態 if self.name[:2] == SO: self.write({state:waitingapproval}) return True else: return self.write({state: sale})
writer 方法,相當於資料庫里的uodate更新操作
獲取「SO」開頭 的訂單,直接self.name就獲取到了name的值
[:2]代表獲取前2位字元串
No3:從waitingapproval——「確認 訂單 "狀態
繼承視圖裡 ,直接用replace方法
<xpath expr="//button[@name=action_confirm]" position="replace"> <button name="action_confirm" states="waitingapproval" type = "object" string = "確認訂單" class = "oe_hightlight"/> </xpath>
「action_confirm「執行的函數就是」確認訂單「的狀態。
有瑕疵,因為我的xpath定位的不準,只能定位到第一個元素,其實真正需要定位的replace的是第二個action_confirm的方法。
推薦閱讀: