Context pada Odoo

Context adalah “python dictionary” yang berisi informasi tentang aplikasi Odoo yang sedang berjalan. Setiap aplikasi yang berjalan di Odoo pasti mempunyai context, ada banyak informasi yang bisa kita ketahui dari aplikasi yang dijalankan antara lain:

  • lang = language, bahasa yang digunakan user
  • tz  = timezone, zona waktu yang digunakan user
  • active_model = model yang sedang ditangani pada sebuah session di Odoo
  • active_id = id model yang ada pada active_model
  • dan masih banyak informasi lainnya

Informasi yang ada di context bervariasi, tergantung active_model yang sedang ditangani oleh session Odoo.

Mengambil informasi pada context.

Untuk mengambil data dari aplikasi yang berjalan Odoo, kita bisa menggunakan “self.env.context” atau dengan shorthand “self._context”. Karena bentuk dari context adalah dictionary maka kita bisa menggunakan fungsi yang ada seperti self._context.get(‘key’), self._context.has_key(‘key’), dan fungsi-fungsi lainnya.

Silakan anda bisa mencoba menambahkan print self._context pada suatu method di script models anda, lalu perhatikan hasil dari print tersebut.

Menambahkan / passing data melalui context pada sebuah form.

Dengan context, selain kita bisa mengambil data dari sebuah form, kita juga bisa menggunakan context untuk mem-passing data ke sebuah form.

Misal kita mempunyai model awal seperti ini:

class TestModel1(models.Model):
	_name = 'test.model1'

	name = fields.Char(string="Nama", required=True)
	is_active = fields.Boolean(string="Active")

Dan tampilan view seperti ini:

<odoo>
	<data>
		<!-- tree view -->
		<record model="ir.ui.view" id="view_test_model1_tree">
			<field name="name">test.model1.tree</field>
			<field name="model">test.model1</field>
			<field name="arch" type="xml">
				<tree>
					<field name="name"/>
					<field name="is_active"/>
				</tree>
			</field>
		</record>s

		<!-- form view -->
		<record model="ir.ui.view" id="view_test_model1_form">
			<field name="name">test.model1.form</field>
			<field name="model">test.model1</field>
			<field name="arch" type="xml">
				<form>
					<sheet>
						<group>
							<group>
								<field name="name"/>
							</group>
							<group>
								<field name="is_active"/>
							</group>
						</group>
					</sheet>
				</form>
			</field>
		</record>

		<!-- search view-->
		<record model="ir.ui.view" id="view_test_model1_search">
			<field name="name">test.model1.search</field>
			<field name="model">test.model1</field>
			<field name="arch" type="xml">
				<search>
					<field name="name"/>
				</search>
			</field>
		</record>

		<!-- action -->
		<record model="ir.actions.act_window" id="action_view_test_model1">
			<field name="name">Test Model1</field>
			<field name="res_model">test.model1</field>
			<field name="view_type">form</field>
			<field name="view_mode">tree,form</field>
			<field name="view_id" ref="view_test_model1_tree"/>
			<field name="search_view_id" ref="view_test_model1_search"/>
		</record>

		<!-- menuitem -->
		<menuitem action="action_view_test_model1" id="menu_test_model1"/>
	</data>
</odoo>

Sehingga tampilan awal dari program seperti ini:

Untuk mem-passing data melalui context bisa dilakukan di sebuah action view. Contohnya, buat tambahan menu dan action di view xml:

<!-- menu baru -->
<menuitem id="menu_test_model1_context" name="Test Model Context"/>

<!-- action untuk menampilkan data is_active yang bernilai true -->
<record model="ir.actions.act_window" id="action_view_test_model1_force_true">
	<field name="name">Test Model Force True</field>
	<field name="res_model">test.model1</field>
	<field name="view_type">form</field>
	<field name="view_mode">tree,form</field>
	<field name="view_id" ref="view_test_model1_tree"/>
	<field name="search_view_id" ref="view_test_model1_search"/>
	<field name="domain">[('is_active', '=', True)]</field>
	<field name="context">{'default_is_active': True}</field>
</record>

<!-- menu untuk force true -->
<menuitem action="action_view_test_model1_force_true" id="menu_test_model1_force_true" parent="menu_test_model1_context"/>

Pada script diatas kita membuat suatu action baru yang “memaksa” sistem untuk menampilkan tree view dimana field is_active bernilai True. Sistem dipaksa karena kita menggunakan <field name="domain">[('is_active', '=', True)]</field>. Hasil dari script diatas bisa dilihat seperti ini:

Action diatas juga mempunyai <field name="context">{'default_is_active': True}</field>. Maksud dari script diatas adalah, kita mempassing nilai is_active = True. Cara mem-passingnya yaitu membuat dictionary dan menambahkan “default_” sebagai prefix kemudian diikuti dengan “nama_field” untuk mempassing nilai ke sebuah form. Passing context diatas mengakibatkan field is_active bernilai True pada saat kita create record baru.

Menambahkan / passing data melalui context pada sebuah form search di tree view.

Selain dengan cara memaksa melalui domain, kita bisa memanfaatkan search untuk menampilkan data di tree view sesuai dengan kebutuhan kita, tentunya dengan melalui context untuk mem-passing data. Terlebih dahulu modifikasi search view seperti dibawah ini:

<!-- modifikasi search view-->
<record model="ir.ui.view" id="view_test_model1_search">
	<field name="name">test.model1.search</field>
	<field name="model">test.model1</field>
	<field name="arch" type="xml">
		<search>
			<field name="name"/>
			<filter name="set_active" domain="[('is_active', '=', True)]" string="Status Aktif"/>
			<filter name="set_not_active" domain="[('is_active', '=', False)]" string="Status Tidak Aktif"/>
		</search>
	</field>
</record>

Lalu kita buat action dan menu yang baru, agar bisa kelihatan perbedaan dengan cara sebelumnya.

<!-- action untuk menampilkan data is_active yang bernilai true melalui search -->
<record model="ir.actions.act_window" id="action_view_test_model1_search_true">
	<field name="name">Test Model Search True</field>
	<field name="res_model">test.model1</field>
	<field name="view_type">form</field>
	<field name="view_mode">tree,form</field>
	<field name="view_id" ref="view_test_model1_tree"/>
	<field name="search_view_id" ref="view_test_model1_search"/>
	<field name="context">{
		'search_default_set_active': 1,
		'default_is_active': True
	}</field>
</record>

<!-- menu untuk search true -->
<menuitem action="action_view_test_model1_search_true" id="menu_test_model1_search_true" parent="menu_test_model1_context"/>

<!-- action untuk menampilkan data is_active yang bernilai false melalui search -->
<record model="ir.actions.act_window" id="action_view_test_model1_search_false">
	<field name="name">Test Model Search False</field>
	<field name="res_model">test.model1</field>
	<field name="view_type">form</field>
	<field name="view_mode">tree,form</field>
	<field name="view_id" ref="view_test_model1_tree"/>
	<field name="search_view_id" ref="view_test_model1_search"/>
	<field name="context">{
		'search_default_set_not_active': 1,
		'default_is_active': False
	}</field>
</record>

<!-- menu untuk search false -->
<menuitem action="action_view_test_model1_search_false" id="menu_test_model1_search_false" parent="menu_test_model1_context"/>

Penjelasan dari script diatas adalah, kita memodifikasi search view dengan menambahkan beberapa filter, lalu kita membuat action baru yang akan menampilkan data field ‘is_active’ yang bernilai True atau False melalui filter search view.

Caranya dengan menambahkan ‘search_default_set_active’: 1 dan ‘search_default_set_not_active’: 1. “search_default_” adalah prefix untuk mem-passing nilai ke filter search, kemudian diikuti dengan “filter_name” yang sudah dideklarasikan di search view dan nilainya = 1. Hasil bisa dilihat di gambar bawah.

Selain itu kita juga bisa menambahkan domain saat memanggil sebuah action pada sebuah method python, seperti:

class OtherModel(models.Model):
	_name = 'other.model'

	# untuk memanggil action dari python.
	def call_action_model1(self):
		action = self.env.ref('some_module.action_view_model1')
		result = action.read()[0]
		# tambahkan context seperti ini jika dibutuhkan
		result['context'] = {
			'search_default_set_active': 1,
			'default_is_active': True
		}
		return result

 

Catatan singkat:

  • Context adalah dictionary python.
  • Context digunakan untuk mengambil informasi dari sebuah aplikasi yang dihandle oleh session Odoo.
  • Context juga dapat digunakan untuk passing data ke form saat create dengan contoh <field name="context">{'default_is_active': True}</field>.
  • Untuk passing data ke form, “default_” adalah prefix kemudian diikuti “nama_field” dan diberi nilai seperti yang didefinisikan di model.
  • Untuk mengatur tree view melalui search filter, menggunakan “search_default_” sebagai prefix kemudian diikuti dengan “filter_name” yang sudah dideklarasikan di search view dan dengan nilai = 1.
  • Context biasa dikombinasikan dengan domain.

Terima kasih sudah membaca. Selamat mencoba.

Comments

1 komentar untuk “Context pada Odoo”

  1. Ping-kembali: Domain pada Odoo - Cak Juice

Komentar ditutup.