• odoo12从零开始:二、1)个性化定制odoo12之修改数据库创建页面


    剧情回顾

    上一文章,我们已经成功运行了odoo12,并访问localhost:8069看到如下界面:

    我们还没有创建数据库,但是我们发现,数据库管理页面的logo是odoo,数据库页面全是英文的,对于我们国内用户来说,这是不太友好的。我们想要自定义这个数据库页面,有没有办法?答案是肯定的。

    本节代码

    git clone -b v2.1 https://github.com/lingjiawen/odoo_project.git

    探索数据库页面

          我们在Chrome浏览器右键检查odoo的logo,发现它的url是"/web/static/src/img/logo2.png",也就是说,它处于web模块下的static目录,我们在odoo12/addons中找到web模块static/src/img下的logo2.png文件,确认一下,果然是这个logo。再在web模块下搜索logo2.png,发现引用文件是web/views里面的database_manager.html,发现这个文件也就是我们上面看到数据库管理页面

          我们直接替换这个logo或者直接更改database_manager.html是否可以替换掉原生logo或者其他信息呢?答案是可以的,但是odoo的开源协议并不允许我们这么做。

      我们继续在web模块下搜索database_manager.html,发现在controllers/main.py文件下Database类中的_render_template方法便是对数据库管理页面进行渲染。

      那么我们要如何对这个页面进行修改呢?

      有经验的朋友可能会说,我们写一个模块,在controller中继承这个Database类,重写_render_template方法,就可以实现这个对页面的重写。

      这个方法在数据库完成创建并安装所写模块后,是可以生效的!我们对登录界面等的重写也将采用继承修改的办法。但是,在第一次运行odoo时,还没有任何的数据库,也不可能安装任何的模块,所以此时这种方法是行不通的。那我们要怎么做呢?这就涉及到python运行时动态改变类的方法——猴子补丁(Monkey Patch)

    猴子补丁(Monkey Patch)

    简要介绍一下:

    class A:
        def func(self):
            print('A')
    
    def monkey(self):
        print('B')
    
    a = A()
    A.func = monkey  # a已经创建了实例,在运行时对对象的方法进行修改
    a.func() # 运行结果:B

    上述便是monkey patch的基本概念,如果您有兴趣,可以自行学习深入了解。现在我们用这个方法对我们的数据库页面进行修改。

    创建模块,在运行时替换数据库页面渲染方法

    我们先在主目录下新建my_addons目录,在my_addons目录下新建一个模块base_customize,将web下的数据库html复制到template下,在staic/src/img中放入需要替换的favicon.ico和logo2。细心的朋友可能会注意到下面的init和manifest文件,现在先不用管它,没有也不影响。

    紧接着在主目录下新建core目录,新建patch目录和其目录下的database.py文件和__init__.py文件

    database.py

     1 # -*- coding: utf-8 -*-
     2 import os
     3 import jinja2
     4 import odoo
     5 
     6 from odoo import http
     7 from odoo.addons.web import controllers
     8 
     9 os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
    10 
    11 # 更改数据库页面,env环境更改为'my_addons/base_customize/template'
    12 path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..', 'my_addons/base_customize/template'))
    13 loader = jinja2.FileSystemLoader(path)
    14 env = jinja2.Environment(loader=loader, autoescape=True)
    15 
    16 
    17 db_monodb = http.db_monodb
    18 DBNAME_PATTERN = '^[a-zA-Z0-9][a-zA-Z0-9_.-]+$'
    19 
    20 
    21 def _render_template(self, **d):
    22     d.setdefault('manage', True)
    23     d['insecure'] = odoo.tools.config.verify_admin_password('admin')
    24     d['list_db'] = odoo.tools.config['list_db']
    25     d['langs'] = odoo.service.db.exp_list_lang()
    26     d['countries'] = odoo.service.db.exp_list_countries()
    27     d['pattern'] = DBNAME_PATTERN
    28     # databases list
    29     d['databases'] = []
    30     try:
    31         d['databases'] = http.db_list()
    32         d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
    33     except odoo.exceptions.AccessDenied:
    34         monodb = db_monodb()
    35         if monodb:
    36             d['databases'] = [monodb]
    37     return env.get_template("database_manager.html").render(d)
    38 
    39 
    40 def patch_database():
    41     controllers.main.Database._render_template = _render_template

    我们将_render_template重写,只修改了env的指定环境为my_addons/base_customize/template,这样数据库管理页面就更改成了指定环境下的database_manager.html文件

    patch_database方法运行时修改Database._render_template方法为我们重新定义的方法。

    然后在同级__init__.py中引入patch_database文件

    # -*- coding: utf-8 -*-
    
    from core.patch.database import patch_database
    
    
    def monkey_patch():
        patch_database()

    最后,我们修改主目录下的运行文件set-up.py

    #!/usr/bin/env python3
    
    # set server timezone in UTC before time module imported
    import os
    import sys
    __import__('os').environ['TZ'] = 'UTC'
    
    LIB_PATH = os.path.join(os.path.split(os.path.realpath(__file__))[0], '.', 'odoo12')
    sys.path.append(LIB_PATH)
    
    import odoo
    if __name__ == "__main__":
        from odoo.modules.module import (
            load_openerp_module,
        )
        load_openerp_module('web')
    
        from core import patch
        patch.monkey_patch()
    
        odoo.cli.main()

    代码大意: 预加载web模块,引入core/patch,调用monkey_patch方法进行运行时替换

    最后,我们修改my_addons/base_customize/template下的html文件,重启服务器即修改成功。

     图片内的修改内容:
    1、左上角title改为odoo12 customize
    2、修改了logo2
    3、修改英文为中文
    4、修改了默认语言为中文,默认国家为中国
    其他更多修改均可在html内直接完成,快动手尝试一下吧!

    项目启动日志patch

    最后,与patch同级还有一个__init__文件,内容如下:

    # -*- coding: utf-8 -*-
    
    
    def init_patch():
        print('''
        use odoo12 customize installation designed by misterling.
        ''')

    #!/usr/bin/env python3
    
    # set server timezone in UTC before time module imported
    import os
    import sys
    __import__('os').environ['TZ'] = 'UTC'
    
    LIB_PATH = os.path.join(os.path.split(os.path.realpath(__file__))[0], '.', 'odoo12')
    sys.path.append(LIB_PATH)
    
    import odoo
    from core import init_patch
    
    if __name__ == "__main__":
        init_patch()
        from odoo.modules.module import (
            load_openerp_module,
        )
        load_openerp_module('web')
    
        from core import patch
        patch.monkey_patch()
    
        odoo.cli.main()

    再次修改set-up.py,引入并运行init_patch,重启服务器,你可以看到patch效果

    声明

    转载请注明出处,文章如有雷同(不大可能吧hh)或者侵权,请联系删除。

    有任何问题,联系邮箱:26476395@qq.com

  • 相关阅读:
    MySQL5.7 容器化安装
    什么是架构?——软件系统架构的定义
    服务端高并发分布式架构演进之路(转)
    CentOS7 增加回环地址
    三句话看明白jdk收费吗
    【转载】C#里怎么把string类型转换成double
    【转载】如何查看自己网站的搜索引擎收录量和索引量
    【转载】c# datatable 判断值是否存在
    【转载】C#中Datatable修改列名
    【转载】C#使用typeof运算符获取对象变量的具体类型Type
  • 原文地址:https://www.cnblogs.com/ljwTiey/p/11474835.html
Copyright © 2020-2023  润新知