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.

Для чего это на самом деле?

Для ** Обезьяньих патчей **

../../_images/monkey-patch.jpg

Пример патча обезьяны в 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`` модуля. Затем установите имя этой функции в качестве значения атрибута `` &quot;post_load&quot; `` в манифесте модуля.

Пример?

Конечно. Например, из модуля телеграммы.

В * __ 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