2012-06-25 3 views
0

crm_lead에 새 one2many를 통해 링크 된 새 모델을 추가했습니다 (crm_lead_external이라고 함).외부 리소스를 추적하는 OpenERP 모델

따라서 내 모듈에는 정의 된 crm_lead (_name = crm_lead 포함)와 crm_lead_external이라는 두 가지 모델이 정의되어 있습니다.

이 외부 모델은 파일을 추적하기 때문에 '파일 이름'필드가 있습니다.

또한이 파일 이름 필드에 고유 한 SQL 인덱스를 만들었습니다.

이 내 모듈의 일부입니다

def copy(self, cr, uid, id, default=None, context=None): 
    if not default: 
     default = {} 
    default.update({ 
     'state': 'new', 
     'filename': '', 
    }) 
    ret = super(crm_lead_external, self).copy(cr, uid, id, default, context=context) 
    #do file copy 
    return ret 

여기 의도는 외부 개체를 복제 할 수 있도록하는 것입니다 만, 파일 경로의 대상을 위해.

이제 Lead에서 복제본을 클릭하면 고유 제약 조건에 IntegrityError가 발생합니다. copy()가 호출되지 않는 특별한 이유가 있습니까?

이 논리를 copy_data()에 추가해야합니까? Myst 정말 copy()를 무시합니다. 사전에

감사합니다. 당신의 crm_lead_external 클래스 등 모든 osv 서브 클래스에 액세스 할 수 있습니다 copycopy_data :

답변

3

osv class methods있다.

복제를 클릭하면 osv.copy()이 호출됩니다. 모델에 관계형 필드가 포함되어 있고 필드에 연결된 레코드가있는 경우 osv은 연결된 레코드에 copy_data()을 호출합니다. 귀하의 경우, 모델 crm.leadcopy으로 전화하면 crm_lead_externalcopy_data()이 호출됩니다. crm_lead_external에 UNIQUE 제약 조건이 있으며 이로 인해 오류 메시지가 나타납니다.

이 문제는 두 가지 문제가있을 수 있습니다.

  1. crm_lead_external OEM 필드 값의 복사를 한 후, crm_lead_external 기록을 복사 crm.lead 모델의 copy 방법을 무시하고 해제하지 않으려면

    .

    def copy(self, cr, uid, id, default=None, context=None): 
        if default is None: 
         default = {} 
        default['o2m_field'] = [] 
        return super(<calss_name>, self).copy(cr, uid, id, default, context) 
    

    o2m 필드 레코드 복사가 중지됩니다.

  2. 우리는 그렇게 할 때마다 copy_data가 호출 모델 crm_lead_extenalcopy 메소드를 오버라이드 (override) 할 것이다, 우리는 UNIQUE 제약 물건을 해결하고 문제가 발생하지 않도록 새로운 가치를 전달합니다.

    def copy_data(self, cr, uid, id, default=None, context=None): 
        if default is None: 
         default = {} 
        default['name'] = self.browse(cr, uid, id, context=context).name or '' 
        if not context.get('copy',False): 
         new_name = _("%s (copy)")%default.get('name','') 
         default.update({'name':new_name}) 
        return super(<calss_bame>, self).copy_data(cr, uid, id, default, context) 
    

    이 예제에서는 마찬가지로이 같은 UNIQUE 제약을 피할 수 있습니다, 당신은 완벽하게 복사 된 모든 데이터를 가지고, 그래서 나는 항상 새로운 이름을 얻을 것이다 이름 끝에 복사 텍스트 추가했다.

+0

그래, 내 옵션 중 하나를 부모 (crm.lead) 사본을 재정의() 또는 자식 (crm.lead.external) copy_data()를 재정의합니다. Drat. 정보를 제공해 주셔서 감사합니다. 아직 외부 리소스를 복사 할 곳을 알지 못하기 때문에 copy_data()를 재정의하지 않을 것입니다. 따라서 메소드 1 (기본값 지우기)을 수행 한 다음 객체의 수동 사용자 정의 복사본을 수행합니다. –

0

복사 방법의 고유 필드 값만 변경하십시오. 원래 값 다음에 "COPY"를 추가하는 것과 같습니다.더 660

0

이 코드를 시도하지 애드온/제품/product.py 라인의 예 도중

당신이 할 수 있습니다 : 그래서

def copy(self,cr,uid,id,default = None,context = None): 
     print"---------Calling copy function----" 
     print default 

       return super(demo_courses, self).copy(cr, uid, id, default, context) 
+0

몇 줄을 추가하여 솔루션이 원본 질문에 대한 좋은 답변이라고 생각하는 이유를 설명해주십시오. 감사합니다. – m4rtin