Coding

Odoo 11 ::: Fields Type에 대해 알아보자 (3)

Han Sol 2018. 4. 10. 13:07

Odoo 11 필드 타입 3


속성 필드


속성 선언하기


속성은 특별한 필드입니다 : fields.property.


class res_partner(osv.osv):
    _name = "res.partner"
    _inherit = "res.partner"
    _columns = {
                'property_product_pricelist':
                                            fields.property(
                                'product.pricelist',
                        type='many2one',
                        relation='product.pricelist',
                        string="Sale Pricelist",
                                method=True,
                                view_load=True,
                                group_name="Pricelists Properties"),
    }


다음은 이 속성에 대한 .XML 파일에 기본값을 만들어야합니다.


<record model="ir.property" id="property_product_pricelist">
    <field name="name">property_product_pricelist</field>
    <field name="fields_id" search="[('model','=','res.partner'),
      ('name','=','property_product_pricelist')]"/>
    <field name="value" eval="'product.pricelist,'+str(list0)"/>
</record>


TIP


기본값이 다른 모듈의 자원을 가리키면 다음과 같이 ref 함수를 사용할 수 있습니다 : <field name="value" eval="'product.pricelist,'+str(ref('module.data_id'))"/>


form에 속성 배치하기


폼에 속성을 추가하려면 폼에 <properties /> 태그를 넣으면됩니다. 그러면이 개체와 관련된 모든 속성 필드가 자동으로 추가됩니다. 

사용자 시스템의 권한에 따라 시스템이 추가됩니다. (일부 사용자는 특정 속성을 변경할 수 있고 다른 사용자는 그렇지 않을 수 있습니다).


특성은 group_name 속성에 따라 섹션별로 표시됩니다. (이것은 분리 자 태그처럼 클라이언트에서 렌더링됩니다).



이게 어떻게 작동합니까?


fields.property 클래스는 fields.function을 상속하며 읽기 및 쓰기 메서드를 재정의합니다. 

이 필드의 유형은 many2one이므로 양식에서 many2one 함수와 같은 속성이 표시됩니다.


그러나 속성의 값은 ir.property 클래스 / 테이블에 완전한 레코드로 저장됩니다. 

저장된 값은 각 속성이 다른 객체를 가리킬 수 있기 때문에 many2one이 아닌 형식 참조 필드입니다. 

관리 메뉴에서 등록 정보 값을 편집하는 경우 이는 유형 참조 필드로 표시됩니다.


속성을 읽을 때이 프로그램은 읽고있는 객체의 인스턴스에 연결된 속성을 제공합니다. 

이 객체에 값이 없으면 시스템에서 기본 속성을 제공합니다.


프로퍼티의 정의는 다른 필드와 마찬가지로 ir.model.fields 클래스에 저장됩니다. 

속성의 정의에서 속성으로 변경할 수있는 그룹을 추가 할 수 있습니다.



속성 또는 일반 필드 사용


새 기능을 추가하려면 속성을 일반 필드로 구현하도록 선택해야합니다. 개체를 상속하고이 개체를 확장하려면 일반 필드를 사용하십시오. 

새 속성이 객체와 관련이 없지만 외부 개념에 관련된 경우 속성을 사용합니다.


다음은 일반 필드 또는 속성 중에서 선택할 때 도움이되는 몇 가지 팁입니다.


일반 필드는 객체를 확장하여 더 많은 피쳐 또는 데이터를 추가합니다.


속성은 객체에 첨부되고 특별한 기능을 가진 개념입니다.


예 )

- 회사에 따라 동일한 부동산에 대한 다른 가치 - 필드 당 권한 관리 - 그것은 자원들 간의 연결고리입니다 (many2one)


예제1: Account Receivable


특정 파트너에 대한 기본 "Account Receivable"은 다음과 같은 이유로 인해 이 속성으로 구현됩니다.


- 이 개념은 파트너가 아닌 계정 차트와 관련된 개념이므로 파트너 폼에 표시되는 계정 속성입니다. 회계사의 경우이 필드에서 권한을 관리해야하며 파트너 객체에 적용되는 것과 동일한 권한이 아닙니다. 따라서 파트너 양식의 이 필드에만 특정 권한이 있습니다. 회계사만 파트너의 채권을 변경할 수 있습니다. - 이것은 여러 회사 필드입니다. 동일한 파트너는 사용자가 속한 회사에 따라 다른 채권값을 가질 수 있습니다. 다중 회사 시스템에는 회사 당 하나의 계정 차트가 있습니다. 파트너의 계정 채권은 판매 주문을 한 회사에 따라 다릅니다. - 기본 계정 채권은 모든 파트너에 대해 동일하며 일반 속성 메뉴 (관리)에서 구성됩니다.


TIP


한 가지 재미있는 점은 속성이 "스파게티"코드를 피하는 것입니다. 

계정 모듈은 파트너 (base) 모듈에 따라 다릅니다. 하지만 회계 모듈없이 파트너 (base) 모듈을 설치할 수 있습니다. 

파트너 개체의 계정을 가리키는 필드를 추가하면 두 개체가 서로 종속됩니다. 

유지 보수 및 코드 작성이 훨씬 어렵습니다 (예 : 두 테이블이 서로 가리키는 경우 테이블 제거를 시도).



- 예제 2: Product Times



제품 만료 모듈은 제품과 관련된 모든 지연을 제거 날짜, 제품 시간등등을 구현합니다.이 모듈은 식품 산업에 매우 유용합니다.


이 모듈은 product.product 객체를 상속 받아 새 필드를 추가합니다.


class product_product(osv.osv):

    _inherit = 'product.product'
    _name = 'product.product'
    _columns = {

        'life_time': fields.integer('Product lifetime'),
        'use_time': fields.integer('Product usetime'),
        'removal_time': fields.integer('Product removal time'),
        'alert_time': fields.integer('Product alert time'),
        }

product_product()


이 모듈은 product.product 객체에 간단한 필드를 추가합니다. 속성을 사용하지 않았습니다. 

이유는 다음과 같습니다.


우리는 제품을 확장하고 life_time 필드는 제품과 관련된 개념이며 다른 객체에는 관련되지 않습니다. 우리는 필드 당 올바른 관리가 필요하지 않으며, 다른 지연은 모든 제품을 관리하는 동일한 사람들이 관리합니다.