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

Kita bisa mengubah value field pada model apapun selama ada relasi Many2one atau One2many atau Many2many ke model tersebut.

misal mengubah value standard_price menjadi 20 ribu di product.template dalam fungsi onchange product.product


    self.product_tmpl_id.standard_price = 20000

atau

    self.product_tmpl_id.write({

        'standard_price': 20000

    })