【问题标题】:Override a method in odoo覆盖odoo中的方法
【发布时间】:2019-03-25 14:26:22
【问题描述】:

我正在尝试向 (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

【问题讨论】:

    标签: python odoo odoo-11


    【解决方案1】:

    为了避免可能继承和重新定义相同模块和方法的其他模块出现问题,我将使用 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
    

    【讨论】:

      【解决方案2】:

      您的问题缺少一些有趣的信息。首先,这个原始方法(模块 hr_payroll)已经被 hr_payroll_account 覆盖。其次,hr_payroll_account 的第一次覆盖真的很混乱,因为您无法通过尝试更改/扩展来覆盖。

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

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

      【讨论】:

      • 哈哈谢谢 ;-) 总有一些东西要学。但他正试图在 150 行的方法中改变一小部分。原来的一个像 3 行。所以你的回答很有趣,但这种特殊情况无济于事。
      • 我想我错了,但还是有办法的,因为我们可以在 python 中模拟 super 的调用。相信我,我一直很喜欢你的回答。答案的目标是也有一种方法可以跳过 Odoo 中的某些方法,这就是我喜欢 python 的原因
      • 检查我的编辑这对我来说非常有用,而且不需要大量的编码^^
      • mmmmmm 但我的方法仍然存在问题,如果我们想跳过中间的方法,这将不起作用。有没有办法在 python 中获得超级的超级?!!!
      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多