odoo16 自定义异常

odoo16 自定义异常

公司有个扫码的业务需求,因为工人扫码的位置距离电脑比较远,所以要求当扫码发生异常的时候要有明显的提醒,odoo内置的UserError提示的不够明显,所以需要改进

基本思路是增加一种异常类型, 然后定制对应的模板文件,看了一下odoo的源代码

修改odoo源代码是不好的做法,但是满足业务需求是第一位的,以后如果有更好的办法在重构代码吧

1 增加HxScanError

在 odoo/exceptions.py 文件中增加一种异常类型,集成UserError, 内容可用空着

class HxScanError(UserError):
    """
    add by fatux:
    浩信扫码专用, 红色背景提醒
    """

2 修改相关js

前端跟错误处理的代码基本都在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"

3 增加css样式

addons/web/static/src/core/dialog/dialog.scss

.bgc-red{
    background-color: red;
    color:yellow;
    font-size: 20px;
}

4 在业务中使用

 import odoo.exceptions
 if len(self.scanner_no) != code_length:
     raise odoo.exceptions.HxScanError("二维码长度不符合")

你可能感兴趣的:(Odoo16,odoo)