公司有个扫码的业务需求,因为工人扫码的位置距离电脑比较远,所以要求当扫码发生异常的时候要有明显的提醒,odoo内置的UserError提示的不够明显,所以需要改进
基本思路是增加一种异常类型, 然后定制对应的模板文件,看了一下odoo的源代码
(修改odoo源代码是不好的做法,但是满足业务需求是第一位的,以后如果有更好的办法在重构代码吧)
在 odoo/exceptions.py 文件中增加一种异常类型,集成UserError, 内容可用空着
class HxScanError(UserError):
"""
add by fatux:
浩信扫码专用, 红色背景提醒
"""
前端跟错误处理的代码基本都在addons/web/static/src/core/errors这个目录中:
addons/web/static/src/core/errors/error_dialogs.js
在这里增加一个对话框的组件HxScanDialog
export class HxScanDialog extends Component {
setup() {
this.title = this.inferTitle();
this.bodyClass='bgc-red';
const { data, message } = this.props;
if (data && data.arguments && data.arguments.length > 0) {
this.message = data.arguments[0];
} else {
this.message = message;
}
}
inferTitle() {
if (this.props.exceptionName && odooExceptionTitleMap.has(this.props.exceptionName)) {
return odooExceptionTitleMap.get(this.props.exceptionName).toString();
}
return this.props.title || this.env._t("Odoo Warning");
}
}
HxScanDialog.template = "web.WarningDialog";
HxScanDialog.components = { Dialog };
// 在文件最后,一定要注册 .add("odoo.exceptions.HxScanError", HxScanDialog)
// 这句是关键,通过这句, HxScanError异常就和 HxScanDialog建立联系了。
registry
.category("error_dialogs")
.add("odoo.exceptions.AccessDenied", WarningDialog)
.add("odoo.exceptions.AccessError", WarningDialog)
.add("odoo.exceptions.MissingError", WarningDialog)
.add("odoo.exceptions.UserError", WarningDialog)
.add("odoo.exceptions.HxScanError", HxScanDialog)
.add("odoo.exceptions.ValidationError", WarningDialog)
.add("odoo.exceptions.RedirectWarning", RedirectWarningDialog)
.add("odoo.http.SessionExpiredException", SessionExpiredDialog)
.add("werkzeug.exceptions.Forbidden", SessionExpiredDialog)
.add("504", Error504Dialog);
内容基本上完全copy的WarningDialog,只是在setup函数中加了一句
this.bodyClass='bgc-red';
然后修改addons/web/static/src/core/errors/error_dialogs.xml 中的web.WarningDialog 模板
<t t-name="web.WarningDialog" owl="1">
<Dialog title="title" bodyClass="bodyClass">
<div role="alert" class="o_dialog_warning">
<p t-esc="message" style="white-space: pre-wrap;"/>
div>
Dialog>
t>
在原有的基础上加了一句,将body的类名传递了进来
bodyClass="bodyClass"
addons/web/static/src/core/dialog/dialog.scss
.bgc-red{
background-color: red;
color:yellow;
font-size: 20px;
}
import odoo.exceptions
if len(self.scanner_no) != code_length:
raise odoo.exceptions.HxScanError("二维码长度不符合")