1. 程式人生 > >odoo12從零開始:二、個性化定製odoo12 之 建立資料庫頁面

odoo12從零開始:二、個性化定製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效果

宣告

轉載請註明出處,文章如有雷同或者侵權,請聯絡刪除。

有任何問題,聯絡郵箱:26476395@qq