post_load¶
Что мы знаем из комментариев в odoo source?¶
# Call the module's post-load hook. This can done before any model or
# data has been initialized. This is ok as the post-load hook is for
# server-wide (instead of registry-specific) functionalities.
Для чего это на самом деле?¶
Для ** Обезьяньих патчей **
Пример патча обезьяны в odoo¶
from odoo import tools
def new_image_resize_images(...)
...
tools.image_resize_images = new_image_resize_images
Почему мы должны использовать `` post_load`` для применения патча обезьяны?¶
Примечание
С ОДО 12 <https://github.com/odoo/odoo/commit/8226aa1db828d2a559c7ffaa31a27ef3e5ba4d0b>`_ monkey patch может быть применен без post_load, но все же рекомендуется использовать его, чтобы быть уверенным.
Потому что иначе патч обезьяны будет применяться каждый раз, когда он будет доступен в пути аддонов. Это происходит потому, что odoo загружает файлы Python модуля, если в модуле есть статическая папка (независимо от того, установлен модуль или нет - см. Метод `` load_addons`` в http.py файл исходного кода odoo).
Как использовать post_load?¶
Вам необходимо определить функцию, доступную в файле `` __init __. Py`` модуля. Затем установите имя этой функции в качестве значения атрибута `` "post_load" `` в манифесте модуля.
Пример?¶
Конечно. Например, из модуля телеграммы.
В * __ openerp __. Py *
...
"post_load": "telegram_worker",
"pre_init_hook": None,
"post_init_hook": None,
"installable": True,
"auto_install": False,
"application": True,
}
В * __ init __. Py *
from odoo.service.server import PreforkServer
...
def telegram_worker():
# monkey patch
old_process_spawn = PreforkServer.process_spawn
def process_spawn(self):
old_process_spawn(self)
while len(self.workers_telegram) < self.telegram_population:
# only 1 telegram process we create.
self.worker_spawn(WorkerTelegram, self.workers_telegram)
PreforkServer.process_spawn = process_spawn
old_init = PreforkServer.__init__
def __init__(self, app):
old_init(self, app)
self.workers_telegram = {}
self.telegram_population = 1
PreforkServer.__init__ = __init__
Что-то еще нам нужно знать?¶
Да.
Кроме того, если вам нужно применить monkey patch перед любой другой инициализацией, модуль необходимо добавить в параметр server_wide_modules.
Другое использование post_load?¶
В случае расширения модулей pos-box (например, `` hw_escpos``), вам, вероятно, нужно использовать post_load, потому что импорт hw_escpos из вашего модуля запускает специфичную для posbox инициализацию.
Пример из модуля hw_printer_network:
В * __ манифесте __. Py *
...
"post_load": "post_load",
"pre_init_hook": None,
"post_init_hook": None,
"installable": True,
"auto_install": False,
"application": True,
}
В * __ init __. Py *
def post_load():
from . import controllers
В * controllers / hw_printer_network_controller.py *
# first reason of using post_load
from odoo.addons.hw_escpos.escpos import escpos
import odoo.addons.hw_escpos.controllers.main as hw_escpos_main
...
# second reason - monkey patch:
driver = UpdatedEscposDriver()
hw_escpos_main.driver = driver