2016-07-21 3 views
3

Как вызвать функцию или выполнить код только для установки модуля (не обновление)? Есть ли для этого конкретная функция?Вызвать функцию при установке модуля

Я хочу, чтобы выполнить этот код на модуле установки:

all_countries = self.env['res.country'].search([]) 
for country in all_countries: 
    _logger.error(country.name) 

ответ

4

Лучший способ сделать это с помощью файла data.

  1. Добавить файл данных в файл __openerp__
  2. Создайте файл данных с noupdate="1" флагом
    • Это указывает на то код должен быть запущен один раз, то никогда
    • Он будет работать после установки , или если модуль уже установлен, то он будет в следующий раз, когда модуль будет обновлен.
  3. Определить function элемент в файле данных, чтобы вызвать соответствующий метод Python

Вы можете посмотреть документацию here для деталей, но конечный результат будет выглядеть примерно так:

__openerp__ .py

{ 
    ... 
    'data': [ 
     ... 
     'data/data.xml', 
     ... 
    ], 
    ... 
} 

/data/data.xml

<openerp> 
    <data noupdate="1"> 
     <function model="res.country" name="method_name"/> 
    </data> 
</openerp> 

/models/country.py

from openerp import models 
import logging 
_logger = logging.getLogger(__name__) 

class ResCountry(models.Model): 
    _inherit = 'res.country' 

    @api.model 
    def method_name(self): 
     for country in self.search([]): 
      _logger.error(country.name) 
1

Я реализовал обходной путь, чтобы выполнить произвольный код при установке/удалении времени, то есть в деталях described here. В вашем случае подходящей функцией для написания кода является метод create из предлагаемого метода обхода.

+1

Код, который вы связаны лучше, если вам нужно запустить функцию во время установки ** и ** деинсталляцию , но это более чем необходимо, если код нужно запускать только один раз. Элемент [function] (https://www.odoo.com/documentation/8.0/reference/data.html#function) в файле данных в сочетании с 'noupdate =" 1 "' легко достигает желаемого эффекта. – travisw

+0

Конечно, я использовал тег 'function' и в своей практике, но, как вы заметили, он может обрабатывать только случай установки. и небольшое примечание к вашему комментарию: вариант, о котором я говорил, может обрабатывать сценарий «установить AND/OR uninstall», а не просто «install AND uninstall», поскольку вы можете опустить один из методов 'create' или' unlink', если вы не нужно. –