1

I need to add dynamic domain for many2one field based another(bool) field without onchange function .. my code below doesn't work ..

is_bus_registered = fields.Boolean(
    string='Bus Registered',
    required=False)

def _domain_att_policy(self):
    if self.is_bus_registered:
        policies = self.env['hr.attendance.policy'].search([('is_bus_registered', '=', True)]).ids
        return [('id', 'in', policies)]
    else:
        policies = self.env['hr.attendance.policy'].search([('is_bus_registered', '=', False)]).ids
        return [('id', 'in', policies)]

att_policy_id = fields.Many2one('hr.attendance.policy', string='Attendance Policy', domain=_domain_att_policy)
omar ahmed
  • 635
  • 5
  • 19

2 Answers2

1

If you have the field is_bus_registered in your form view, the following field definition should be enough:

att_policy_id = fields.Many2one(
    comodel_name='hr.attendance.policy',
    string='Attendance Policy',
    domain='[("is_bus_registered", "=", is_bus_registered)]')

Have following in mind: if a user sets a policy with is_bus_registered==False and changes is_bus_registered afterwards to True, the policy won't change without an onchange event. That could lead to wrong policies. So using or definining an onchange event probably is not that bad.

CZoellner
  • 13,553
  • 3
  • 25
  • 38
0

I added another field many2many with onchange

@api.onchange('is_bus_registered')
def _onchange_is_bus_registered(self):
    for rec in self:
        if rec.is_bus_registered:
            rec.att_policy_id = False
            policy_ids = []
            policies = self.env['hr.attendance.policy'].search(
                [('is_bus_registered', '=', True)])
            for policy in policies:
                policy_ids.append(policy.id)
            rec.att_policy_ids = policy_ids
        else:
            rec.att_policy_id = False
            policy_ids = []
            policies = self.env['hr.attendance.policy'].search(
                [('is_bus_registered', '=', False)])
            for policy in policies:
                policy_ids.append(policy.id)
            rec.att_policy_ids = policy_ids


att_policy_ids = fields.Many2many('hr.attendance.policy', string='Attendance Policy')

and then added in form view but invisible and put it in static domain in many2one field .. it works fine

<field name="att_policy_ids" invisible="1"/>
<field name="att_policy_id" required="1" domain="[('id','in',att_policy_ids)]"/>
omar ahmed
  • 635
  • 5
  • 19