2013-03-05 2 views
1

광고 항목의 속성을 기반으로 구매 주문을 필터링하려고합니다. 예를 들어 product_type = 'X'인 광고 항목이있는 모든 구매 주문을보고 싶습니다.광고 항목 속성의 openerp 도메인 필터

<record id="po_x" model="ir.actions.act_window"> 
     <field name="name">X Purchase Orders</field> 
     <field name="type">ir.actions.act_window</field> 
     <field name="res_model">purchase.order</field> 
     <field name="view_type">form</field> 
     <field name="view_mode">tree,form,calendar,graph,gantt</field> 
     <field name="domain">[('has_x_line','=',True)]</field> 
     <field name="context">{}</field> 
    </record> 

product_type은 주문 행의 상속 된 버전에 추가 한 맞춤 입력란입니다.

class purchase_order_custom(osv.osv): 
    _name = 'purchase.order' 
    _inherit = 'purchase.order' 

    def linehasproducttype(self, cr, uid, ids, name, arg, context=None): 
     cur_obj={} 
     cur_obj=self.browse(cr, uid, ids, context=context) 
     for line in cur_obj.order_line: 
      if line.product_type == 'X': 
       return True 
     return False 

    _columns={ 
      'has_x_line': fields.function(linehasproducttype, string="Has X Line", type='boolean', context={'pt':'X'}) 
       } 
purchase_order_custom() 

2 질문 :

Q1. 위의 코드가 작동하지 않습니다. 즉, 실제로 원하는대로 필터링하지 않습니다. 무엇이 잘못 될 수 있습니까?

2. 나는 많은 제품 유형이 있고 나는 각 유형을위한 기능을 만드는 경향이 없다. 어떻게 든 논증을 전달하거나 내가하려는 것처럼이 목적을 위해 컨텍스트를 사용할 수 있습니까? 그렇다면 코드에서 어떻게 사용합니까?

덕분에

편집는 :

def linehasproducttype(self, cr, uid, ids, name, arg, context=None): 
    res = dict.fromkeys(ids, False) 
    for cur_obj in self.browse(cr, uid, ids, context=context): 
     res[cur_obj.id] = False 
     for line in cur_obj.order_line: 
      if line.product_type == 'X': 
       res[cur_obj.id] = True 
    return res 

답변

2

당신이 일 가능성이 코드에서 두 가지 문제가있다 :

이 코드가 구성되면 나는 또한 행운 다음과 같은 코드를 시도 OpenERP 6.1 이전 버전에서 실행하려면 필드 정의에 "method"인수를 제공하고 true로 설정해야합니다. 그렇지 않으면 메소드가 발견되지 않습니다.

귀하의 기능이 일반적이지 않습니다. 귀하의 함수에 제공된 ID를 "ID"매개 변수로 키로 사용하여 사전을 반환해야합니다. OpenERP 코어에 전달하는 거의 모든 기능은 단일 레코드가 아닌 일련의 레코드에서 작업해야한다는 것을 기억해야합니다. 예제의 핵심 코드를 살펴보십시오.

두 번째 질문에 대해서는 언제든지보기 XML에서 add data to the context을 사용할 수 있으며 이러한보기를 처리하는 코드에서 사용할 수 있습니다. 이는 모든 제품 유형에 대해 고유 한보기가있는 경우에만 작동합니다.

또 다른 가능성은 모든 제품에 대한 일반 트리보기를 정의하고 원하는 제품 만 표시하는 필터를 정의하는 것입니다. developer book describes하는 방법.

편집 :

<field name="domain">[('order_line.product_type','=','X')]</field> 
+0

감사합니다 : 당신은 단지 당신의 행동이나 필터에서 다음과 같이 도메인 표현을 사용할 수 있어야합니다. 1. has_x_line에 대한 fields.function 호출에서 method = True를 추가했습니다. 2. 일련의 레코드 작업에 관해서, self.browse가 나에게 현재 레코드를 가져다 줄 경우가 아닌가? 3. 사전 반납을 친절하게 설명 할 수 있습니까? 중첩 된 for 루프일까요? 4. 거기에서 컨텍스트 값을 전달할 수 있도록 별도의 뷰를 갖습니다. 하지만 위의 코드 (has_x_line)가 작동하지 않는 컨텍스트 값을 전달합니까? 5. 다른 경우에는 필터가있는 일반 트리보기가 필요합니다. 이를위한 샘플 코드 링크를 가리 키십시오. 다시 한번 감사드립니다. –

+0

내가 시도한 업데이트 된 코드는 편집을 참조하십시오. –

+0

@RazaAli 추가 정보는 편집을 참조하십시오. v6.1에서 작업 하시겠습니까? 소스에 purchase_order_line.product_type 필드가 표시되지 않습니다. 당신이 필드를 추가 했습니까? 만약 필드의 유형이 무엇입니까? 그렇지 않으면 두 번째 코드 예제가 올바른 것 같습니다. – asdfsdfsdfsdfsd3232