Я пытаюсь переопределить старое поле функций api без успеха. Существует функция поля (display_name
) с вспомогательными методами:Odoo new API - переопределение старого поля функций API
def _display_name_compute(self, cr, uid, ids, name, args, context=None):
context = dict(context or {})
context.pop('show_address', None)
context.pop('show_address_only', None)
context.pop('show_email', None)
return dict(self.name_get(cr, uid, ids, context=context))
_display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs)
_display_name_store_triggers = {
'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)], context=dict(active_test=False)),
['parent_id', 'is_company', 'name'], 10)
}
'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers, select=True)
Что мне нужно изменить здесь, в display_name_store_triggers
, обновление с новыми полями, если используется, будет вызвать эту функцию для вычисления поля.
Если я делаю это в источнике:
_display_name_store_triggers = {
'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)], context=dict(active_test=False)),
['parent_id', 'is_company', 'name', 'parent_root_id', 'is_branch'], 10)
}
Затем он работает, как мне нужно. Но я не могу наследовать этот триггер и переопределить мой модуль.
Если я делаю это на моем модуле:
from openerp.addons.base.res.res_partner import res_partner as res_partner_orig
_display_name_store_triggers = res_partner_orig._display_name_store_triggers
_display_name_store_triggers = {
'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)], context=dict(active_test=False)),
['parent_id', 'is_company', 'name', 'parent_root_id', 'is_branch'], 10)
}
Ничего не происходит. display_name
Поле не вычисляется при изменении полей parent_root_id
или is_branch
.
Не удалось найти в документации, как переопределить старое поле функции с помощью нового API. Каков подход?
я уже пробовал подобный подход. Проблема с этим, это не сохраняет ценность в базе данных, даже если вы добавите 'store = True' в поле функции. Похоже, что он все еще использует старое функциональное поле и игнорирует эту реализацию. Также в вашем примере вы используете 'api.one', но итерацию, как будто это мульти. Не следует ли получить доступ непосредственно от 'self'? Потому что его одна запись. – Andrius
Итерация на себя не имеет значения, так как это набор записей. Да, я забыл добавить 'store = True'. Если я получу шанс, я проверю это. Но можете ли вы сказать мне, почему вы хотите реализовать в новом api? –
Я переопределил новый метод 'name_get', который изменяет' display_name', если установлены новые поля (I реализованы) ('is_branch',' parent_root_id'). Итак, если партнер является филиалом и имеет 'parent_root_id' (он же главный партнер), он будет отображать имя, подобное этой« Основной компании/Филиалу ». Проблема в том, что она обновляется только в том случае, если поле «имя» изменяется при записи, поскольку оно не вызывает обновление при изменении новых полей. Поэтому 'display_name' не обновляется, когда это необходимо. Если я добавлю те поля, которые должны быть запущены в '_display_name_store_triggers', то это работает, но только если я сделаю это в источнике – Andrius