Odoo 将我的代码添加到原始方法的更实用的方法

Odoo 将我的代码添加到原始方法的更实用的方法,odoo,odoo-8,odoo-9,Odoo,Odoo 8,Odoo 9,因此,我将覆盖来自po行的\u prepare\u invoice\u line方法。我对得到的结果很满意,但我想让代码更优雅。基本上,它是从原始方法复制过去的,但我只添加了一小部分(您可以在下面检查)。如果不复制/跳过所有原始方法,如何将代码添加到此方法 class AccountInvoice(models.Model): _inherit = 'account.invoice' price_by_pricelist = fields.Float("Price by Pr

因此,我将覆盖来自po行的
\u prepare\u invoice\u line
方法。我对得到的结果很满意,但我想让代码更优雅。基本上,它是从原始方法复制过去的,但我只添加了一小部分(您可以在下面检查)。如果不复制/跳过所有原始方法,如何将代码添加到此方法

 class AccountInvoice(models.Model):
    _inherit = 'account.invoice'

    price_by_pricelist = fields.Float("Price by Pricelist")
    line_color = fields.Boolean()

    @api.multi
    def _prepare_invoice_line_from_po_line(self, line):
        super(AccountInvoice,self)._prepare_invoice_line_from_po_line(line)
        if line.product_id.purchase_method == 'purchase':
            qty = line.product_qty - line.qty_invoiced
        else:
            qty = line.qty_received - line.qty_invoiced
        if float_compare(qty, 0.0, precision_rounding=line.product_uom.rounding) <= 0:
            qty = 0.0
        taxes = line.taxes_id
        invoice_line_tax_ids = self.purchase_id.fiscal_position_id.map_tax(taxes)
        invoice_line = self.env['account.invoice.line']
        data = {
            'purchase_line_id': line.id,
            'name': line.name,
            'origin': self.purchase_id.origin,
            'uom_id': line.product_uom.id,
            'product_id': line.product_id.id,
            'account_id': invoice_line.with_context({'journal_id': self.journal_id.id, 'type': 'in_invoice'})._default_account(),
            'price_unit': line.order_id.currency_id.compute(line.price_unit, self.currency_id, round=False),
            'quantity': qty,
            'discount': 0.0,
            'account_analytic_id': line.account_analytic_id.id,
            'invoice_line_tax_ids': invoice_line_tax_ids.ids,
            'price_by_pricelist': line.product_id.seller_ids[0].price,
        }

        if data['price_by_pricelist'] != line.price_unit:
            self.line_color = True

        account = invoice_line.get_invoice_line_account('in_invoice', line.product_id, self.purchase_id.fiscal_position_id, self.env.user.company_id)
        if account:
            data['account_id'] = account.id

        return data

像这样的东西应该能奏效

data = super(AccountInvoice,self)._prepare_invoice_line_from_po_line(line)
data.update({'price_by_pricelist': line.product_id.seller_ids[0].price}) # update the dictionary

if data['price_by_pricelist'] != line.price_unit:
     self.line_color = True

return data
步骤:
  • 调用super()从原始函数返回数据
  • 使用所需的数据更新字典
  • 做数据处理,你做了什么
  • 返回数据

  • 希望这有帮助:)

    回答得好。尽可能使用
    super()
    调用来重写方法。但是有很多方法不是那么容易“操纵”的。当它巧妙地解决了这个问题时,总是一件好事。哦,是的,Python3你可以调用
    super()
    :P
    data = super(AccountInvoice,self)._prepare_invoice_line_from_po_line(line)
    data.update({'price_by_pricelist': line.product_id.seller_ids[0].price}) # update the dictionary
    
    if data['price_by_pricelist'] != line.price_unit:
         self.line_color = True
    
    return data