Technical Training -Part 10-

Alhamdulillah kita telah memasuki bulan suci Ramadhan, penulis ucapkan “Marhaban Yaa Ramadhan & Selamat Menunaikan Ibadah Puasa Ramadhan”.

Kita telah sampai pada bagian yang ke 10. In syaa Allah pada kali ini kita akan mempelajari tentang pembuatan wizard di OpenERP. Pembuatan wizard sudah pernah saya bahas pada tutorial sebelumnya seperti pembuatan wizard, wizard eksport import, wizard excel report, sampai issue mengenai wizard pada v7. Akan tetapi pembahasan wizard kali ini akan kita kaitkan dengan modul training kita sebelumnya.

Secara singkat, sebuah wizard menggambarkan sesi interaktif terhadap user dengan tampilan form yang dinamis. Sebuah wizard agak berbeda dengan object OpenERP yang lain yaitu dibangun dengan library ‘osv.osv_memory’ artinya object ini bersifat ‘on the fly’ yaitu ada ketika actionnya dijalankan. Secara database, object wizard terlihat tetapi tidak memiliki data.

Untuk selanjutnya kita buat wizard yang bertujuan membuat data peserta, pertama kita buatkan object dari wizardnya pada file python training seperti dibawah ini :



class WizardTambahPeserta(osv.osv_memory):
    _name = 'training.tambah.peserta.wizard'
    _columns = {
                'sesi_id': fields.many2one('training.sesi', 'Sesi', required=True),
                'peserta_ids': fields.one2many('training.peserta.wizard', 'wizard_id', 'Para Peserta'),
    }

    def tambah_peserta(self, cr, uid, ids, context=None):
        peserta_obj = self.pool.get('training.peserta')
        wizard = self.browse(cr, uid, ids[0], context=context)
        for x in wizard.peserta_ids:
            peserta_obj.create(cr, uid, {
                'name': x.name,
                'peserta_id': x.peserta_id.id,
                'sesi_id': wizard.sesi_id.id,
            })
        return {}


WizardTambahPeserta()
  
class WizardPeserta(osv.osv_memory):
    _name = 'training.peserta.wizard'
    _columns = {
                'name': fields.char('Nama', size=64),
                'peserta_id': fields.many2one('res.partner', 'Peserta', required=True),
                'wizard_id':fields.many2one('training.tambah.peserta.wizard'),
    }

WizardPeserta()


Lalu kita update juga file xml dengan view, action, dan menu dari wizard tersebut :



		<record model="ir.ui.view" id="tambah_peserta_form_view">
			<field name="name">training.tambah.peserta.wizard.form</field>
			<field name="model">training.tambah.peserta.wizard</field>
			<field name="arch" type="xml">
				<form string="Tambah Peserta" version="7.0">
					<group>
						<field name="sesi_id"/>
					</group>
					<notebook colspan="4">
		                <page string="Para Peserta">
							<field name="peserta_ids" mode="tree">
								<tree editable="bottom">
									<field name="peserta_id"/>
								</tree>
							</field>
						</page>
					</notebook>
					<footer>
	                    <button name="tambah_peserta" string="Tambah" type="object" class="oe_highlight"/>
	                    or 
	                    <button string="Cancel" class="oe_link" special="cancel" />
	                </footer>
				</form>
			</field>
		</record>


		<record model="ir.actions.act_window" id="tambah_peserta_wizard_action">
			<field name="name">Tambah Peserta</field>
			<field name="res_model">training.tambah.peserta.wizard</field>
			<field name="view_type">form</field>
			<field name="view_mode">form</field>
			<field name="target">new</field>
		</record>
		
		<menuitem name="Tambah Peserta" parent="kursus_menu" id="tambah_peserta_wizard_menu" action="tambah_peserta_wizard_action"/>




Setelah kita restart server dan upgrade modul training maka disana akan ada menu baru, yaitu “Tambah Peserta”. Menu ini berbentuk wizard yang berguna untuk menambahkan peserta kepada sesi tertentu secara instan. Silahkan dicoba.

Setelah kita mencobanya, disana kita hanya bisa menambahkan beberapa peserta hanya kepada satu sesi, sekarang kita akan mencoba bagaimana caranya untuk menambah banyak peserta sekaligus ke banyak sesi yang ada. Maka langkah pertama kita harus merubah field many2one sesi_id menjadi field sesi_ids bertipe many2many seperti ini :



class WizardTambahPeserta(osv.osv_memory):
    _name = 'training.tambah.peserta.wizard'
    _columns = {
                'sesi_ids': fields.many2many('training.sesi', 'tambah_peserta_sesi_rel', 'tambah_peserta_id', 'sesi_id', 'Sesi', required=True),
                'peserta_ids': fields.one2many('training.peserta.wizard', 'wizard_id', 'Para Peserta'),
    }

    def tambah_peserta(self, cr, uid, ids, context=None):
        sesi_obj = self.pool.get('training.sesi')
        
        # Ambil value dari form wizard dan menyimpannya ke variabel wizard
        wizard = self.browse(cr, uid, ids[0], context=context)
        
        # Bikin list/array yang berisi kumpulan id sesi yang dipilih dan menyimpannya ke variabel sesi_ids 
        sesi_ids = [s.id for s in wizard.sesi_ids]
        
        # Contoh code diatas sama seperti ini :
        # sesi_ids = []
        # for s in wizard.sesi_ids:
        #     sesi_ids.append(s.id)
        
        
        # Bikin dict yang berisi kumpulan data peserta yang dipilih dan menyimpannya ke variabel data_peserta
        data_peserta = [{'name': x.name, 'peserta_id': x.peserta_id.id} for x in wizard.peserta_ids]
        
        # Contoh code diatas sama seperti ini :
        # data_peserta = []
        # for x in wizard.peserta_ids:
        #     data_peserta.append({
        #                        'name': x.name, 
        #                        'peserta_id': x.peserta_id.id
        #    })
        # Element dict (key dan value) disesuaikan dengan nama field pada object 'training.peserta'
        
        # Cara lain untuk menambah data peserta melalui object sesi
        sesi_obj.write(cr, uid, sesi_ids, {'peserta_ids': [(0, 0, data) for data in data_peserta]}, context)

        return {}

WizardTambahPeserta()

Update juga view wizard pada file xml seperti ini :



		<record model="ir.ui.view" id="tambah_peserta_form_view">
			<field name="name">training.tambah.peserta.wizard.form</field>
			<field name="model">training.tambah.peserta.wizard</field>
			<field name="arch" type="xml">
				<form string="Tambah Peserta" version="7.0">
					<separator string="Sesi" colspan="4"/>               
					<group colspan="4">
						<field name="sesi_ids" nolabel="1"/>
					</group>
					<separator string="Para Peserta" colspan="4"/>
                    <group colspan="4">
						<field name="peserta_ids" mode="tree" nolabel="1">
							<tree editable="bottom">
								<field name="peserta_id"/>
							</tree>
						</field>
					</group>
					<footer>
	                    <button name="tambah_peserta" string="Tambah" type="object" class="oe_highlight"/>
	                    or 
	                    <button string="Cancel" class="oe_link" special="cancel" />
	                </footer>
				</form>
			</field>
		</record>


Alhamdulillah kita bisa menyelesaikan lanjutan tutorial training ini, semoga yang sedikit ini dari saya bisa memberikan manfaat yang banyak. Aamiin …

Advertisements

5 thoughts on “Technical Training -Part 10-

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