剧情回顾

上一文章,我们已经成功运行了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效果

声明

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

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

odoo12从零开始:二、个性化定制odoo12 之 创建数据库页面的更多相关文章

  1. ASP.NET Core 2.2 WebApi 系列【二】使用EF CodeFirst创建数据库

    Code First模式 Code First是指"代码优先"或"代码先行". Code First模式将会基于编写的类和配置,自动创建模型和数据库. 一.准备 ...

  2. odoo12从零开始:三、1)创建你的第一个应用模型(module)

    前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...

  3. oracle10G 数据库名、实例名、ORACLE_SID 及创建数据库- hl3292转载修改(实践部分待校验)

    数据库名.实例名.数据库域名.全局数据库名.服务名 , 这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名 什么是数 ...

  4. odoo12从零开始:一、安装odoo运行环境(mac)

    写在前面: 接触odoo已经两年多了,在大学做课程设计的时候,无意间了解到odoo这个erp框架,当时的odoo在国内还默默无闻,我也不曾想过自己毕业后会从事到odoo框架的相关开发工作中来.两年多的 ...

  5. odoo12从零开始:三、2)odoo模型层

    前言 上一篇文章(创建你的第一个应用模块(module))已经大致描述了odoo的模型层(model)和视图层(view),这一篇文章,我们将系统地介绍有关于model的知识,其中包括: 1.模型的类 ...

  6. ECharts-基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表

    ECharts http://ecomfe.github.com/echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算 ...

  7. Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms

    自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,e ...

  8. 【SSO单点系列】(2):CAS4.0 登录页的个性化定制

    上一篇 [SSO单点系列](1):CAS环境的搭建介绍了CAS最简单环境的搭建,以及一个例子用来讲解CAS的一个最基础的用法. 今天主要是介绍如何对CAS登录页进行个性化定制.    一.开始 下图是 ...

  9. 使用 Gradle 对应用进行个性化定制

    啥也不说了,直接进入主题吧.本篇文章主要根据实际开发中遇到的需求,讲解使用 Gradle 对应用的不同版本进行个性化定制. 场景介绍 一般的应用基本上都有正式服和测试服,这个就不需要多说了.但是有些应 ...

随机推荐

  1. Mysql优化(出自官方文档) - 第五篇

    目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...

  2. 【iOS】iOS main() 简介

    C 语言编写的程序,其执行入口都是 main(). 用 Objective-C 语言编写的程序也是这样. main.m 中的代码如下: int main(int argc, char * argv[] ...

  3. java中map,set的简单使用

    package test2; import java.util.*; import static java.lang.System.out; public class test2 extends St ...

  4. angularjs通信以及postmessage与iframe通信

    这篇文章是用markdown工具写的,有需要的可以使用vscode打开   # angularjs 控制器.组件之间的通信 ## 一.基于事件的方式 此方式下,主要通过 angularjs 内置指令` ...

  5. Apache Flink 1.9 重大特性提前解读

    今天在 Apache Flink meetup ·北京站进行 Flink 1.9 重大新特性进行了讲解,两位讲师分别是 戴资力/杨克特,zhisheng 我也从看完了整个 1.9 特性解读的直播,预计 ...

  6. Java泛型使用的简单介绍

    目录 一. 泛型是什么 二. 使用泛型有什么好处 三. 泛型类 四. 泛型接口 五. 泛型方法 六. 限定类型变量 七. 泛型通配符 7.1 上界通配符 7.2 下界通配符 7.3 无限定通配符 八. ...

  7. UnityShader之积雪效果

    积雪效果是比较简单的,只需要计算顶点法线方向和世界向上方向之间的点乘,将得到的值与预设的阀值比较,小于阀值为0,用这个值进行插值就OK了 代码: Shader "MyShader/SnowS ...

  8. 消息中间件-activemq消息机制和持久化介绍(三)

    前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...

  9. eclipse Maven配置以及使用方法

    简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...

  10. java集合类的相关转换

    下面的的案例,基本上是以代码为主,文字的描述较少,后期有时间会继续添加. ArrayToList public void ArrayToList() { System.out.println(&quo ...