[Odoo 10] Technical Documentation -Part 5-

Alhamdulillah kita masih bisa melanjutkan tutorial bagian 5 ini. Insya Allah pada kesempatan kali ini, kita akan membahas tentang inherintance pada Odoo. Konsep inheritance adalah salah satu konsep OOP (Pemrograman Berorientasi Object), untuk penjelasan lanjutnya bisa baca disini.

Odoo menyediakan 2 jenis inheritance, yaitu :

1. Merubah ‘behavior’ suatu object dari modul lain (class anak). Diantaranya adalah :

– Menambahkan fields dan methods baru
– Mengoverride attribute atau method suatu field
– Mengoverride method parent
– Menambah constraints baru

2. Delegasi, yaitu memungkinkan untuk menghubungkan setiap record suatu model kepada record model parent dan memberikan akses kepada field record parent tersebut (hanya field saja).

Point pertama menggunakan attribute _inherit, sedangkan yang kedua menggunakan _inherits. Tujuan utama dari fitur ini adalah kita ingin menambah atau merubah hal-hal diatas pada object yang telah ada yaitu dengan membuat modul baru. Karna kita di ‘haramkan’ untuk langsung mengedit modul existing seperti sale, purchase, stock, dll. Ada banyak hal yang bisa kita inherite di Odoo, diantaranya model (python), view (xml), access right (csv), sampai report (qweb).

Selanjutnya kita akan menginherite object res_partner. Object ini digunakan oleh beberapa menu (view) yaitu menu Customers dan Vendors, hal ini bisa kita lakukan dengan bantuan fitur Action seperti penjelasan pertemuan sebelumnya. Kita juga telah melakukan hal yang sama, yaitu object res_partner kita gunakan untuk 2 hal yaitu sebagai Instruktur dan sebagai Peserta. Jika Customer dan Vendor menggunakan field customer (Is a Customer) dan supplier (Is a Vendor) sebagai pembeda, maka kita akan menggunakan field instructor (Instruktur) untuk membedakannya.

Setiap file python bisa mengandung banyak class, tidak seperti java dan lainnya yang hanya memiliki 1 class dalam setiap file. Tetapi dalam tutorial kali ini, saya ingin memisahkan class yang akan kita inherit kedalam file baru agar terlihat rapi dan dapat dijalankan pada windows. Baik kita mulai dengan membuat file baru yaitu partner.py (samakan pathnya dengan models.py) yang isinya seperti berikut :


# -*- coding: utf-8 -*-

from odoo import models, fields, api

class Partner(models.Model):
    _inherit = 'res.partner'
    
    instructor = fields.Boolean("Instruktur")
    session_ids = fields.Many2many('training.sesi', string="Menghadiri Sesi", readonly=True)

Pada coding diatas kita menginherite object res_partner dengan tujuan untuk menambahkan 2 field baru yaitu instructor dan session_ids. Field instructor berfungsi sebagai filter antara instruktur dan peserta. Sedangkan field session_ids berfungsi sebagai relasi dan menjadikan informasi bahwa partner terkait telah mengikuti sesi apa saja (field akan terisi otomatis dari menu sesi).

Dan pastikan kita telah mengimport file partner.py pada file __init__.py di dalam folder models. Seperti berikut :


# -*- coding: utf-8 -*-

from . import models
from . import partner

Lalu kita buat file xml nya dengan nama partner.xml (samakan pathnya dengan views.py) agar field dapat di tampilkan, yang isinya seperti berikut :


<odoo>
  <data>
  	
  	<!-- Menambahkan field pada view form partner -->
  	
	<record model="ir.ui.view" id="instruktur_form_view">
	<field name="name">res.partner.instruktur</field>
	<field name="model">res.partner</field>
	<field name="inherit_id" ref="base.view_partner_form"/>
	<field name="arch" type="xml">
		<notebook position="inside">
			<page string="Sessions">
				<group>
					<field name="instructor"/>
					<field name="session_ids"/>
				</group>
			</page>
		</notebook>
	</field>
	</record>
	
	<!-- Membuat action baru untuk menu baru-->
	
	<record model="ir.actions.act_window" id="kontak_list_action">
		<field name="name">Kontak</field>
		<field name="res_model">res.partner</field>
		<field name="view_mode">tree,form</field>
	</record>
	
	
	<!-- ### Membuat menu title baru ### -->
	
	<menuitem id="konfigurasi_menu" name="Konfigurasi" parent="main_training_odoo_menu"/>

	<!-- ### Membuat Sub Menu Kontak ### -->
			
	<menuitem id="kontak_menu" name="Kontak" parent="konfigurasi_menu" action="kontak_list_action"/>
		    	    
  </data>
</odoo>

Pada bagian pertama file xml diatas, kita melakukan inherit dari sebuah tampilan atau view. Jika pada object/model kita menggunakan nama objectnya pada attribute _inherit, sedangkan untuk menginherit view kita menggunakan id view terkait pada field inherit_id. Caranya terletak pada baris ini :


<field name="inherit_id" ref="base.view_partner_form"/>

Bagaimana kita mengetahui id view tersebut ? Yaitu dengan :

1. Aktifkan developer mode
2. Pilih/buka view yang di inginkan untuk kita update
3. Klik icon ‘bug’ pada pojok kanan atas, lalu pilih ‘Edit FormView’

Hasilnya seperti gambar dibawah ini :

Dari gambar diatas kita bisa banyak mengambil informasi, untuk inherite kita gunakan value dari field ‘External ID’. Setelah kita mengetahui id viewnya, selanjutnya kita sisipkan field tambahan yang telah dibuat sebelumnya. Ada 2 cara untuk melakukan hal tersebut sebagaimana contoh dibawah ini :



<xpath expr="//field[@name='description']" position="after">
	<field name="instructor" />
</xpath>

<!-- ATAU-->

<field name="description" position="after">
	<field name="instructor" />
</field>

1. Menggunakan xpath
2. Menggunakan element terkait. Bisa berupa field, button, notebook, page, groups, dll

Kedua cara diatas menghasilkan tampilan yang sama dan menggunakan attribute yang sama yaitu position. Attribute position memiliki beberapa value yaitu :

a. after = menambahkan element setelah element yang dituju
b. before = menambahkan element sebelum element yang dituju
c. replace = menambahkan element dengan menghapus element yang dituju
d. inside = menambahkan element di dalam element yang dituju
e. attributes = menambahkan attribute dari element yang dituju. Misal : readonly, string, editable, domain, options, dll

Pada contoh di atas kita memasukan sebuah element page ke dalam element notebook. Kemudian pastikan kita telah mengupdate file partner.xml pada file __manifest__.py seperti berikut :


...

    # always loaded
    'data': [
        # 'security/ir.model.access.csv',
        'views/views.xml',
        'views/templates.xml',
        'views/partner.xml',
    ],
    

...

Jika semua telah di lakukan, restart service dan upgrade modul, hasilnya akan terlihat seperti berikut :

Bagi yang belum berhasil, mungkin bisa mendownload contoh modul yang telah jadi disini

Semoga bermanfaat, CMIIW …

Advertisements

2 thoughts on “[Odoo 10] Technical Documentation -Part 5-

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s