在 OpenERP (現稱 Odoo) 開發中,彈出提示窗口是常見需求。主要有三種方式,本文重點介紹最常用的 osv.except_osv 異常拋機制,並附帶國際化翻譯與變量嵌入技巧。
在模型方法中調用 raise osv.except_osv(_('Error!'), _('Error Message.')) 即可中斷執行並彈出模態對話框。參數均用 _() 包裹以支持多語言。
from openerp.tools.translate import _
from osv.osv import except_osv
def __assistant_depmanager_prove(self, cr, uid, ids, context=None):
for qjd in self.browse(cr, uid, ids, context=context):
if qjd.shenqr.user_id.id == uid:
raise osv.except_osv(_('Warning!'), _('You cannot approve your own request'))
return False
elif qjd.tians > 1:
raise osv.except_osv(_('Warning!'), _('Insufficient access days'))
return False
return True
系統會自動提取 _() 中的字符串生成 .po 翻譯文件,開發者只需提供對應語言翻譯:
#. module: qingjia #: code:addons/qingjia/qingjia.py:0 #, python-format msgid "Warning!" msgstr "提示!" #: code:addons/qingjia/qingjia.py:0 #, python-format msgid "You cannot approve your own request" msgstr "您不能審批您自己的請假單"
使用 Python 格式化字符串 %(...),變量值亦可通過 _() 翻譯:
def assistant_depmanager_proved_new(self, cr, uid, ids, context=None):
res = self.browse(cr, uid, ids, context=context)
result = res[0]
raise osv.except_osv(_('Error!'),
_('Your uid is "%s", name is "%s", state is "%s"') % (_(uid), _('Wang Xiaobo'), _(result.state)))
# 後續邏輯...
對應 .po 條目:
msgid "Your uid is \"%s\", name is \"%s\", state is \"%s\"" msgstr "你的用戶id是:'%s',姓名是:'%s',請假單狀態是:'%s'" # 狀態值本身也需翻譯 msgid "wait_prove" msgstr "待批的"
osv.except_osv 會導致事務回滾,適合業務校驗失敗場景wizard 或客戶端 notify 機制openerp.exceptions.Warning 或 ValidationError