Dynamic Domain fields One2many di odoo

Assalamu'alaikum saya akan berbagi pengalaman selama menjadi programmer odoo, kali ini saya akan menjelaskan tentang dynamic domain di odoo. kali ini kita menggunakan odoo 10.

Pertama kita definisikan fields many2many untuk menyimpan list id yang akan ditampilkan di fields one2many, di fields many2many kita gunakan compute untuk mengambil data yang akan di tampilkan di one2many.

list_rab = fields.Many2many(comodel_name='project.rab', string='RAB Domain', compute='_get_domain_rab')


lalu kita buat method compute untuk fields list_rab

    @api.one
@api.depends('tim_line')
def _get_domain_rab(self):
list_rab = self.env['project.rab'].search([('project_id','=',self.id)])
list_jabatan = ['kapro','wakapro','keka']
sql_st = """ select pt.name ,pt.jabatan
from project_team pt
left join hr_employee emp on emp.id = pt.employee_id
left join resource_resource res on res.id=emp.resource_id
where pt.project_id = %s and res.user_id = %s """ % (self.id,self.env.uid)

self.env.cr.execute(sql_st)
st = self.env.cr.dictfetchall()
if st:
for x in st:
if x['jabatan'] in list_jabatan:
self.list_rab = list_rab
else:
self.list_rab = [False]
else:
self.list_rab = list_rab


perhatikan self.list_rab = list_rab dan self.list_rab = [False] di coding yang ini akan mengembalikan nilai list_rab yang ada di function ke dalam fields. 

jangan lupa untuk menambahkan fields list_rab kedalam file xml.

setelah kita mendapatkan data yang akan ditampilkan di fields rab, sekarang kita akan memberi domain ke fields one2many-nya.

    rab_line = fields.One2many('project.rab', 'project_id', 'Internal/External RAB',domain=lambda self:[('id','in',self.execute_domain(self.list_rab))])

def execute_domain(self,data):
list = [x.id for x in data]
return list


pada coding domain=lambda self:[('id','in',self.execute_domain(self.list_rab)) untuk menggunakan variable self, biasanya menggunakan lambda self: berikutnya memanggil fungsi execute_domain untuk merubah fields many2many menjadi list yang akan digunakan sebagai domain.