Technical Training -Part 6-

Pada tutorial part 4 kita telah membahas mengenai proses inheritance pada OpenERP, lalu tutorial part 5 kita belajar tentang ORM Methods di OpenERP. Kali ini, penulis mencoba membahas mengenai constraints pada OpenERP.

Ada 2 cara untuk menambahkan constraints pada OpenERP, yaitu menggunakan keyword _constraints dan _sql_constraints. Bedanya jika menggunakan _constraints kita harus mendenisikan rule constraints -secara bebas- pada sebuah method. Sedangkan _sql_constraints hanya kita gunakan jika ingin membuat constraint berdasarkan bahasa sql, seperti membuat nilai uniqe sebuah fields. Untuk lebih jelasnya langsung saja kita buat constraints dari dua metode diatas pada object training.kursus.


    _constraints = [
        (_check_keterangan, 'Keterangan tidak boleh sama dengan nama kursus !', ['name', 'keterangan']),
    ]
    
    _sql_constraints = [
        ('unique_name', 'unique(name)', 'Nama kursus harus unique !'),
    ]
 

Pada contoh diatas kita telah membuat constraints menggunakan 2 cara, yang pertama menggunakan keyword _constraints yang berisi parameter : nama_method, pesan_error, dan list dari nama fields yang bersangkutan. Jika cara ini digunakan seperti contoh diatas maka kita harus membuat sebuah method sesuai dengan nama method pada keyword _constraints yaitu _check_keterangan(). Pastikan method ini berada diatas keyword _constraints (definikan terlebih dahulu sebelum dipanggil).


    def _check_keterangan(self, cr, uid, ids, context=None):
        cek = True
        kursus = self.browse(cr, uid, ids, context=context)[0]
        if kursus.name == kursus.keterangan:
            return False
        return cek
 

Method diatas mendefinikan sebuah rule pengecekan jika terjadi kesamaan antara field name dan keterangan pada object kursus maka akan mereturn nilai False, artinya pesan error akan ditampilkan. Dengan cara constraints ini kita bisa bebas membuat berbagai rule yang kita inginkan.

Cara kedua dengan menggunakan _sql_constraints, seperti contoh code diatas keyword _sql_constraints hanya membutuhkan 3 parameter yang semuanya bertipe string yaitu unique_NamaField, unique(NamaField), dan pesan error. Cukup simple bukan ?

Ketika menambahkan _sql_constraints pada sebuah object maka method default dari OpenERP yaitu copy() tidak bisa kita gunakan lagi, olehkarna itu kita harus melakukan override pada method tersebut, seperti contoh dibawah ini :



    def copy(self, cr, uid, ids, defaults, context=None):
        # Simpan field name dari record yang telah di duplicate ke variabel nama_lama
        nama_lama = self.browse(cr, uid, ids, context=context).name
        
        # Bikin nama copyan dari record yang telah di duplicate ke variable nama_baru
        nama_baru = 'Copy of %s' % nama_lama
        
        # Pastikan nama copyan dari record yang kita duplicate TIDAK ADA di tabel
        eksis = self.search(cr, uid, [('name', 'like', nama_baru)])
        
        # Jika ternyata nama copyan dari record yang kita duplicate ADA di tabel MAKA tambahkan bilangan integer
        if eksis:
            nama_baru = '%s %d' % (nama_baru, len(eksis)+1)
        
        # Isi nilai field name yang baru dengan nama yang telah kita buat pada variabel nama_baru
        defaults['name'] = nama_baru
        
        # Panggil method parent dengan super()
        return super(Kursus, self).copy(cr, uid, ids, defaults, context=context)
    

Selanjutnya kita tambahkan sebuah fields bernama ‘active’ pada object ‘training.sesi’ dan tambahkan juga nilai _defaults dari fields ‘active’ dan ‘tanggal_mulai’. Seperti contoh dibawah ini :


import time

class Sesi(osv.osv):
    _name = 'training.sesi' 
    _columns = {
        ...
        'active': fields.boolean('Active'),
        ...
    }

    _defaults = {
                 'kursi': 1,
                 'active': True,
                 'tanggal_mulai': time.strftime('%Y-%m-%d')
    }
   
Sesi()

Fields active berfungsi untuk meremark apakah record tersebut aktif atau tidak, jika kita set False (tidak dicentang), maka record yang bersangkutan akan hilang (tidak terlihat) dari tampilan baik list/tree maupun form object terkait. Fields active juga memiliki perlakuan yang sama seperti field name yang merupakan fields-fields yang memiliki perlakuan khusus seperti dari segi penamaan maupun lainnya.

Seperti biasa, setelah kita menambahkan sebuah field pada object pythonnya selanjutnya kita harus menambahkannya juga pada interface di file xmlnya. Mungkin ada baiknya juga sekaligus kita tambahkan ‘kosmetik’ pada form kita agar terlihat lebih ‘cantik’ yaitu dengan bantuan parameter col dan colspan.




		<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 col="4">
		                <field name="name" colspan="4"/>
		                <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="active"/>
		            	<field name="kuota_kehadiran_persen" widget="progressbar" colspan="4"/>
		             </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>
		 

Mungkin ini saja yang bisa saya sampaikan, semoga bermanfaat …

Advertisements

2 thoughts on “Technical Training -Part 6-

  1. Assalamu’alaikum, Akhi, apakah pembuatan modul di technical harus melalui editor dari phyton, atau apakah dapat dari editor2 lain namun ketika penyimpanan file typenya diarahkan ke type phyton, demikian, terima kasih

    • Wa’alaikumussalamwarohmatulloh …

      Untuk editor bebas akh, bahkan notepad pun bisa. Akan tetapi semakin bagus editor maka akan memudahkan kita dalam proses development seperti : syntax lighting, package explorer, outline, dll

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