odoo开发(二)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

# -*- coding: utf-8 -*-
import os
import jinja2
import odoo

from odoo import http
from odoo.addons.web import controllers

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

# 更改数据库页面,env环境更改为'my_addons/base_customize/template'
path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..', 'my_addons/base_customize/template'))
loader = jinja2.FileSystemLoader(path)
env = jinja2.Environment(loader=loader, autoescape=True)


db_monodb = http.db_monodb
DBNAME_PATTERN = '^[a-zA-Z0-9][a-zA-Z0-9_.-]+$'


def _render_template(self, **d):
    d.setdefault('manage', True)
    d['insecure'] = odoo.tools.config.verify_admin_password('admin')
    d['list_db'] = odoo.tools.config['list_db']
    d['langs'] = odoo.service.db.exp_list_lang()
    d['countries'] = odoo.service.db.exp_list_countries()
    d['pattern'] = DBNAME_PATTERN
    # databases list
    d['databases'] = []
    try:
        d['databases'] = http.db_list()
        d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
    except odoo.exceptions.AccessDenied:
        monodb = db_monodb()
        if monodb:
            d['databases'] = [monodb]
    return env.get_template("database_manager.html").render(d)


def patch_database():
    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效果
在这里插入图片描述
转载自:https://www.cnblogs.com/ljwTiey/p/11474835.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Odoo是一种基于Python的企业资源计划(ERP)系统,它提供了众多的业务功能模块,如销售、采购、库存管理、制造、财务等,并且可以根据企业的需要进行定制开发。就Odoo开发而言,Odoo 12中文开发手册提供了很好的参考资料。 该手册分为三个部分,分别为基础篇、进阶篇以及高级篇。其中基础篇主要介绍了Odoo12开发的基本概念,如模型、视图、控制器等,还包含了Odoo的相关工具和模块包的基本使用方法,并且提供了一个基于简单示例的完整开发过程。 进阶篇则涉及到Odoo的高级开发技术,如继承、重载、QWeb模板、报表等内容。这部分内容较难,需要有一定的Python编程基础和对Odoo开发的了解。但是,如果您能掌握这些高级技术,就能够更全面、更深入地进行Odoo开发工作。 最后,高级篇主要介绍了Odoo定制开发和部署。该部分内容对于需要在专业环境中使用Odoo的企业或开发人员来说非常重要。它包含了如何使用Odoo的安装包、如何定制Odoo的安装、如何进行数据备份和恢复等内容。 总的来说,Odoo 12中文开发手册是Odoo开发工作的必备指南,无论您是新手还是专业开发人员都值得一读。 ### 回答2: Odoo12是一种全功能的开源企业资源计划(ERP)系统,旨在为企业提供一种统一的解决方案。Odoo12中文开发手册可以帮助开发人员深入了解该系统,并教授他们如何使用Python编写Odoo模块以扩展和自定义其功能,以满足企业特定的需求。 该手册从Odoo框架的体系结构和模块结构开始,介绍了如何使用XML语言创建模块,如何编写模块逻辑,以及如何使用Odoo数据模型和ORM查询语言来访问数据库。 手册介绍了Odoo中常用的模块开发技术,包括视图、表单、报表、流程等。还包括了关于Odoo web框架的详细介绍,其中包括了控制器、路由、HTTP请求和响应、Cookies等内容,这些内容对于开发Odoo的web模块非常重要。 此外,该手册还深入讲解了Odoo的安全机制以及如何为模块添加权限和角色,以及如何使用Odoo内置的安全模块进行身份验证和访问控制。 最后,手册通过讲述实际的模块开发案例以及Odoo社区模块的实现,使开发人员能够实际运用所学知识,从而更好地理解和掌握Odoo12开发技术。 总之,Odoo12中文开发手册是学习和使用Odoo12系统的必备工具,旨在帮助开发人员深入掌握Odoo开发技术,以更好地满足企业自身的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值