2015-02-06 1 views
2

이전 API 함수 필드를 재정의하려고합니다. 여기에서 변경해야 할 무엇Odoo 새 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)가있다.

나는 소스에서이 작업을 수행하는 경우 :

_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) 
    } 

아무런 반응이 없습니다. 필드 parent_root_id 또는 is_branch이 수정되면 display_name 필드가 계산되지 않습니다.

새로운 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

새 필드 (구현 됨)가 설정되면 ('is_branch','parent_root_id')'display_name'을 변경하는 새로운'name_get' 메소드를 다시 구현했습니다. 그래서 파트너가 branch이고'parent_root_id' (메인 파트너라고도 함)를 가지고 있다면'Main Company/Branch Company'와 같은 이름을 표시합니다. 문제는 새로운 필드가 변경되면 업데이트를 트리거하지 않기 때문에'name' 필드가 쓰기에서 변경된 경우에만 업데이트된다는 것입니다. 따라서'display_name'은해야 할 때 업데이트되지 않습니다. '_display_name_store_triggers'에서 트리거 될 필요가있는 필드를 추가하면 작동하지만, 소스에서만 수행 할 경우에만 – Andrius