Saat anda menggunakan odoo, pernahkah anda memiliki pertanyaan mengenai apa itu External ID ? Seperti saat anda akan meng-export suatu data, misal master customer seperti pada gambar di bawah ini.
Atau saat anda mengedit tampilan suatu form, seperti pada gambar dibawah ini.
Sebenarnya apa sih External ID itu ? Dan apa fungsinya ?
Pada dasarnya External ID adalah gabungan antara beberapa field dari model ir.model.data yang digunakan untuk mencatat suatu data yang tersimpan pada suatu tabel di database dibuat dari module apa, disimpan pada tabel apa, dan berapa primary key-nya. Lihat source code model ir.model.data di halaman github odoo.
Sebagai contoh, misal kita memiliki file xlsx / csv hasil export seperti pada gambar di bawah ini.
External ID biasanya adalah gabungan antara field module dan field name dari model ir.model.data. Dengan membaca External ID kita bisa mengetahui data tersebut dibuat secara manual oleh user lewat User Interface odoo, atau dibuat secara otomatis saat user menginstall / mengupgrade suatu module.
Misal, External ID data baris pertama pada gambar diatas adalah __export__.res_partner_44_df40f25d. Tidak ada module dengan nama __export__ pada odoo, sehingga bisa dipastikan bahwa data ini dibuat secara manual oleh user lewat user interface.
Pada data baris kedua External ID-nya adalah base.res_partner_12. Ada module dengan nama base pada odoo, sehingga bisa dipastikan data ini dibuat secara otomatis, saat module base diinstall / diupgrade oleh user.
Artinya data ini ditulis di salah satu file di module base itu. Jika anda tidak percaya silakan lihat di halaman github odoo ini.
Dengan berbekal External ID dan sedikit SQL, kita bisa melihat beberapa informasi mengenai suatu data. Misal seperti pada gambar dibawah ini.
Dari gambar diatas, bisa kita lihat bahwa External ID base.res_partner_12 mengarah ke model res.partner dengan res_id (primary key) bernilai 14. Ok, sekarang mari kita lihat data di model res.partner tersebut.
Terlihat datanya sama dengan file hasil export.
Atau jika anda keberatan untuk menulis perintah SQL bisa menggunakan python, seperti pada contoh dibawah ini.
# mengetahui model dan res_id (primary key) terkait data = self.env['ir.model.data'].xmlid_to_res_model_res_id('base.res_partner_12') if data: # mengetahui nama model yang terkait print(data[0]) # mengetahui res_id (primary key) yang terkait print(data[1]) # mengetahui data aktual secara langsung # misal jika kita sudah tahu model yang terkait adalah res.partner # kita bisa ambil data yang dibutuhkan, misal nama dan negara partner = self.env['ir.model.data'].xmlid_to_object('base.res_partner_12') if partner: print(partner.name) print(partner.country_id.name)
Saya mendapat feedback dari pengguna twitter bahwa odoo memiliki cara yang lebih ringkas untuk mengakses object suatu data dengan External ID. Terima kasih @ray_odoo atas masukkannya. Berikut ini adalah cara untuk mendapatkan nama dan negara dari partner dengan External ID base.res_partner_12 di atas dengan cara yang lebih ringkas.
partner = self.env.ref('base.res_partner_12') if partner: print(partner.name) print(partner.country_id.name)
Dengan mengetahui suatu External ID kita bisa mengubah data melalui module atau addons lain, misal kita buat module atau addon custom. Umumnya digunakan untuk mengoverride atau inherit suatu view atau tampilan. Sehingga saat kita menginstall atau mengupgrade module atau addon custom tersebut, data yang kita inginkan bisa berubah secara otomatis, user tidak perlu mengubahnya lewat user interface. Sebagai contoh berikut ini adalah cara mengganti nama customer dengan External ID base.res_partner_12 di atas.
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="base.res_partner_12" model="res.partner"> <field name="name">Azure Exterior</field> </record> </odoo>
Berikut ini adalah tampilan customer setelah module custom dengan kode di atas diinstall / diupgrade. Terlihat nama-nya sudah berubah.
Saat kita menulis External ID di file xml untuk membuat record baru, pastikan dalam satu module / addon tidak ada record dengan External ID yang sama, walaupun beda file. Juga tidak boleh mengandung spasi. Usahakan untuk menggunakan huruf kecil semua, dan setiap kata dipisahkan dengan underscore, agar nampak seragam. Nama module / addon boleh tidak disertakan. Karena secara otomatis akan disertakan oleh odoo. Sebagai contoh pada source code odoo ini nama module / addon base tidak ditulis.
Tetapi jika kita ingin mengoverride data dari module lain, kita harus menulis External ID lengkap dengan nama module. Begitu pula jika kita menulis External ID di file python.