剧情回顾

上一文章,我们已经成功运行了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. markdown常用方法

    Markdown格式的普及流行要归功于Github和StackOverflow的流行,随着它们越来越流行,它们支持的Markdown格式也越来越流行. 1.优点 1.Markdown通过内容和样式相分 ...

  2. Java连接MySQL8.0以上版本数据库方式

    MySQL 8.0 开始数据库相比常用的 5.X 版本发生了比较大的变化,我们在连接数据库的过程中许多地方也要发生一些变化. 总结一下,想要利用 mysql-connector-java 与 MySQ ...

  3. angularjs的input防抖

    在开发中,遇到一个这样的需求,使用$scope.$watch()方法监听input值的改变,然后去$resource请求,但是请求过于频繁,需要做逻辑调整.代码如下: var timeout; $sc ...

  4. TCP拥塞算法瓶颈及TCP加速器解决方案

    TCP拥塞算法详解    ps:详解TCP拥塞算法就是为了说明瓶颈所在.   先解释一下概念: 拥塞:对网络中某一资源的需求超出了该资源所能提供的可用部分 拥塞窗口:以字节为单位,表示能通过的数据报的 ...

  5. 表单与v-model

    基本用法 vue.js提供了v-model指令,用于在表单类元素上双向绑定数据,例如在输入框上使用,输入的内容会实时映射到绑定的数据上 example1:修改input框内容,message会实时渲染 ...

  6. .net持续集成测试篇之Nunit文件断言、字符串断言及集合断言

    使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则等 ...

  7. (13)ASP.NET Core 中的选项模式(Options)

    1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...

  8. selenium操作cookies实现免密登录,自动发微博

    一直想用selenium实现个小功能,比如发微博之类的,但是有的网站在登录会有验证码,没想到太好的方法解决,于是想到利用cookies来登录网站 第一步:获取一个可用的cookies,获取的cooki ...

  9. mysql优化---订单查询优化(2):异步分页处理

    订单分页查询: 老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过20s种 public static PagedList<Map<String ...

  10. 跟着大彬读源码 - Redis 10 - 对象编码之整数集合

    [TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...