覆盖odoo中的方法

时间:2019-03-25 14:26:22

标签: python odoo odoo-11

我正在尝试向(odoo11 / hr_payroll)中的方法添加额外的代码。我所做的事情被复制并粘贴了整个代码,并在其中添加了额外的代码,但是当该方法被执行时,它被执行了两次,这证明我的所作所为是错误的。

我正在寻找一种解决方案,而不是应对和粘贴整个代码。

所以这是我要在基本方法中添加的内容:

基本方法:

   if debit_account_id:
                  debit_line = (0, 0, {
                      'name': line.name,
                      'partner_id': line._get_partner_id(credit_account=False),
                      'account_id': debit_account_id,
                      'journal_id': slip.journal_id.id,
                      'date': date,
                      'debit': amount > 0.0 and amount or 0.0,
                      'credit': amount < 0.0 and -amount or 0.0,
                      'analytic_account_id': line.salary_rule_id.analytic_account_id.id,
                      'tax_line_id': line.salary_rule_id.account_tax_id.id,
                  })
                  line_ids.append(debit_line)
                  debit_sum += debit_line[2]['debit'] - debit_line[2]['credit']

继承的方法:

  @api.multi
  def action_payslip_done(self):
      res = super(PayslipBills, self).action_payslip_done()

      if debit_account_id:
                  debit_line = (0, 0, {
                      'name': line.name,
                      'partner_id': line._get_partner_id(credit_account=False),
                      'account_id': debit_account_id,
                      'journal_id': slip.journal_id.id,
                      'x_account_no': x_debit_account, # extra
                      'x_jtag': [(6, 0, x_tags)], # extra
                      'x_jtag_option': [(6, 0, x_tags_option)], # extra
                      'date': date,
                      'debit': amount > 0.0 and amount or 0.0,
                      'credit': amount < 0.0 and -amount or 0.0,
                      'analytic_account_id': line.salary_rule_id.analytic_account_id.id,
                      'tax_line_id': line.salary_rule_id.account_tax_id.id,
                  })
                  line_ids.append(debit_line)
                  debit_sum += debit_line[2]['debit'] - debit_line[2]['credit']

      return res

2 个答案:

答案 0 :(得分:0)

您的问题缺少一些有趣的信息。首先,此原始方法(模块hr_payroll)已被hr_payroll_account覆盖。其次,通过hr_payroll_account进行的第一个优先级实际上是messed_up,您无法通过尝试更改/扩展名来替代它。

因此,唯一的解决方案是完全重写/覆盖原始方法,而无需调用super。当心两种已经存在的方法中的事实业务逻辑!您必须将两种逻辑都复制到新方法中。

我不喜欢那些解决方案,但这是我所知道的唯一可能的解决方案。

答案 1 :(得分:0)

为了避免其他可以继承并重新定义相同模块和方法的模块出现问题,我将使用supper(...)保留对原始方法的调用,然后立即使用额外的字段和值更新这些记录您需要添加,例如,如果该记录集的x_whatever值始终相同,并且不管是贷方还是借方行,您都可以尝试以下操作:

class PayslipBills(models.Model):
      _inherit = 'hr.payslip'

      (... define new fields and new methods...)

      @api.multi
      def action_payslip_done(self):
          res = super(PayslipBills, self).action_payslip_done()
          for record in res:
              for lines in record.line_ids
                  # add values to the extra fields...
                  lines.write({'x_account_no': x_debit_account,
                     'x_jtag': [(6, 0, x_tags)],
                     'x_jtag_option': [(6, 0, x_tags_option)],
                      })
          return res