Odoo 11 필드 타입 2


관계형 타입



one2one

- one2one 필드는 두 객체간의 하나의 관계를 표현합니다. [사용되지 않습니다. many2one을 대신 사용합니다.] 


fields.one2one('other.object.name', 'Field Name')


 many2one

- 여러개를 하나에 연결한다는 의미입니다.


fields.many2one(
        'other.object.name',
        'Field Name',
        optional parameters)


Optional parameters


ondelete : 이 필드가 가리키는 자원이 삭제되면 어떻게 될 것인가.

미리 정의 된 값 : "cascade", "set null", "restrict", "no action", "default"

기본값 : "set null"


required : True


readonly : True


select : True - (외래 키 필드에 색인 생성)



예 )

'commercial': fields.many2one(
        'res.users',
        'Commercial',
        ondelete='cascade'),



one2many

 하나에 여러개를 연결한다는 의미입니다.


fields.one2many(
        'other.object.name',
        'Field relation id',
        'Fieldname',
        optional parameter)


Optional parameters


invisible: True / False


states:?


readonly: True / False



예 )

'address': fields.one2many(
        'res.partner.address',
        'partner_id',
        'Contacts'),



many2many

 여러개를 여러개에 연결한다는 의미입니다.


fields.many2many('other.object.name',
                 'relation object',
                 'actual.object.id',
                 'other.object.id',
                 'Field Name')


TIP


other.object.name은 관계에 속한 다른 객체입니다.


관계 객체는 링크를 만드는 테이블입니다.


actual.object.id 및 other.object.id는 관계 테이블에서 사용되는 필드의 이름입니다.



예 )

'category_ids':
   fields.many2many(
    'res.partner.category',
    'res_partner_category_rel',
    'partner_id',
    'category_id',
    'Categories'),


그것을 양방향으로 만들려면 => 다른 객체에 필드를 생성하십시오.


예 )

class other_object_name2(osv.osv):
    _inherit = 'other.object.name'
    _columns = {
        'other_fields': fields.many2many(
            'actual.object.name',
            'relation object',
            'actual.object.id',
            'other.object.id',
            'Other Field Name'),
    }
other_object_name2()


예 )

class res_partner_category2(osv.osv):
    _inherit = 'res.partner.category'
    _columns = {
        'partner_ids': fields.many2many(
            'res.partner',
            'res_partner_category_rel',
            'category_id',
            'partner_id',
            'Partners'),
    }
res_partner_category2()



related

 때로는 관계의 관계를 참조해야합니다. 예를들어 City > State > Country라는 객체가 있다고 가정하고 City에서 Country를 참조해야하는 경우 City 객체에서 아래와 같이 필드를 정의할 수 있습니다.


'country_id': fields.related(
    'state_id',
    'country_id',
    type="many2one",
    relation="res.country",
    string="Country",
    store=False)


TIP


other.object.name은 관계에 속한 다른 객체입니다.


관계 객체는 링크를 만드는 테이블입니다.


actual.object.id 및 other.object.id는 관계 테이블에서 사용되는 필드의 이름입니다.



Functional Fields

 함수 필드는 값이 함수에 의해 계산되는 필드 입니다. (데이터베이스에 저장되는것이 아닙니다.)


매개변수 종류 )

fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type="float", fnct_search=None, obj=None, method=False, store=False, multi=False



- fnct는 필드 값을 계산하는 함수 또는 메소드입니다. 기능 필드를 선언하기 전에 선언되어 있어야합니다.


fnct Prameter


method가 True이면 메소드의 서명은 다음과 같아야합니다.


def fnct(self, cr, uid, ids, field_name, arg, context):


그렇지 않으면 (전역 함수 인 경우) 서명은 다음과 같아야합니다.


def fnct(cr, table, ids, field_name, arg, context):


어느 쪽이든 {{id'_1_ ': value'_1_', id'_2_ ': value'_2 _', ...} 형식의 값 사전을 리턴해야합니다.


반환 된 딕셔너리의 값은 필드 선언의 type 인수로 지정된 유형이어야합니다.


multi가 설정된 경우 field_name은 field_names로 대체됩니다. 이것은 계산해야 할 필드 이름의 목록입니다. 

반환 된 사전의 각 값은 필드 이름에서 값까지의 사전이기도합니다.

예를 들어 'name'및 'age'필드가 모두 vital_statistics 함수를 기반으로하고 ids가 [1, 2, 5] 인 경우 vital_statistics의 반환 값은 다음과 같을 수 있습니다.


{
    1: {'name': 'Bob', 'age': 23},
    2: {'name': 'Sally', 'age', 19},
    5: {'name': 'Ed', 'age': 62}
}



- fnct_inv는 해당 필드에 값을 쓸 수있게 해주는 함수 또는 메서드입니다.


fnct_inv Prameter


method가 true 인 경우 메서드의 시그니처는 다음과 같아야합니다.


def fnct(self, cr, uid, ids, field_name, field_value, arg, context):


그렇지 않으면 (전역 함수 인 경우) 다음과 같아야합니다.


def fnct(cr, table, ids, field_name, field_value, arg, context):



- type은 함수가 반환 한 필드 유형 이름입니다. 함수를 제외하고 모든 필드 유형 이름이 될 수 있습니다.



- fnct_search를 사용하면 해당 필드에서 검색 동작을 정의 할 수 있습니다.


fnct_search Prameter


method가 true 인 경우 메서드의 시그니처는 다음과 같아야합니다.


def fnct(self, cr, uid, obj, name, args, context):


그렇지 않으면 (전역 함수 인 경우) 다음과 같아야합니다.


def fnct(cr, uid, obj, name, args, context):


반환 값은 검색 함수에 사용되는 3파트의 튜플을 포함하는 목록입니다.


return [('id','in',[1,3,5])]


obj는 self와 같고 name은 필드 이름을받습니다. 

args는 이 필드에 대한 검색 기준을 포함하는 3파트로 된 튜플 리스트입니다.

검색 함수는 각 튜플에 대해 개별적으로 호출 될 수 있습니다.


다음과 같은 계약 객체를 생성한다고 가정 해보십시오.

class hr_contract(osv.osv):
    _name = 'hr.contract'
    _description = 'Contract'
    _columns = {
        'name' : fields.char('Contract Name', size=30, required=True),
        'employee_id' : fields.many2one('hr.employee', 'Employee', required=True),
        'function' : fields.many2one('res.partner.function', 'Function'),
    }
hr_contract()


현재 계약을 살펴봄으로써 직원의 기능을 검색하는 필드를 추가하려는 경우 기능 필드를 사용합니다. 

hr_employee 객체는 다음과 같이 상속됩니다.


class hr_employee(osv.osv):
    _name = "hr.employee"
    _description = "Employee"
    _inherit = "hr.employee"
    _columns = {
        'contract_ids' : fields.one2many('hr.contract', 'employee_id', 'Contracts'),
        'function' : fields.function(
            _get_cur_function_id,
            type='many2one',
            obj="res.partner.function",
            method=True,
            string='Contract Function'),
    }
hr_employee()


TIP


함수 필드가 many2one 필드를 만들어야하기 때문에 type = 'many2one'입니다. 함수는 hr_contract에서도 many2one으로 선언됩니다.


obj = "res.partner.function"은 many2one 필드에 사용할 객체가 res.partner.function임을 지정하는 데 사용됩니다.


우리의 메소드는 _get_cur_function_id 메소드를 호출했습니다. 그 역할은 키가 직원 ID이고 해당 값이 해당 직원의 기능에 대한 ID 인 사전을 리턴하기 때문입니다. 

이 메소드의 코드는 다음과 같습니다.


def _get_cur_function_id(self, cr, uid, ids, field_name, arg, context):
    for i in ids:
        #get the id of the current function of the employee of identifier "i"
        sql_req= """
        SELECT f.id AS func_id
        FROM hr_contract c
          LEFT JOIN res_partner_function f ON (f.id = c.function)
        WHERE
          (c.employee_id = %d)
        """ % (i,)

        cr.execute(sql_req)
        sql_res = cr.dictfetchone()

        if sql_res: #The employee has one associated contract
            res[i] = sql_res['func_id']
        else:
            #res[i] must be set to False and not to None because of XML:RPC
            # "cannot marshal None unless allow_none is enabled"
            res[i] = False
    return res


함수의 ID는 SQL 조회를 사용하여 검색됩니다. 쿼리가 결과를 반환하지 않으면 sql_res [ 'func_id']의 값은 None이됩니다. 

XML : RPC (서버와 클라이언트 간의 통신)가이 값을 전송할 수 없기 때문에이 경우 False 값을 강제합니다.



- method가 (객체의) 메소드 또는 전역 함수에 의해 계산되는지 여부



- store 데이터베이스에 필드를 저장할지 여부. 기본값은 False입니다.


store Prameter


필드를 계산하고 테이블에 결과를 저장합니다. 특정 필드가 다른 오브젝트에서 변경되면 필드가 다시 계산됩니다. 

다음 구문을 사용합니다.


store = {
    'object_name': (
            function_name,
            ['field_name1', 'field_name2'],
            priority)
}


'[object1]'객체의 [field1 ','field2 '] 목록의 필드에 변경 사항이 기록되면 함수 function_name을 호출합니다. 

함수의 서명은 다음과 같습니다.


def function_name(self, cr, uid, ids, context=None):


ids는 감시 대상 필드에서 값이 변경된 다른 객체의 테이블에있는 레코드의 ID입니다. 

이 함수는 필드를 다시 계산해야하는 자체 테이블의 레코드 ID 목록을 반환해야합니다. 이 목록은 필드의 주요 기능에 대한 매개 변수로 전송됩니다.


다음은 회원 모듈의 예입니다.


'membership_state':
    fields.function(
        _membership_state,
        method=True,
        string='Current membership state',
        type='selection',
        selection=STATE,
        store={
            'account.invoice': (_get_invoice_partner, ['state'], 10),
            'membership.membership_line': (_get_partner_id,['state'], 10),
            'res.partner': (
                lambda self, cr, uid, ids, c={}: ids,
                ['free_member'],
                10)
        }),



- multi는 그룹 이름입니다. 동일한 다중 매개 변수가있는 모든 필드는 단일 함수 호출로 계산됩니다.



Odoo 11 필드 타입 1


기본타입



bollean (true / false)


fields.boolean('Field Name' [, Optional Parameters]),


integer (정수 타입.)


fields.integer('Field Name' [, Optional Parameters]),



float (부동적인 소수점 숫자.)


fields.float('Field Name' [, Optional Parameters]),


- TIP  

선택적 매개변수 자리수는 숫자의 정밀도와 배율을 정의합니다. scale는 소수점 이하 자릿수이고 precision은 숫자의 유효 자릿수 (소수점의 앞뒤) 입니다. 매개변수 자릿수가 없으면 숫자는 배정 밀도 부동 소수점 자릿수가 됩니다. 이 부동 소수점 수는 정확하지 않으며 (값이 이진 표현으로 변환 될 수 없는 경우) 반올림 오류가 발생할 수 있습니다. 화폐 금액에는 항상 digits 매개변수를 사용해야합니다.


'rate': fields.float(
    'Relative Change rate',
    digits=(12,6) [,
    Optional Parameters]),



char (제한된 길이의 문자열. 필요한 크기의 size에 따라 크기가 결정됩니다.)


'city' : fields.char('City Name', size=30, required=True),



text (길이 제한이 없는 텍스트 필드 입니다.)


fields.text('Field Name' [, Optional Parameters]),



date (날짜)


fields.date('Field Name' [, Optional Parameters]),



datetime (같은 필드에 날짜와 시간을 저장할 수 있습니다.)


fields.datetime('Field Name' [, Optional Parameters]),



binary (이진수 파일 *텍스트가 아닌 파일*)


fields.binary(),



selection (사용자가 미리 정의 된 값들 사이에서 선택할 수 있게합니다.)


fields.selection((('n','Unconfirmed'), ('c','Confirmed')),
                   'Field Name' [, Optional Parameters]),


- TIP  

selection의 형식은 매개변수:튜플 형태의 문자열 입니다.


예)

(('key_or_value', 'string_to_display'), ... )


튜플을 반환하는 함수를 지정할 수 있습니다.


예 )

def _get_selection(self, cursor, user_id, context=None): return ( ('choice1', 'This is the choice 1'), ('choice2', 'This is the choice 2')) _columns = { 'sel' : fields.selection( _get_selection, 'What do you want ?') }


관계 필드를 사용하여 many2one을 선택합니다.


예 )

...,
'my_field': fields.many2one(
        'mymodule.relation.model',
        'Title',
        selection=_sel_func),
...,


그리고 필드 정의 앞에 다음과 같이 _sel_func을 정의하십시오


예 )

def _sel_func(self, cr, uid, context=None):
    obj = self.pool.get('mymodule.relation.model')
    ids = obj.search(cr, uid, [])
    res = obj.read(cr, uid, ids, ['name', 'id'], context)
    res = [(r['id'], r['name']) for r in res]
    return res



/****************************************************
도큐먼트 로드 순서정의
****************************************************/
//Window load functions 윈도우 로드 이벤트 (도큐먼트보다 나중에 실행)
$window.load(function () {
console.log("나중에 실행");
});

//Document ready functions 도큐먼트 레디 이벤트 (윈도우보다 먼저 실행)
$document.ready(function () {
console.log("먼저 실행");
});


Views


 Commen Structure :: 공통구조 


view객체는 아래 여러개의 요소들 중 선택 한 요소만 사용한다.



name (필수)


⇢   어떤 종류의 목록에서 하나를 찾을 때 view의 니모닉/설명 으,로만 유용하다.



model


⇢   적용 가능한 경우 view에 링크 된 model ( Qweb에는 해당되지 않는다. )



priority


⇢   클라이언트 프로그램은 id 또는 model, type에 의해 view를 요청할 수 있다.

후자의 경우, 올바른 유형 및 모델에 대한 모든 view가 검색되고 가장 낮은 priority 번호의 view가 리턴된다. ( 이것이 기본 view이다. )

priority는 view 상속 도중 적용순서도 정의한다.



arch


⇢   view의 레이아웃 기술



groups_id


⇢   접근 권한 관리



inherit_id


⇢   현재 view의 부모 view를 상속받는다고 선언



mode


⇢   inherit_id가 설정되지 않은 경우 현재 view가 기본이 된다. inherit_id가 설정 된 경우 부모 view를 기반으로 확장된다. 

( 명시적으로 기본을 설정할 수 있다. )



application


⇢   토글 가능한 view를 정의하는 웹사이트 기능. 기본적으로 view에는 항상 적용된다.






Inheritance :: 상속



view matching


⇢   (model,type)가 view에 requested 했을 경우, 적합한 model과 type를 갖는 view와 mode=primary 및 

우선순위가 가장 낮은 view가 matched됨.


⇢   id가 view에 rquested 했을 경우, 그 모드가 primary가 아니면 primary모드를 가진 가장 가까운 부모가 matched됨.


view resolution


⇢   Resolution이 requested/matched된 primary에 대한 최종 arch를 생성한다.


⇢   viwe에 부모가 있는 경우 부모 항목이 완전히 확인되고 현재 view의 상속 스펙이 적용된다.


⇢   view에 부모가 없는 경우 그 해당 view의 arch 그대로 사용된다.


⇢   현재 viwe의 자식 중 확장된 mode가 설정된 자식이 조회되고 상속 스펙이 우선적용 된다. 

( 자식 view에 적용, 그 다음 자식 view에 적용, 그의 형제 view에 적용 )


⇢   자식 view에 상속이 다 된 결과가 최종 arch가 된다. 



inheritance specs


⇢   상속 스펙은 부모 view에서 상속 된 element 로케이터와 상속 된 element를 수정하는데 사용 될 자식 element로 구성된다.

대상 element를 matching시키는 element 로케이터에는 세가지 유형이 있다.


1. exepr 속성을 가진 xpath 요소이다, expr은 xpath의 2번째 표현식에 적용되는 현재 arch이다. 첫번째로 찾은 노드를 match 시킨다.


2. name 속성을 가진 field요소이다, 첫번째 field를 동일한 name으로 match시킨다.


3. 다른요소 : name과 속성이 동일한 ( position과 version 속성 제외 ) 첫번째 요소를 match 시킨다.


⇢   상속 스펙은 position이 일치 된 노드가 어떻게 변경 되어야 하는지를 지정할 수 있는 속성을 가질 수 있다.



inside ( 기본값 )


⇢   상속 스펙의 match 노드에 넣는다.



replace


⇢   상속 스펙의 match 노드를 교체한다. 스펙에 내용 한에 $0만 포함하는 모든 텍스트 노드는 match  된 노드의 전체 복사본으로 교체된다.



after


⇢   상속 스펙의 match 된 노드의 뒷쪽으로 부모 항목에 추가된다.



before


⇢   상속 스펙의 match 된 노드의 앞쪽으로 부모 항목에 추가된다. 



attributes


⇢   상속 스펙의 내용은 name 특성과 선택적 본문을 포함하는 특성 요소여야 한다.


⇢   attribute 요소에 본문이 있는 경우, attribute 요소의 text를 값으로 하여 match되는 노드에 name이 생성된 후 명명된 새 attribute가 생성된다.


⇢   attribute 요소에 본문이 없는 경우, name 속성이 match하는 노드에서 제거된다. name 속성이 없으면 오류가 발생한다.


( view의 스펙은 순차적으로 적용된다. 
)







List :: 리스트


list view의 루트요소는 <tree>( : 그리드 )이다. list view의 루트는 아래와 같은 속성을 가질 수 있다.



aditable


⇢   기본적으로 list view의 행을 선택하면 해당 form view가 열린다. 편집 가능한 특성은 list view를 직접 편집할 수 있도록 한다.

사용할 수 있는 값은 top과 bottom이다. 이것은 list의 맨 위 또는 맨 아래에 각각 새 record를 표시한다.

inline form voew의 아키텍처는 list view에서 파생된다. 따라서 form view의 필드와 버튼의 유효한 대부분의 속성은 

list view에서 편집할 수 없는경우 의미 없지만, form view의 필드와 버튼에 유효한 대부분의 특성이 list view에 의해 수락된다.




default_order


⇢   model의 default 순서를 옮겨 view의 순서를 override 한다. 이 값은 쉼표로 구분 된 필드 list로 desc 역순으로 정렬할 수 있다. 


<tree default_oder="sequence, name desc>



colors


⇢   9.0 버전부터 사용되지 않고 decoration-{$name}  으로 대체됐다.



fonts


⇢   9.0 버전부터 사용되지 않고 decoration-{$name}  으로 대체됐다.




+ Recent posts