Filtering many2one fields on one2many so can't be selected 2 times

Memfilter field many2one pada one2many agar tidak bisa dipilih 2 kali


Assalamu'alaikum Warahmatullahi Wabarakatuh,


        Bismillah... pada kesempatan kali ini sy akan sedikit berbagi pengelaman terkait cara agar ketika field pada one2many bisa di filter ketika sudah di pilih pada record header yang sama.


        Misalkan pada sebuah objek bernama res.upkeep, ada sebuah field bertipeone2many bernama upkeep_block_line ke tabel upkeep.block. pada one2many(ke upkeep.block) ada many2one bernama block_id. relasi many2one dari upkeep.block(child) ke res.upkeep(parent) adalah upkeep_id.


contoh nya:


       kita akan memilih block 01-00-aa




      maka ketika kita menambahkan record baru pada one2many dan memilih block, block yang sudah dipilih yaitu 01-00-aa tidak akan muncul lagi


       metode yang akan kita gunakan adalah onchange pada objek upkeep.block(child) dengan trigger nya adalah field many2one ke parent nya yaitu upkeep_id, logika yang kita gunakan adalah memfilter yang block nya tidak ada dalam daftar. pertama kita buat local variable list dan diisi tipe data list, upkeep_block = [ ]



       setelah itu kita buat kondisi untuk mengecek apakah upkeep_id nya kosong atau tidak, dengan

if self.upkeep_id: dan di dalam kondisi if tersebut kita buat perulangan one2many upkeep_block_line yang ada di header ke child, karena method kita berada di child maka kita harus menggunakan relasi ke header untuk melakukan perulangan dengan kode

for i in self.upkeep_id.upkeep_block_line: kemudian di dalam perulangan kita buat kondisi menggunakan logika yang sudah kita buat yaitu memfilter yang block nya tidak ada dalam daftar dengan kode


if not i.block_id.id in upkeep block:

jika block pada one2many masih belum ada pada daftar maka masukan ke dalam daftar

upkeep_block.append(i.block_id.id)


setelah mendapatkan daftar block yang boleh ditampilkan alias belum dipilih maka tinggal kita return domain pada method tersebut

return {

    'domain': {

        'block_id': [('id', 'not in ', upkeep_block)]

    }

}


kode lengkap nya seperti ini  








       

        Kesimpulannya, kita bisa memfilter agar suatu field pada one2many tidak akan terpilih dua kali pada satu record header dengan metode.

Jazakumullahu Khoiron . . .



.

 

 

Additional

        Dalam beberapa kasus, ada data yang tidak boleh ada lebih dari dua dalam satu list
cara ini bisa di akali dengan pengecekan algoritma seperti berikut

filtered_list = [ ]
warna = ['biru', 'hijau', 'hijau', 'merah', 'hitam', 'biru']

for i in warna:
    if not i in filtered_list:
        filtered_list.append(i)

list yang akan di filter di loop, kemudian di cek apakah data ini sudah ada atau belum pada hasil filter
jika belum ada maka masukan data itu ke dalam list hasil filter
ketika menemukan data yang sama maka data itu tidak akan dimasukan lagi ke dalam list hasil filter
dah hasil yang sudah di filter ada pada list filtered_list