[Odoo 10] Technical Documentation -Part 10-

Alhamdulillah kita bisa melanjutkan lagi tutorial ini. Selanjutnya kita akan membahas tentang wizard di Odoo.

Wizard di Odoo digunakan untuk komunikasi interaktif dengan user, biasanya berbentuk popup atau dialog box, yang tampilannya bersifat dinamis. Wizard sama seperti model lain tetapi lebih simple dan memiliki ciri khas seperti berikut :

– Wizard menggunakan (inherite) class TransientModel() bukan Model()

– Karna menginherite TransientModel(), maka sesuai namanya, recordnya bersifat sementara, pada periode waktu tertentu akan dihapus secara otomatis dari database

– Model atau object dari wizard tidak memiliki akses right, semua user bisa mengaksesnya

– Sebuah record dari wizard bisa memiliki field relasi ke model lain yang biasa, tetapi tidak sebaliknya

Sekarang kita akan membuat sebuah wizard untuk menambah jumlah peserta pada sesi. Ikuti langkah-langkah berikut :

1. Buat folder baru bernama wizard di dalam modul training_odoo

2. Update file __init__.py untuk menambahkan (import) folder wizard yang baru kita buat


from . import wizard

3. Buat 2 file python baru di dalam folder wizard

A. file __init__.py yang isinya :


from . import wizard

B. file wizard.py untuk membuat object wizard beserta fieldnya seperti berikut :



from odoo import models, fields, api

class Wizard(models.TransientModel):
    _name = 'training.wizard'

    def _default_sesi(self):
        return self.env['training.sesi'].browse(self._context.get('active_id'))
    
    session_id = fields.Many2one('training.sesi', string="Sesi", required=True, default=_default_sesi)
    attendee_ids = fields.Many2many('res.partner', string="Peserta")
    
    
    @api.multi
    def tambah_peserta(self):
        self.session_id.attendee_ids |= self.attendee_ids
        return {}


4. Buat file xml baru didalam folder wizard dengan nama wizard_view.xml yang isinya :


<odoo>
  <data>
  	
  	<!-- Membuat form wizard -->
	
	<record model="ir.ui.view" id="wizard_form_view">
		<field name="name">training.wizard.form</field>
		<field name="model">training.wizard</field>
		<field name="arch" type="xml">
			<form string="Tambah Peserta">
				<group>
					<field name="session_id"/>
					<field name="attendee_ids"/>
				</group>
				<footer>
					<button name="tambah_peserta" type="object" string="Tambah" class="oe_highlight"/>
					or
					<button special="cancel" string="Batal"/>
				</footer>
			</form>
		</field>
	</record>
	
	
	<!-- Membuat action baru-->
	
	<act_window id="launch_session_wizard"
				name="Tambah Peserta"
				src_model="training.sesi"
				res_model="training.wizard"
				view_mode="form"
				target="new"
				key2="client_action_multi"/>
				    	    
  </data>
</odoo>




Wizard dijalankan dengan event sama seperti model lain dengan tambahan field target=”new” (sehingga berbentuk popup). Cara diatas merupakan salah satu cara lain untuk menjalankan wizard, yaitu dari tombol Action model terkait. Cirinya dengan adanya field src_model dan key2.

Pada wizard diatas juga terdapat button khusus yaitu special=”cancel”. Fungsinya untuk keluar dari wizard tanpa melakukan penyimpanan atau pemrosesan data.

5. Terakhir kita update file __manifest__.py agar view wizard_view.xml bisa di ‘render’ :



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

Setelah kita restart dan upgrade modulnya, silahkan dicoba menambahkan peserta dengan wizard diatas, caranya dengan masuk ke tampilan list/tree sesi, lalu centang salah satu record, nanti akan muncul button dropdown Action pilih “Tambah Peserta”. Nanti akan muncul wizard yang telah kita buat, dan lakukan penambahan peserta pada sesi terkait.

Cara kedua untuk menjalankan wizard adalah dengan membuat menu item seperti biasa. Kita akan membuat menu item untuk wizard ini, bedanya dengan tambahan bahwa wizard dari menu item ini bisa menambahkan peserta langsung ke banyak sesi. Silahkan update code kita seperti berikut :



from odoo import models, fields, api

class Wizard(models.TransientModel):
    _name = 'training.wizard'

    def _default_sesi(self):
        return self.env['training.sesi'].browse(self._context.get('active_id'))
    
    session_id = fields.Many2one('training.sesi', string="Sesi", default=_default_sesi)
    attendee_ids = fields.Many2many('res.partner', string="Peserta")

    session_ids = fields.Many2many('training.sesi', string="Sesi")
    
    @api.multi
    def tambah_peserta(self):
        self.session_id.attendee_ids |= self.attendee_ids
        return {}
    
    
    @api.multi
    def tambah_banyak_peserta(self):
        for sesi in self.session_ids:
            sesi.attendee_ids |= self.attendee_ids
        return {}


Diatas kita tambahkan satu field baru yaitu session_ids yang tipenya many2many fungsinya agar bisa menambahkan peserta ke banyak sesi (karna sebelumnya hanya 1 sesi -many2one-). Kemudian kita update file xml kita seperti berikut :


				
					
					
  	<!-- Membuat form wizard dari menu item -->
	
	<record model="ir.ui.view" id="wizard_form_view_menu">
		<field name="name">training.wizard.menu.form</field>
		<field name="model">training.wizard</field>
		<field name="arch" type="xml">
			<form string="Tambah Peserta">
				<group>
					<field name="session_ids" widget="many2many_tags"/>
					<field name="attendee_ids"/>
				</group>
				<footer>
					<button name="tambah_banyak_peserta" type="object" string="Tambah" class="oe_highlight"/>
					or
					<button special="cancel" string="Batal"/>
				</footer>
			</form>
		</field>
	</record>
	
	
	<!-- Membuat action wizard dari menu item -->
	
	<act_window id="sesi_wizard_menu_action"
				name="Tambah Peserta"
				res_model="training.wizard"
				view_mode="form"
				view_id="wizard_form_view_menu"	
				target="new"/>
	

	<!-- ### Membuat Sub Menu Wizard ### -->
	
	<menuitem id="wizard_menu" name="Tambah Peserta" parent="training_odoo_menu" action="sesi_wizard_menu_action"/>
    


Kita definisikan ulang pembuatan form wizard karna ada field yang berbeda yaitu session_id dan session_ids. Secara default jika kita telah mendefiniskan view pada suatu model, maka action akan mengambil view tersebut, akan tetapi karna kita memiliki 2 view form dan kita ingin menentukan form mana yang akan kita tampilkan, maka kita harus mendefinisikan id form terkait pada action, yaitu pada baris ini :


view_id="wizard_form_view_menu"

Kita juga membuat method baru pada button “Tambah”, karna ada sedikit perbedaan dari kedua cara penambahan peserta. Silahkan upgrade modulnya dan lakukan simulasi dari menu item baru di bawah Sesi yaitu Tambah Peserta.

Bagi yang masih ada error, silahkan download modul tutorial ini disini.

Semoga bermanfaat, CMIIW …

Advertisements

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