Python 重写odoo中的方法
我正在尝试向(odoo11/hr\u payroll)中的方法添加额外代码。我所做的是复制和粘贴整个代码,并在其中添加额外的代码,但当方法执行时,它执行了两次,这证明我所做的是错误的 我正在寻找一种解决方案,而不是处理和粘贴整个代码 下面是我想在基本方法中添加的内容: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,
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?!!!