Inheritance pada Odoo

Ada beberapa cara inheritance atau pewarisan pada Odoo. Inheritance pada Odoo tidak hanya ada pada sisi Python programming, tapi juga ada pada sisi XML view.

Odoo inheritance pada model

Referensi gambar.

Gambar diatas adalah penjelasan secara visual dari inheritance pada model. Sekarang saya akan jelaskan secara rinci, maksud dari gambar diatas.

Anggaplah kita mempunyai sebuah model awal seperti ini:

class Model1(models.Model):
	_name = 'model1'

	field_lama_1 = fields.Char()
	field_lama_2 = fields.Boolean()

	@api.multi
	def method_lama(self):
		............
		............

Contoh _inherit

class Model2(models.Model):
	_inherit = 'model1'
	
	field_baru_1 = fields.Integer()
	field_baru_2 = fields.Char()

	@api.multi
	def method_lama(self):
		super(Model2, self).method_lama()

Maka implikasinya adalah, pada tabel model1 di database akan ada penambahan field yaitu field_baru_1 & field_baru_2. Selain itu method pada class Model1 (sebagai contoh method_lama()) bisa diturunkan (override).

Contoh _inherit dengan pendeklarasian _name baru

class Model2(models.Model):
	_name = 'model2'
	_inherit = 'model1'

	field_baru_1 = fields.Integer()
	field_baru_2 = fields.Char()

	@api.multi
	def method_lama(self):
		super(Model2, self).method_lama()

Maka implikasinya adalah, kondisi tabel model1 di database tetap tidak berubah. Sistem membuat tabel baru bernama model2, dengan field column seperti pada tabel model1 dan ditambahkan dengan field baru yang dideklarasikan pada class Model2. Class Model2 tetap bisa melakukan override pada method class Model1.

Contoh _inherits pada fields.Many2one() dengan pendeklarasian _name baru

class Model2(models.Model):
	_name = 'model2'
	_inherits = {'model1': 'model1_id'}

	model1_id = fields.Many2one('model1', ondelete='cascade')
	field_baru_1 = fields.Integer()
	field_baru_2 = fields.Char()

	@api.multi
	def method_lama(self):
		super(Model2, self).method_lama()

Maka implikasinya adalah, kondisi tabel model1 di database tetap tidak berubah. Sistem membuat tabel baru bernama model2, dengan field column seperti pada tabel model1 dan ditambahkan dengan field baru yang dideklarasikan pada class Model2. Class Model2 tetap bisa melakukan override pada method class Model1.

Bedanya dengan contoh-2 adalah setiap create record baru pada model2, maka akan create record baru juga pada model1. Begitu juga jika update data record pada model2 akan berimbas juga pada model1, begitu pula sebaliknya jika update pada model1 akan berimbas juga pada model2.

Odoo inheritance pada view

Misalkan kita ingin membuat inheritance pada form model1. Berikut contoh kode untuk inheritance pada view.

<record model="ir.ui.view" id="view_model1_form_inherit">
	<field name="name">model1.form.inherit</field>
	<field name="model">model1</field>
	<field name="inherit_id" ref="view_model1_form"/>
	<field name="arch" type="xml">
		<!-- gunakan tag xpath untuk mengacu pada suatu elemen -->
		<xpath expr="//button[@name='test_button']" position="after">
			<button name="action_confirm" type="object" class="oe_highlight" string="Test Button 2"/>
		</xpath>
		
		<xpath expr="//field[@name='name']" position="before">
			<field name="number"/>
		</xpath>

		<xpath expr="//field[@name='name']" position="attributes">
			<attribute name="readonly">1</attribute>
		</xpath>

		<!-- anda juga bisa menggunakan tag field, jika elemennya acuannya adalah sebuah field -->
		<field name="description" position="after">
			<field name="address"/>
		</after>

		<field name="description" position="replace"/>
	</field>
</record>

Ada beberapa tipe position yang bisa digunakan yaitu:

  • inside: elemen baru dimasukkan (append) ke dalam elemen acuan.
  • replace: elemen baru untuk menggantikan elemen acuan. Jika tidak ada elemen baru, maka berarti menghapus elemen acuan saja.
  • before: elemen baru berada di posisi sebelum elemen acuan.
  • after: elemen baru berada di posisi setelah elemen acuan.
  • attributes: untuk merubah attribute dari elemen acuan.

Baca juga: Cara memanggil fungsi di model dari view XML.

Comments