2015-02-06 2 views
2

Я пытаюсь переопределить старое поле функций 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. Каков подход?

ответ

3

Попробуйте следующее:

@api.one 
@api.depends('parent_id','is_company','name') 
def _display_name(self): 
    for partner in self: 
     <<operation on context... you need to check yourself>> 
     <<you will have to check how name_get is called and based on 
      the return value set the value as shown below>> 
     partner.display_name = <<returned value from name_get>> 

display_name = fields.Char(compute="_display_name",string="Display Name") 
+0

я уже пробовал подобный подход. Проблема с этим, это не сохраняет ценность в базе данных, даже если вы добавите 'store = True' в поле функции. Похоже, что он все еще использует старое функциональное поле и игнорирует эту реализацию. Также в вашем примере вы используете 'api.one', но итерацию, как будто это мульти. Не следует ли получить доступ непосредственно от 'self'? Потому что его одна запись. – Andrius

+0

Итерация на себя не имеет значения, так как это набор записей. Да, я забыл добавить 'store = True'. Если я получу шанс, я проверю это. Но можете ли вы сказать мне, почему вы хотите реализовать в новом api? –

+0

Я переопределил новый метод 'name_get', который изменяет' display_name', если установлены новые поля (I реализованы) ('is_branch',' parent_root_id'). Итак, если партнер является филиалом и имеет 'parent_root_id' (он же главный партнер), он будет отображать имя, подобное этой« Основной компании/Филиалу ». Проблема в том, что она обновляется только в том случае, если поле «имя» изменяется при записи, поскольку оно не вызывает обновление при изменении новых полей. Поэтому 'display_name' не обновляется, когда это необходимо. Если я добавлю те поля, которые должны быть запущены в '_display_name_store_triggers', то это работает, но только если я сделаю это в источнике – Andrius