Technical Training -Part 5-

Alhamdulillah akhirnya kita bisa sampai bagian kelima. Untuk pembahasan kali ini penulis akan menjelaskan tentang ORM Methods pada OpenERP. Sebelum masuk ke coding sebaiknya kita kenalan dulu apa itu ORM.

ORM singkatan dari Object Relational Mapping, yang merupakan bagian penting dari OpenERP. Pada OpenERP, model data dibuat dan dimanipulasi pada class dan object python. Sedangkan fungsi ORM adalah sebagai ‘jembatan’ -untuk kemudahan developer- antara python dan relasi database pada PostgreSQL, yang akan memberikan ketepatan terhadap apa yang dibutuhkan pada object. Olehkarna itu kita membutuhkan sebuah ORM methods untuk melakukan hal tersebut.

Selanjutnya kita akan membuat ORM methods pada class sesi() yaitu object ‘training.sesi’. Tambahkan sebuah fields function seperti dibawah ini :


    _columns = {
        ...
        'kuota_kehadiran_persen': fields.function(_get_kehadiran_persen, method=True, type='float', string='Kuota Kursi'),
        ...
    }

    _defaults = {
                 'kursi': 1,
    }
    

Keyword _defaults berfungsi untuk memberikan nilai default awal pada saat form akan dibuat (menekan tombol create) dan juga untuk menghindari pesan error ketika pembuatan record baru pada object sesi karna field function ini, yaitu error pembagian nilai 0 (nilai field kursi). Selanjutnya tambahkan method yang namanya seperti pada fields function tersebut yaitu _get_kehadiran_persen() yang isinya seperti ini :


    def _get_kehadiran_persen(self, cr, uid, ids, field, arg, context=None):
        val = self.browse(cr,uid,ids,context=context)
        result = {}
        for x in val:
            result[x.id] = (len(x.peserta_ids) / float(x.kursi)) * 100.0
        return result

Pastikan method diatas terletak diatas keyword _columns. Karna kita harus mendefinisikan method tersebut sebelum dipanggil fields function ‘kuota_kehadiran_persen’. Dan hal ini berlaku pada semua rule di OpenERP / Python.

Selanjutnya kita revisi kembali interface pada file xml, yaitu revisi tampilan list (tree) dan form dari object ‘training.sesi’


		<record model="ir.ui.view" id="sesi_tree_view">
		     <field name="name">training.sesi.tree</field>
		     <field name="model">training.sesi</field>
		     <field name="arch" type="xml">
		         <tree string="List Sesi">
		            <field name="name" />
		            <field name="instructur_id"/>
		            <field name="kursus_id"/>
		            <field name="tanggal_mulai"/>
		            <field name="durasi"/>
		            <field name="kuota_kehadiran_persen" widget="progressbar"/>
		         </tree>
		     </field>
		</record>
		 
		<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"/>
		                <field name="kuota_kehadiran_persen" widget="progressbar"/>
		             </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 perhatikan, field progressbar dari kuota kehadiran diatas akan mengalami perubahan setelah form sesi tersebut kita save (menekan tombol save). Untuk membuat perubahannya menjadi realtime yaitu ketika menambah peserta atau merubah jumlah kursi maka otomatis progressbar tersebut akan bertambah persennya yaitu dengan menggunakan fitur on_change()

Awalan kita harus membuat method yang akan diisi pada parameter on_change() yaitu method onchange_hitung_kuota(), seperti code dibawah ini :


    def onchange_hitung_kuota(self, cr, uid, ids, kursi, peserta):
        return {
            'value':{ 'kuota_kehadiran_persen': (len(peserta) / float(kursi)) * 100.0}
        }
        

Kemudian kita tambahkan parameter on_change() pada field kursi dan peserta_ids di xml file. Hasilnya seperti 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" on_change="onchange_hitung_kuota(kursi, peserta_ids)"/>
		                <field name="kuota_kehadiran_persen" widget="progressbar"/>
		             </group>
					 <separator string="Peserta" colspan="4"/>
					 <field name="peserta_ids" colspan="4" nolabel="1" on_change="onchange_hitung_kuota(kursi, peserta_ids)">
						 <tree string="Peserta" editable="top">
						 	<field name="peserta_id"/>
						 </tree>
					 </field>
		         </form>
		     </field>
		</record>

Dengan perubahan diatas maka setiap kita merevisi field kursi dan peserta, maka progressbar field kuota_kehadiran_persen akan menyesuaikannya.

Setiap method pada OpenERP harus mereturn suatu nilai, setidaknya adalah return True. Jika kita lihat pada method onchange_hitung_kuota(), method tersebut mereturn sebuah dictionary yang berisi key ‘value’ dan berisikan dictionary lagi.

Fungsi dari key ‘value’ adalah untuk memberikan nilai dari setiap field/kolom dalam form aktif, makanya key ‘value’ berisikan dictionary yang memiliki susuanan key sebagai nama field/kolom terkait dan valuenya adalah nilai yang kita inginkan dari masing-masing fieldnya. Contohnya seperti ini :


        return {
            'value':{ 'nama_field': 'nilai field sesuai tipe datanya'}
        }
        

Disamping key ‘value’, kita juga bisa mereturn sebuah pesan warning pada user yaitu dengan menggunakan key ‘warning’. Key ‘warning’ ini berisi dictionary juga yang memiliki nilai seperti dibawah ini :


        return {
            'warning':{ 
                       'title': 'judul warning',
                       'message': 'pesan warning'
            }
        }


Semua parameter tersebut bisa kita return secara bersamaan layaknya sebuah dictionary python yang contohnya terlihat seperti dibawah ini :


        return {
            'value':{ 'nama_field': 'nilai field sesuai tipe datanya'},
            'warning':{ 
                       'title': 'judul warning',
                       'message': 'pesan warning'
            }
        }


Untuk lebih memahami konsep diatas maka kita harus mencobanya dengan membuat sebuah rule yaitu jika user memasukan jumlah kursi dibawah 0 alias bilangan negatif maka kita harus memberikan pesan warning. Kita rubah method ‘onchange_hitung_kuota()’ menjadi seperti ini :


    def onchange_hitung_kuota(self, cr, uid, ids, kursi, peserta):
        val = {
               'value': {'kuota_kehadiran_persen': (len(peserta) / float(kursi)) * 100.0}
        }
        
        if kursi <= 0:
            val = {
                   'warning': { 
                               'title': 'Perhatian',
                               'message': 'Jumlah kursi harus diatas 0'
                               }
            }
        
        return val

Alhamdulillah akhirnya kita telah mengenal ORM Methods dan mencobanya pada modul training yang telah kita buat. Mungkin hanya ini saja yang bisa saya sampaikan pada pertemuan kali ini, semoga bermanfaat ..

Advertisements

5 thoughts on “Technical Training -Part 5-

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

  2. Assalamualaikum wr wb mas, saya sudah menjalankan proses diatas tetapi ada error “except_orm: (‘Programming Error’, “There is no reference field ‘kursus_id’ found for ‘training.sesi'”)” setelah saya cek pada object training.sesi saya sudah memasukan code “‘sesi_ids’: fields.one2many(‘training.sesi’, ‘kursus_id’, ‘Sesi’)” . ada kah yg kurang? mohon masukkannya

    • Wa’alaikumussalamwarohmatulloh Wabarokatuh….

      Itu error karna kamu di xml nampilin field kursus_id padahal kamu blum bikin field itu di pythonnya (object/classnya). Jadi di object ‘training.sesi’ harus ada field kursus_id juga yang codenya seperti ini :

      
      'kursus_id':fields.many2one('training.kursus', 'Kursus', required=True, ondelete='cascade')
      
      
      • Saya sudah menyertakan “‘kursus_id’:fields.many2one(‘training.kursus’, ‘Kursus’, required=True, ondelete=’cascade’),” mas, apakah pengaruh dari modul _get_kehadiran_persen() dan onchange_hitung_kuota() ? diatas _columns = { , karena sbelumnya tidak ada masalah error tersebut

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