[Odoo 10] Technical Documentation -Part 4-

Alhamdulillah kita bisa lanjutkan kembali tutorial ini. Untuk selanjutnya kita akan membahas relasi antar object atau model. Sebuah record dalam suatu model, biasanya memiliki hubungan dengan record di model lain, contohnya model sale_order memiliki relasi dengan sale_order_line dengan field penghubung yaitu order_line dan order_id. Odoo menyiapkan beberapa field relasi untuk kebutuhan ini, diantaranya adalah many2one, one2many dan many2many.

Object sales_order memiliki field one2many (order_line) yang berbentuk tabel product yaitu object sale_order_line, fungsinya untuk memperinci product apa saja yang di jual dalam Sales Order terkait, di dalam Odoo, setiap field one2many harus memiliki field many2one di tabel tujuan. Maka di object sale_order_line, ada field order_id sebagai foreign key dari tabel sale_order. Oleh karna itu setiap kita mendefinikan field one2many, disana kita harus menentukan field many2one yang akan menjadi relasi antar kedua tabel. Kita perhatikan contoh relasi kedua tabel tersebut :


class SaleOrder(models.Model):

    _name = "sale.order"
    
    order_line = fields.One2many('sale.order.line', 'order_id', string='Order Lines', states={'cancel': [('readonly', True)], 'done': [('readonly', True)]}, copy=True)


class SaleOrderLine(models.Model):

    _name = 'sale.order.line'
    
    order_id = fields.Many2one('sale.order', string='Order Reference', required=True, ondelete='cascade', index=True, copy=False)

Pada training kali ini, kita juga akan membuat relasi antar tabel seperti contoh diatas, yaitu antara tabel training_kursus dan training_sesi. Object/Tabel training_sesi berfungsi sebagai perinci tabel training_kursus. Contohnya jika kita mengikuti sebuah kursus, maka setiap kursus memiliki beberapa sesi. Jika kursusnya adalah “Functional Odoo”, maka sesinya adalah “Introduction”, “Sales Management”, “Case Study”, dll. Sekarang kita praktekan dengan membuat object training_sesi seperti dibawah ini (lanjutkan copas di bawah class kursus() sebelumnya) :

    
class Sesi(models.Model):
    _name = 'training.sesi'
    
    name = fields.Char(required=True)
    start_date = fields.Date()
    duration = fields.Float(digits=(6, 2), help="Durasi Hari")
    seats = fields.Integer(string="Jumlah Kursi")
    instructor_id = fields.Many2one('res.partner', string="Instruktur")

Object training_sesi hanya memiliki 4 field dengan tipe yang berbeda-beda, selanjutnya kita tentukan menu dan view nya agar user bisa mengaksesnya (lanjutkan copas di bawah menu kursus sebelumnya) :


	<!-- ### Membuat Tampilan Tree/List 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="Sesi List">
				<field name="name"/>
				<field name="start_date"/>
				<field name="duration"/>
				<field name="seats"/>
				<field name="instructor_id"/>      
	        </tree>
	    </field>
	</record>
	
	
	<!-- ### Membuat Tampilan Form Sesi ### -->
		
	<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="Sesi Form">
				<sheet>
					<group>
						<field name="name"/>
						<field name="start_date"/>
						<field name="duration"/>
						<field name="seats"/>
						<field name="instructor_id"/>
					</group>
				</sheet>
			</form>
		</field>
	</record>
	
	
	<!-- ### Membuat Action/Event Object Sesi ### -->
	
	<record model="ir.actions.act_window" id="sesi_list_action">
		<field name="name">Sesi</field>
		<field name="res_model">training.sesi</field>
		<field name="view_type">form</field>
		<field name="view_mode">tree,form</field>
	</record>
	
	
	<!-- ### Membuat Sub Menu Sesi ### -->
	
	<menuitem id="sesi_menu" name="Sesi" parent="training_odoo_menu" action="sesi_list_action"/>
		
		    	    		

Bila kita upgrade modul training kita, maka hasilnya seperti berikut :

Pada object training_sesi, kita belum membuat relasi apapun terhadap training_kursus. Sekarang kita tambahkan field relasinya seperti contoh relasi antar object sale_order dan sale_order_line. Seperti berikut :



class Kursus(models.Model):

    _name = 'training.kursus'

    ...
        
    session_ids = fields.One2many('training.sesi', 'course_id', string="Sesi")
    
class Sesi(models.Model):

    _name = 'training.sesi'
    
    ...
    
    course_id = fields.Many2one('training.kursus', ondelete='cascade', string="Kursus", required=True)


Attribute ondelete=’cascade’ memiliki arti jika record kursus dihapus, maka semua record sesi yang menginduk ke kursus tersebut juga akan dihapus. Kemudian tampilannya juga harus kita rubah agar sesuai dengan relasinya (replace sesuai id xml terkait) :



	<!-- ### Membuat Tampilan Form Kursus ### -->
	
	<record model="ir.ui.view" id="kursus_form_view">
	    <field name="name">training.kursus.form</field>
	    <field name="model">training.kursus</field>
	    <field name="arch" type="xml">
            <form string="Kursus Form">
	            <sheet>
	                <group>
	                    <field name="name"/>
	                </group>
	                <notebook>
	                    <page string="Keterangan">
	                        <field name="description"/>
	                    </page>
	                    <page string="Sesi">
							<field name="session_ids">
								<tree string="Daftar Sesi">
									<field name="name"/>
									<field name="instructor_id"/>
								</tree>
								<form>
									<group string="Informasi">
										<field name="name"/>
										<field name="instructor_id"/>
									</group>
									<group string="Jadwal">
										<field name="start_date"/>
										<field name="duration"/>
										<field name="seats"/>
									</group>
								</form>
							</field>
						</page>
	                </notebook>
	            </sheet>
	        </form>
	    </field>
	</record>
	
	


	<!-- ### Membuat Tampilan Tree/List 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="Sesi List">
				<field name="name"/>
				<field name="course_id"/>
				<field name="start_date"/>
				<field name="duration"/>
				<field name="seats"/>
				<field name="instructor_id"/>      
	        </tree>
	    </field>
	</record>
	
	
	<!-- ### Membuat Tampilan Form Sesi ### -->
		
	<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="Sesi Form">
				<sheet>
					<group>
						<group string="Informasi">
							<field name="course_id"/>
							<field name="name"/>
							<field name="instructor_id"/>
						</group>
						<group string="Jadwal">
							<field name="start_date"/>
							<field name="duration"/>
							<field name="seats"/>
						</group>
					</group>
				</sheet>
			</form>
		</field>
	</record>
	




Hasil dari perubahan coding di atas sebagai berikut :

Setelah kita berhasil menambahkan field relasi one2many dan many2one, maka ada 1 field relasi yang tesisa, yaitu many2many. Terakhir kita tambahkan field many2many kepada object training_sesi seperti berikut :

    
class Sesi(models.Model):

    _name = 'training.sesi'
    
    ...
    
    attendee_ids = fields.Many2many('res.partner', string="Peserta")
    

Sebelum kita update view xmlnya, sebagai penutup tutorial kali ini, saya ingin tambahkan lagi field relasi yang terakhir yaitu field many2one seperti berikut :


class Kursus(models.Model):

    _name = 'training.kursus'

    ...
        
    responsible_id = fields.Many2one('res.users', ondelete='set null', string="Penanggung Jawab", index=True)

Sekarang kita update tampilannya (perhatikan id xml nya untuk pengeditan) :




	<!-- ### Membuat Tampilan Tree/List Kursus ### -->
	
	<record model="ir.ui.view" id="kursus_tree_view">
	    <field name="name">training.kursus.tree</field>
	    <field name="model">training.kursus</field>
	    <field name="arch" type="xml">
	        <tree string="Kursus List">
	            <field name="name"/>
	            <field name="responsible_id"/>
	            <field name="description"/>       
	        </tree>
	    </field>
	</record>
	
	
	<!-- ### Membuat Tampilan Form Kursus ### -->
	
	<record model="ir.ui.view" id="kursus_form_view">
	    <field name="name">training.kursus.form</field>
	    <field name="model">training.kursus</field>
	    <field name="arch" type="xml">
	        <form string="Kursus Form">
	            <sheet>
	                <group>
	                    <field name="name"/>
	            		<field name="responsible_id"/>
	                </group>
	                <notebook>
	                    <page string="Keterangan">
	                        <field name="description"/>
	                    </page>
	                    <page string="Sesi">
							<field name="session_ids">
								<tree string="Daftar Sesi">
									<field name="name"/>
									<field name="instructor_id"/>
								</tree>
								<form>
									<group string="Informasi">
										<field name="name"/>
										<field name="instructor_id"/>
									</group>
									<group string="Jadwal">
										<field name="start_date"/>
										<field name="duration"/>
										<field name="seats"/>
									</group>
								</form>
							</field>
						</page>
	                </notebook>
	            </sheet>
	        </form>
	    </field>
	</record>
	

	
	<!-- ### Membuat Tampilan Form Sesi ### -->
		
	<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="Sesi Form">
				<sheet>
					<group>
						<group string="Informasi">
							<field name="course_id"/>
							<field name="name"/>
							<field name="instructor_id"/>
						</group>
						<group string="Jadwal">
							<field name="start_date"/>
							<field name="duration"/>
							<field name="seats"/>
						</group>
						<group string="Peserta" colspan="2">
							<field name="attendee_ids" nolabel="1"/>
						</group>						
					</group>
				</sheet>
			</form>
		</field>
	</record>
	


	

Hasilnya seperti gambar berikut :

Alhamdulillah kita telah menyelesaikan tutorial kali ini, bagi yang belum berhasil baik karna syntax error ataupun lainnya, silahkan mendownload hasil materi 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