метод onchange не работает для новых записей - PullRequest
0 голосов
/ 14 января 2019

У меня есть функция python, для которой я хочу заполнить поле one2many для всех записей платежных ведомостей. Метод Onchange работает только когда я изменяю employee_id для уже созданных записей, не работает при создании новой записи. Мне нужно создать, сохранить, а затем редактировать.

Как я могу заставить его работать и для новых записей (платежных ведомостей)?

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 ]

0 голосов
/ 18 января 2019

@ У Акшая есть хорошее предложение.

Переопределите функции 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 .

0 голосов
/ 14 января 2019

Переопределить функцию создания и записи и вызвать функцию _calculate_project_hours в обоих из них

...