zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Leetcode 92. Reverse Linked List II
    Leetcode 206. Reverse Linked List
    Leetcode 763. Partition Labels
    Leetcode 746. Min Cost Climbing Stairs
    Leetcode 759. Employee Free Time
    Leetcode 763. Partition Labels
    搭建数据仓库第09篇:物理建模
    Python进阶篇:Socket多线程
    Python进阶篇:文件系统的操作
    搭建数据仓库第08篇:逻辑建模–5–维度建模核心之一致性维度2
  • 原文地址:https://www.cnblogs.com/ljwTiey/p/11474835.html
Copyright © 2011-2022 走看看