Trik Menulis Domain Odoo dengan Mudah Menggunakan Module odoo.osv.expression

Pada tulisan saya sebelumnya, saya telah menulis bahwa : menulis domain pada odoo tidaklah mudah. Oleh karena itu kita harus punya beberapa trik untuk mengakalinya. Pada tulisan tersebut, saya telah menulis salah-satu trik yang biasa saya gunakan, yaitu mengubah domain menjadi SQL Query, sehingga kita bisa menganalisanya.

Kali ini saya akan menulis trik kedua yang biasa saya gunakan. Yaitu dengan memanfaatkan module odoo.osv.expression bawaan odoo. Jika cara kedua ini dikombinasikan dengan cara yang pertama, harusnya menulis domain pada odoo bukanlah suatu pekerjaan yang sulit untuk dilakukan.

Untuk mengikuti tutorial ini, pastikan anda sudah membaca trik pertama di atas, dan pastikan anda sudah menginstall module domain_to_sql. Kemudian import module expression dengan kode di bawah ini.

from odoo.osv import expression

Sebagai contoh kasus, katakanlah kita punya query seperti ini.

SELECT
	id
FROM res_partner
WHERE 
	name ilike '%azure%' OR
	email ilike '%gmail%'

Yang perlu kita lakukan adalah, menulis setiap kondisi pada klausa where di atas menjadi sebuah domain yang terpisah. Query di atas memiliki 2 buah kondisi yaitu name ilike ‘%azure%’ dan email ilike ‘%gmail%’. Sehingga kita bisa menulis domain untuk 2 kondisi di atas seperti pada kode di bawah ini.

first_condition = [('name','ilike','azure')]
second_condition = [('email','ilike','gmail')]

Setelah kita selesai menulis setiap kondisi pada klausa where menjadi domain yang terpisah, langkah yang perlu kita lakukan selanjutnya adalah, menggabung semua domain/kondisi di atas menjadi sebuah domain tunggal dengan memanfaatkan module expression bawaan odoo.

Ada 2 function milik module expression yang bisa kita manfaatkan untuk menulis domain dengan mudah. Yaitu function AND dan function OR. SQL Query di atas, kedua kondisinya dihubungkan dengan operator OR, oleh karena itu kita bisa menggunakan function OR milik module expression untuk menggabungkan kedua domain yang telah kita buat menjadi satu domain tunggal. Perhatikan kode di bawah ini.

first_condition = [('name','ilike','azure')]
second_condition = [('email','ilike','gmail')]

domain = expression.OR([first_condition, second_condition])
print('The final domain ======')
print(domain)

query = self.env['res.partner'].with_context({'active_test': False}).get_query(domain)
print('The SQL Query generated =======')
print(query)

result = self.env['res.partner'].with_context({'active_test': False}).search(domain)
print('The result =======')
print(result)

Dan berikut ini adalah hasil dari kode di atas di komputer saya.

Membuat domain menggunakan module expression

Contoh kasus yang kedua, katakanlah kita memiliki query seperti pada kode di bawah ini.

SELECT
	id
FROM res_partner
WHERE 
	mobile ilike '%62%' OR
	(
		name ilike '%azure%' AND
		email ilike '%gmail%'
	)

Query di atas memiliki tiga buah kondisi, dimana kondisi kedua dan ketiga ditulis dalam sebuah tanda kurung, yang artinya kedua kondisi tersebut berada dalam satu blok. Bagaiman cara mengubah query di atas menjadi sebuah domain dengan module expression ?

Langkah pertama yang harus kita lakukan adalah menulis semua kondisi menjadi sebuah domain yang terpisah, seperti pada contoh kasus sebelumnya.

first_condition = [('mobile','ilike','62')]        
second_condition = [('name','ilike','azure')]
third_condition = [('email','ilike','gmail')]

Kemudian gabung kondisi yang ada di dalam kurung (dalam satu blok) menjadi domain tersendiri. Pada query di atas kondisi kedua dan ketiga berada di dalam tanda kurung, oleh karena itu kita perlu menggabung kedua kondisi di atas menjadi sebuah domain tersendiri.

second_plus_third_condition = expression.AND([second_condition, third_condition])

Jika semua kondisi dalam kurung sudah digabung menjadi sebuah domain tersendiri, langkah terakhir yang perlu kita lakukan adalah, menggabung domain menjadi sebuah domain tunggal yang final, seperti pada kode di bawah ini.

first_condition = [('mobile','ilike','62')]        
second_condition = [('name','ilike','azure')]
third_condition = [('email','ilike','gmail')]

second_plus_third_condition = expression.AND([second_condition, third_condition])

domain = expression.OR([first_condition, second_plus_third_condition])
print('The final domain ======')
print(domain)

query = self.env['res.partner'].with_context({'active_test': False}).get_query(domain)
print('The SQL Query generated =======')
print(query)

result = self.env['res.partner'].with_context({'active_test': False}).search(domain)
print('The result =======')
print(result)

Kode di atas jika dieksekusi di komputer saya, hasilnya akan terlihat seperti pada gambar di bawah ini.

Membuat domain menggunakan module expression

Jika kita rapikan querynya, maka akan terlihat seperti ini.

SELECT 
	"res_partner".id 
FROM "res_partner" 
WHERE 
	(
		("res_partner"."mobile"::text ilike '%62%') OR 
		(
			("res_partner"."name"::text ilike '%azure%') AND 
			("res_partner"."email"::text ilike '%gmail%')
		)
	)

Bagaimana ? Hasil querynya sudah sama dengan query yang sudah disiapkan sebagai contoh kasus bukan ?

Setelah mengetahui kedua trik menulis domain dengan mudah ini, saya harap Anda tidak lagi mengalami kesulitan dalam menulis domain yang kompleks lagi.

Yang terakhir, yang jadi pertanyaan, jika kita sudah mendapatkan domain yang kita inginkan, dan sudah dites dan terbukti hasilnya benar, perlukah kita menghapus kode penggabungan domain dengan module expression dan hanya menyisakan domain final seperti pada kode di bawah ini ?

domain = ['|', ('mobile', 'ilike', '62'), '&', ('name', 'ilike', 'azure'), ('email', 'ilike', 'gmail')]

result = self.env['res.partner'].with_context({'active_test': False}).search(domain)
print('The result =======')
print(result)

Keputusan saya serahkan pada Anda.

Tulisan Serupa

Leave a Reply