文章目录
- 需求描述
- 实现方法
-
- 一、在write()保存的时候检查
- [二、onchange 在点击的时候直接提示](#二、onchange 在点击的时候直接提示)
需求描述
客户要求在 one2many 字段 job_lines 新增一行记录的时候要检查,上一行记录中的 datetime 字段 in_dt 是否填写,没有填写就警告不允许新增。
实现方法
一、在write()保存的时候检查
python
def check_job_lines(self, job_lines):
exist_in_dt = {}
for i in self.job_lines:
if str(i.id) not in exist_in_dt and i.in_dt:
exist_in_dt[str(i.id)] = i.in_dt
exist_create_date = False
del_line = 0
for w in job_lines:
crud = w[0]
if crud == 0: # create
exist_create_date = True
elif crud == 1: # update
update_id = w[1]
if 'in_dt' in w[2]:
in_dt = w[2].get('in_dt', False)
# 如果修改 in_dt 置空
if in_dt:
exist_in_dt[str(update_id)] = in_dt
else:
exist_in_dt.pop(str(update_id), None)
elif crud == 2: # delete
update_id = w[1]
# 如果删除 line 处理
exist_in_dt.pop(str(update_id), None)
del_line += 1
if exist_create_date:
if len(exist_in_dt.keys()) != (len(self.job_lines) - del_line):
raise UserError(_('Please write job order\'s In Datetime first!'))
然后在 write 方法中调用该方法。
二、onchange 在点击的时候直接提示
python
@api.onchange('job_lines')
def onchange_job_lines(self):
old_lines = []
new_lines = []
for i in self.job_lines:
if not i._origin.id:
new_lines.append(i)
else:
old_lines.append(i)
if not old_lines: # create lines first
return True
if len(new_lines) == 1:
recent_lines = old_lines[-1]
if not recent_lines.in_dt:
return {
'warning': {
'title': "Warning",
'message': "Please fill in the in_dt of the previous record first!",
},
'value': {'job_lines': [(6, 0, self.warranty_job_lines.ids)]}
}
else:
for n in new_lines[1:]:
if not n.in_dt:
return {
'warning': {
'title': "Warning",
'message': "Please fill in the in_dt of the previous record first!",
},
'value': {'job_lines': [(6, 0, self.job_lines.ids)]}
}
此方法有个bug
如果是同时添加两条记录的时候,同时第一条记录的 in_dt 没有填写,这时候应该是保留第一条记录,但是现在是会把新增的都给清空,这个是不是js才能解决。