Python 重写odoo中的方法

Python 重写odoo中的方法,python,odoo,odoo-11,Python,Odoo,Odoo 11,我正在尝试向(odoo11/hr\u payroll)中的方法添加额外代码。我所做的是复制和粘贴整个代码,并在其中添加额外的代码,但当方法执行时,它执行了两次,这证明我所做的是错误的 我正在寻找一种解决方案,而不是处理和粘贴整个代码 下面是我想在基本方法中添加的内容: if debit_account_id: debit_line = (0, 0, { 'name': line.name,

我正在尝试向(odoo11/hr\u 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']
基本方法:

   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']
如果借方账户id:
借方_行=(0,0{
“name”:line.name,
“合作伙伴id”:行。获取合作伙伴id(信用账户=False),
“账户id”:借方账户id,
“日记帐id”:slip.journal\u id.id,
“日期”:日期,
“借方”:金额>0.0且金额或0.0,
“贷方”:金额<0.0和-金额或0.0,
“分析账户id”:line.salary\u rule\u id.analysis\u account\u id.id,
“tax\u line\u id”:line.salary\u rule\u id.account\u tax\u id.id,
})
行标识追加(借方行)
借方金额+=借方行[2][“借方”]-借方行[2][“贷方”]
继承的方法:

  @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
@api.multi
def行动_工资单_完成(自行):
res=super(工资单,自付)。操作\工资单\完成()
如果借方账户id:
借方_行=(0,0{
“name”:line.name,
“合作伙伴id”:行。获取合作伙伴id(信用账户=False),
“账户id”:借方账户id,
“日记帐id”:slip.journal\u id.id,
“x_账户号”:x_借方账户,#额外
“x_jtag”:[(6,0,x_标记)],#额外
“x_jtag_选项”:[(6,0,x_标记_选项)],#额外
“日期”:日期,
“借方”:金额>0.0且金额或0.0,
“贷方”:金额<0.0和-金额或0.0,
“分析账户id”:line.salary\u rule\u id.analysis\u account\u id.id,
“tax\u line\u id”:line.salary\u rule\u id.account\u tax\u id.id,
})
行标识追加(借方行)
借方金额+=借方行[2][“借方”]-借方行[2][“贷方”]
返回res

您的问题缺少一些有趣的信息。首先,此原始方法(模块hr\U工资单)已被hr\U工资单账户覆盖。其次,人力资源部工资账户的第一次覆盖真的是一团糟,你无法通过尝试更改/扩展来覆盖

因此,唯一的解决方案是完全重写/重写原始方法,而不调用super。注意两个已经存在的方法中的业务逻辑!您必须将这两种逻辑复制到新方法中


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

您的问题缺少一些有趣的信息。首先,此原始方法(模块hr\U工资单)已被hr\U工资单账户覆盖。其次,人力资源部工资账户的第一次覆盖真的是一团糟,你无法通过尝试更改/扩展来覆盖

因此,唯一的解决方案是完全重写/重写原始方法,而不调用super。注意两个已经存在的方法中的业务逻辑!您必须将这两种逻辑复制到新方法中


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

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

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

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

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

哈哈,谢谢;-)总有东西要学。但他正试图改变150行方法中的一小部分。原来的一个像3行。所以你的答案很有趣,但对这个特例没有帮助。我想我错了,但仍然有办法,因为我们可以在python中模拟super的调用。相信我,我一直喜欢你的答案。答案的目标是在Odoo也有跳过某些方法的方法,这就是为什么我喜欢Python Cut剔我的编辑,这对我来说是完美的,它不需要大量的编码^ ^ MMMMM,但是我的方法仍然是一个问题,如果我们想跳过中间的方法,这将不起作用。python中有没有一种方法可以让super变成super?!!!哈哈,谢谢;-)总有东西要学。但他正试图改变150行方法中的一小部分。原来的一个像3行。所以你的答案很有趣,但对这个特例没有帮助。我想我错了,但仍然有办法,因为我们可以在python中模拟super的调用。相信我,我一直喜欢你的答案。答案的目标是在Odoo也有跳过某些方法的方法,这就是为什么我喜欢Python Cut剔我的编辑,这对我来说是完美的,它不需要大量的编码^ ^ MMMMM,但是我的方法仍然是一个问题,如果我们想跳过中间的方法,这将不起作用。python中有没有一种方法可以让super变成super?!!!