Odoo новый API - переопределение старого поля функции API

Я безуспешно пытаюсь переопределить старое поле функции api. Есть это функциональное поле (display_name) со вспомогательными методами:

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. Какой подход?


person Andrius    schedule 06.02.2015    source источник


Ответы (1)


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

@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")
person Hardik Patadia    schedule 06.02.2015
comment
Я уже пробовал подобный подход. Проблема в том, что он не сохраняет значение в базе данных, даже если вы добавляете store=True в поле функции. Похоже, что он все еще использует старое функциональное поле и игнорирует эту реализацию. Также в вашем примере вы используете api.one, но повторяйте, как будто он многогранный. Разве к нему нельзя обращаться напрямую из self? Потому что это одна запись. - person Andrius; 06.02.2015
comment
Итерация по себе не имеет значения, поскольку это набор записей. Да я забыл добавить store=True. Если будет возможность, то проверю. Но можете ли вы сказать мне, почему вы хотите реализовать в новом api? - person Hardik Patadia; 06.02.2015
comment
Я повторно реализовал новый name_get метод, который изменяет display_name, если установлены новые поля (реализованные мной) (is_branch, parent_root_id). Итак, если партнер является филиалом и имеет parent_root_id (он же главный партнер), он будет отображать имя, подобное этому Main Company / Branch Company. Проблема в том, что он обновляется только в том случае, если поле name изменяется при записи, потому что оно не запускает обновление при изменении новых полей. Итак, display_name не обновляется, когда нужно. Если я добавлю те поля, которые нужно активировать в _display_name_store_triggers, тогда он будет работать, но только если я сделаю это в исходном коде - person Andrius; 06.02.2015
comment
Это странно, вы можете разместить здесь свой последний код? - person Hardik Patadia; 06.02.2015
comment
Я опубликовал в своем вопросе, как я изменил исходный код. Попытка сделать то же самое в моем собственном модуле не сработает (если я импортирую исходный класс res_partner из стандартного модуля). Вы можете увидеть мои примеры проблем с Odoo - github.com/odoo/odoo/issues/5112 - person Andrius; 06.02.2015