代码之家  ›  专栏  ›  技术社区  ›  clxoid

onchange方法不适用于新记录

  •  1
  • clxoid  · 技术社区  · 6 年前

    我怎样才能使它也适用于新记录(工资单)?

    all_project_hours = fields.One2many('hr.payslip.projects', 'slip_id', "Project Hours")
    
    @api.onchange('employee_id')
    def _calculate_project_hours(self):
        all_project_hours = []
        value = {}
        projects = self.env['project.project'].search([])
        for project in projects:
            domain = [('employee_id', '=', self.employee_id.name), ('date', '>=', self.date_from),
                      ('date', '<=', self.date_to),
                      ('validated', '=', True), ('is_bonus_eligible', '=', True), ('project_id', '=', project.name)]
            domain_ot = [('employee_id', '=', self.employee_id.name), ('date', '>=', self.date_from),
                         ('date', '<=', self.date_to),
                         ('validated', '=', True), ('is_bonus_eligible', '=', True), ('project_id', '=', project.name),
                         ('task_id', '=', 'Overtime')]
            all_timesheets = self.env["account.analytic.line"].search(domain)
            ot_timesheets = self.env["account.analytic.line"].search(domain_ot)
            sum_all = 0.0
            sum_ot = 0.0
            for unit in all_timesheets:
                sum_all += unit.unit_amount
            for ot in ot_timesheets:
                sum_ot += ot.unit_amount
            if self.total_project_hours > 0.0:
                split = sum_all / self.total_project_hours * 100
            else:
                split = 0.0
                return split
            all_project_hours.append(
                (0, 0, {'project_id': project.id, 'project_hours': sum_all, 'overtime_hours': sum_ot, 'project_split': split}))
        value.update(all_project_hours=all_project_hours)
        return {'value': value}
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Akshay    6 年前

    重写create和write函数并调用两者中的calculate项目小时函数

        2
  •  0
  •   travisw    6 年前

    @阿克谢有个好建议。

    create write _calculate_project_hours 两者都有作用。

    如何执行此操作的示例:

    @api.multi
    @api.onchange('employee_id')
    def _calculate_project_hours(self):
        projects = self.env['project.project'].search([])
        # I changed this to @api.multi, so it must loop through all records in self
        # Any references to `self` inside the loop are now changed to `record`
        for record in self:
            all_project_hours = []
            value = {}
            for project in projects:
                domain = [('employee_id', '=', record.employee_id.name), ('date', '>=', record.date_from),
                          ('date', '<=', record.date_to),
                          ('validated', '=', True), ('is_bonus_eligible', '=', True), ('project_id', '=', project.name)]
                domain_ot = [('employee_id', '=', record.employee_id.name), ('date', '>=', record.date_from),
                             ('date', '<=', record.date_to),
                             ('validated', '=', True), ('is_bonus_eligible', '=', True), ('project_id', '=', project.name),
                             ('task_id', '=', 'Overtime')]
                all_timesheets = record.env["account.analytic.line"].search(domain)
                ot_timesheets = record.env["account.analytic.line"].search(domain_ot)
                sum_all = 0.0
                sum_ot = 0.0
                for unit in all_timesheets:
                    sum_all += unit.unit_amount
                for ot in ot_timesheets:
                    sum_ot += ot.unit_amount
                if record.total_project_hours > 0.0:
                    split = sum_all / record.total_project_hours * 100
                else:
                    split = 0.0
                    return split
                all_project_hours.append(
                    (0, 0, {'project_id': project.id, 'project_hours': sum_all, 'overtime_hours': sum_ot, 'project_split': split}))
            # Assign the result to the record instead of returning it as a `value` dict
            record.all_project_hours = all_project_hours
    
    @api.model
    def create(self, vals):
        res = super().create(vals)
        res._calculate_project_hours()
        return res
    
    @api.multi
    def write(self, vals):
        res = super().write(vals)
        self._calculate_project_hours()
        return res
    

    Odoo ORM Documentation 一些细节。

    推荐文章