odoo-054 one2many 字段新增时检查上一行某个字段是否填写

文章目录

需求描述

客户要求在 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才能解决。

相关推荐
应用市场2 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
东方佑2 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
Dfreedom.2 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
一半烟火以谋生2 小时前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest
叶子丶苏3 小时前
第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
python·pyqt
百锦再4 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
Blossom.1185 小时前
把AI“刻”进玻璃:基于飞秒激光量子缺陷的随机数生成器与边缘安全实战
人工智能·python·单片机·深度学习·神经网络·安全·机器学习
Kratzdisteln5 小时前
【Python OOP Diary 1.1】题目二:简单计算器,改错与优化
python·面向对象编程
小白银子5 小时前
零基础从头教学Linux(Day 53)
linux·运维·python
skywalk81636 小时前
基于频域的数字盲水印blind-watermark
linux·开发语言·python