odoo禁用debug模式

odoo除了管理员可以在页面上打开debug模式,普通用户也可以通过在url上添加参数的形式打开,例如

“web?debug=1 或 ?debug=true 或 ?debug=xxx”…

那接下来就来解决这个问题。

通过url方式,无非就是 controller嘛, 考虑到通用性,我直接写成一个模块,兼容12、13两大目前主流版本。
我的目录结构
我的模块结构如上图。
res_config_setting.py

# -*- coding: utf-8 -*-

from odoo import fields, models


class ResConfigSettings(models.TransientModel):
    _inherit = 'res.config.settings'

    debug_permission = fields.Boolean(string='Debug权限',
                                      config_parameter='debug_permission')

继承了 res.config.settings(只能瞬态),只有一个布尔字段。接着是视图:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="res_config_settings_view_form" model="ir.ui.view">
        <field name="name">res.config.settings.view.form.inherit.debug_permission</field>
        <field name="model">res.config.settings</field>
        <field name="priority" eval="100"/>
        <field name="inherit_id" ref="base.res_config_settings_view_form"/>
        <field name="arch" type="xml">
            <xpath expr="//div[@data-key='general_settings']" position="inside">
                <h2>Debug调试权限</h2>
                <div class="row mt16 o_settings_container">
                    <div class="col-12 col-lg-6 o_setting_box">
                        <div class="o_setting_left_pane">
                            <field name="debug_permission"/>
                        </div>
                        <div class="o_setting_right_pane">
                            <div class="text-muted">
                                禁用普通用户Debug
                            </div>
                        </div>
                    </div>
                </div>
            </xpath>
        </field>
    </record>
</odoo>

直接继承了设置页面,效果是这样的:
在这里插入图片描述
当然,别忘了在 manifest.py 中添加依赖: ‘depends’: [‘base’, ‘base_setup’],

前两步主要是起到管理员页面设置的效果。接下来才是核心:

# -*- coding: utf-8 -*-
import odoo
from odoo import http
from odoo.addons.web.controllers.main import Home, ensure_db, redirect_with_hash
from odoo.http import request


class DebugHome(Home, http.Controller):
    # http://localhost:8069/web?debug    web?debug=1      web?debug=true    web?debug=xxx
    @http.route('/web', type='http', auth="none")
    def web_client(self, s_action=None, **kw):
        version = odoo.release.version.split('.')[0]
        ensure_db()
        if kw.get('debug') == "**" or kw.get('debug') == "" or kw.get('debug'):
            if request.env['ir.config_parameter'].sudo().get_param('debug_permission'):
                if not request.env.user.browse(request.session.uid)._is_admin():
                    if version == '12':
                        # print('当前版本为::', version)
                        return redirect_with_hash('/web')
                    if version == '13':
                        # print('当前版本为::', version)
                        return redirect_with_hash('/web?debug=0')
        return super().web_client(s_action=s_action, **kw)

这里直接拦截 http://localhost:8069/web, 抓取参数并判断当前版本,做相应的处理,先判断是否配置了前面的设置参数,如果是,那么非管理员(具有odoo设置权限的)的用户直接重定向。
其它基础问题自行百度,本文只讲重点。
完整代码:
网盘链接
提取码:tcje

猜你喜欢

转载自blog.csdn.net/weixin_43274097/article/details/107641408