Technical Training -Part 4-

Pada kesempatan kali ini, kita akan mencoba proses Inheritance dalam OpenERP. Sebelum kita memasuki proses Inheritance maka kita lanjutkan tutorial ini dengan menambahkan beberapa relation lagi yaitu field many2one dan one2many.

Kita tambahkan fields one2many pada object ‘training.sesi’ yang hasilnya seperti dibawah ini :


class Sesi(osv.osv):
    _name = 'training.sesi'
    _columns = {
        ...
        'peserta_ids': fields.one2many('training.peserta', 'sesi_id', 'Peserta'),
        ...
    }
 
Sesi()

Pada code diatas kita telah membuat suatu relasi antara object ‘training.sesi’ dengan ‘training.peserta’ melalui field one2many ‘peserta_ids’, olehkarna itu kita harus membuat object baru yang bernama ‘training.peserta’ yang hasilnya seperti dibawah ini :


class Peserta(osv.osv):
    _name = 'training.peserta'
    _rec_name = 'peserta_id'
    _columns = {
        'peserta_id': fields.many2one('res.partner','Peserta',required=True, ondelete="cascade"),
        'sesi_id': fields.many2one('training.sesi','Sesi', required=True, ondelete="cascade"),
    }

Peserta()

Jika kita perhatikan, pada object ‘training.peserta’ diatas maka kita akan menemukan beberapa perbedaan dengan object-object sebelumnya, yaitu :

1. Tidak adanya fields name
2. Adanya keyword baru yaitu _rec_name.

Fields name adalah sebuah fields yang wajib ada pada setiap object OpenERP, karna kita tidak membuat field name tersebut maka kita harus menggunakan keyword _rec_name untuk menggantikan posisi fields name dengan fields lainnya. Seperti contoh diatas fields name akan digantikan posisinya dengan fields peserta_id.

Setelah kita membuat object baru ‘training.peserta’ dan menambahkan beberapa fields diatas pada object ‘training.sesi’ maka kita harus merubah tampilan pada file xml ‘technical_training_view.xml’ yang hasilnya seperti dibawah ini :


 
		<record model="ir.ui.view" id="sesi_form_view">
		     <field name="name">training.sesi.form</field>
		     <field name="model">training.sesi</field>
		     <field name="arch" type="xml">
		         <form string="Form Sesi" version="7.0">
		             <group>
		                <field name="name" />
		                <field name="instructur_id" />
		                <field name="kursus_id"/>
		                <field name="tanggal_mulai" />
		                <field name="durasi"/>
		                <field name="kursi"/>
		             </group>
					 <separator string="Peserta" colspan="4"/>
					 <field name="peserta_ids" colspan="4" nolabel="1">
						 <tree string="Peserta" editable="top">
						 	<field name="peserta_id"/>
						 </tree>
					 </field>
		         </form>
		     </field>
		</record>
		 

Jika kita lihat code xml diatas, maka ada perbedaan ketika kita menambahkan field one2many kedalam file xml dibandingkan field lainnya, yaitu kita harus mendefinikan tampilan form dan tree dari field one2many tersebut, karna field one2many akan berbentuk seperti tabel baru dan untuk menambahkannya diperlukan tampilan form dan tree.

Untuk kali ini penulis cukup mendefinisikan tampilan tree saja mengingat sederhanannya object ‘training.peserta’ yang hanya memiliki 2 field saja. Agar pada saat menambahkan data pada field tersebut tidak membuka form baru maka kita harus menambahkan parameter editable yang memiliki nilai bottom dan top pada element tree.

Setelah kita berhasil merevisi modul training_openerp maka kita bisa mencobanya dengan beberapa cara, diantaranya :

1. Restart OpenERP server lalu upgrade/install ulang modul training_openerp
2. Restart OpenERP server dengan menambahkan beberapa parameter yaitu -d nama_database dan -u nama_modul

Jika kita menggunakan cara kedua, maka hasilnya akan seperti ini :

python openerp-server -d TRAINING -u training_openerp

Kita juga dapat menambahkan parameter konfigurasi yaitu -c path_configurasi. Parameter -c /etc/openerp-server.conf adalah parameter optional yang kita gunakan jika kita memiliki banyak addons dan konfigurasi lainnya. Hasilnya seperti dibawah ini :

python openerp-server -c /etc/openerp-server.conf -d TRAINING -u training_openerp

Setelah kita berhasil merevisi modul training_openerp kita maka selanjutnya kita memasuki tahap selanjutnya yaitu Inheritance. Secara default, tidak ada perubahan yang banyak kita lakukan untuk melakukan proses Inheritance, kita cukup menggunakan keyword _inherit untuk menggantikan keyword _name yang ada pada setiap object OpenERP. Selain itu, hal yang biasa kita lakukan pada proses Inheritance adalah melalukan replace fields, nilai default, dan method yang kita kenal dengan override (overriding method).

Pada tutorial kali ini, kita akan mencoba menginherit sebuah object data Supplier / Customer yang ada pada OpenERP, yaitu object res.partner. Untuk lebih jelasnya kita langsung lakukan dengan menambahkan code python pada file training_openerp.py :


class Partner(osv.osv):
    _inherit = 'res.partner'
    _columns = {
            'instructur' : fields.boolean('Instructur'),
            }
Partner()

Pada code diatas kita menginherit object ‘res.partner’ dengan tujuan menambahkan sebuah field yang bernama ‘intructur’ dengan tipe data boolean. Setelah kita buat code pythonnya selanjutnya adalah menambahkannya juga pada interface yang kita tambahkan pada file training_openerp_view.xml :


		<record model="ir.ui.view" id="partner_instructur_form_view">
		    <field name="name">res.partner.form.instructur</field>
		    <field name="model">res.partner</field>
		    <field name="inherit_id" ref="base.view_partner_form" />
		    <field name="arch" type="xml">
		        <field name="email" position="after">
		            <field name="instructur"/>
		        </field> 
		    </field>
		</record>

Khusus untuk tampilan interfacenya, ada beberapa cara dalam menambahkan ataupun mengurangi element-element seperti fields, button, group, page, dll. Diantara caranya adalah :

1. Menggunakan syntax ‘field’ atau ‘button’ yang memiliki parameter name dan position.
2. Menggunakan syntax ‘xpath’ yang memiliki parameter expr dan position

Untuk nilai parameter name kita harus isi dengan nama dari element interface terkait baik itu nama field ataupun nama button. Sedangkan parameter position ini memiliki beberapa nilai diantaranya inside, attributes, before, after, dan replace. Terakhir parameter expr, parameter ini memiliki nilai path hirarki dari element interface terkait. Contoh dari masing-masing cara diatas seperti dibawah ini :

		        <field name="email" position="after">
		            <field name="instructur"/>
		        </field>

				<!-- ATAU -->		        

				<xpath expr="//field[@name='email']" position="after">
					<field name="instructur"/>
				</xpath>

Penulis selama ini untuk parameter position hanya menggunakan value before, after, dan replace. Ketiga value tersebut memiliki fungsi yang berbeda-beda, jika kita ingin menambahkan sebuah fields pada GUI terletak sebelum fields terkait maka gunakan before, jika setelah fields terkait gunakan after & terakhir gunakan replace jika kita ingin mengganti/menghilangkan field terkait dengan field tambahan kita.

Tujuan kita menambahkan field instruktur pada object ‘res.partner’ adalah untuk memfilter data object ‘res.partner’ yang hanya bernilai True saja alias dia seorang instruktur, karna obejct tersebut adalah object gabungan data antara Supplier, Customer, dan Instruktur. Untuk mengaplikasikannya maka kita harus menggunakan parameter domain pada field instrustur di object ‘training.sesi’ yang hasilnya seperti dibawah ini :


class Sesi(osv.osv):
    _name = 'training.sesi'
    _columns = {
        ...
        'instructur_id': fields.many2one('res.partner', 'Instructur', domain=[('instructur', '=', True)]),
        ...
    }
 

Sebenarnya parameter domain bisa kita tambahkan pada file python maupun file xml. Hanya saja pada contoh diatas kita tambahkan melalui file pythonnya, jika kita ingin menambahkan pada file xmlnya maka cukup seperti contoh code dibawah ini :


<field name="instructur" domain="[('instructur','=', True)]"/>

Alhamdulillah akhirnya kita telah mempelajari proses Inheritance dalam OpenERP, modul yang telah jadi silahkan untuk diupgrade dan dilihat perubahannya. Semoga bermanfaat …

Advertisements

3 thoughts on “Technical Training -Part 4-

  1. Pingback: Technical Training -Part 6- | Tutorial OpenERP

  2. Mas Aziz,

    saya coba menginherit qty_available pada product.product untuk menggetahui function perhitungan qty on hand pada product, tapi saya hanya menemukan code ini, code utk perhitunganya dimana ya??

    def _get_product_available_func(states, what):
    def _product_available(self, cr, uid, ids, name, arg, context=None):
    return {}.fromkeys(ids, 0.0)
    return _product_available

    _product_qty_available = _get_product_available_func((‘done’,), (‘in’, ‘out’))
    def _get_product_available_func(states, what):
    def _product_available(self, cr, uid, ids, name, arg, context=None):
    return {}.fromkeys(ids, 0.0)
    return _product_available

    _product_qty_available = _get_product_available_func((‘done’,), (‘in’, ‘out’))

    _name = “product.product”
    _description = “Product”
    _table = “product_product”
    _inherits = {‘product.template’: ‘product_tmpl_id’}
    _inherit = [‘mail.thread’]
    _order = ‘default_code,name_template’
    _columns = {
    ‘qty_available’: fields.function(_product_qty_available, type=’float’, string=’Quantity On Hand’),

    mohon pencerahanya..

    • Field Quantity on Hand itu memang ga akan bisa di store, karna dia bersifat flexibel. Jika kita perhatikan methodnya ada beberapa parameter [_get_product_available_func((‘done’,), (‘in’, ‘out’))] artinya fungsi tersebut mengambil mutasi setiap product, yaitu delivery order & incoming shipment yang keduanya berstate done. Silahkan explore lebih dalem lagi mas 🙂 …

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