我想通过用户输入的值来比较字段many2many line_mission
的值,只是为了检查某个员工是否已经在某个时间间隔内,我尝试了这段代码,但是它不起作用:
我的字段Many2many:
line_mission = fields.Many2many('hr.employee', string='Employés', help="Employee sent on mission",
copy=True, auto_join=True,readonly=True, states={'draft': [('readonly', False)]})
我的功能是检查员工是否在mission_start_date
和mission_end_date
之间:
@api.multi
@api.constrains('mission_start_date', 'mission_end_date')
@api.depends('line_mission.name')
def _check_date(self):
for mission in self:
employee = self.env['hr.employee'].search_count([('name', '=', self.id)])
domain = [
('mission_start_date', '<=', mission.mission_end_date),
('mission_end_date', '>=', mission.mission_start_date),
('id', '!=', mission.id),
('state', 'not in', ['end_mission']),
]
nmissions = self.search_count(domain)
if employee in mission.line_mission.name and nmissions:
raise UserError(_('Vous ne pouvez pas avoir 2 missions qui se chevauchent le même jour!'))
答案 0 :(得分:2)
您的功能存在一些问题。
您不需要使用api.depends
,因为api.constrains
已经在触发该功能。
您应在line_mission
中添加api.constrains
,因为如果更改了employee many2many字段,则应检查约束。
尝试遵守Odoo准则,并将您的many2many字段从line_mission
重命名/重构为employee_ids
或employee_on_mission_ids
。
如果以后需要使用记录(集合),请不要使用search_count
。 Meant是foreach循环的第一行。
在比较中使用记录(设置),例如在您的if
中。
@api.multi
@api.constrains('mission_start_date', 'mission_end_date', 'line_mission')
def _check_date(self):
for mission in self:
# the following search is really weird
# do you always find exactly one?
# do you really want to search on `name` with `ìd`?
employee = self.env['hr.employee'].search([('name', '=', self.id)])
domain = [
('mission_start_date', '<=', mission.mission_end_date),
('mission_end_date', '>=', mission.mission_start_date),
('id', '!=', mission.id),
('state', 'not in', ['end_mission']),
]
nmissions = self.search_count(domain)
# check if record is in recordset
if employee in mission.line_mission and nmissions:
raise UserError(_('Vous ne pouvez pas avoir 2 missions qui se chevauchent le même jour!'))