有比覆盖整个函数更好的方法吗?

时间:2019-09-04 09:02:41

标签: python inheritance odoo odoo-11

在最近的项目中,我不得不向模型添加自定义字段。要使其正常工作,解决方案的一部分是覆盖“ @ api.onchange('')”函数。我只需要向字典添加两个条目,但是由于这是在循环中,所以除了复制整个函数并对其进行修改之外,我没有其他解决方案。

我必须修改的功能是sale.order的一部分,之前已由website_quote修改。

这是我必须修改的功能:

@api.onchange('template_id')
def onchange_template_id(self):
    if not self.template_id:
        return
    template = self.template_id.with_context(lang=self.partner_id.lang)

    order_lines = [(5, 0, 0)]
    for line in template.quote_line:
        discount = 0
        if self.pricelist_id:
            price = self.pricelist_id.with_context(uom=line.product_uom_id.id).get_product_price(line.product_id, line.product_uom_qty, False)
            if self.pricelist_id.discount_policy == 'without_discount' and line.price_unit:
                discount = (line.price_unit - price) / line.price_unit * 100
                # negative discounts (= surcharge) are included in the display price
                if discount < 0:
                    discount = 0
                else:
                    price = line.price_unit

        else:
            price = line.price_unit

        data = {
            'name': line.name,
            'price_unit': price,
            'discount': 100 - ((100 - discount) * (100 - line.discount)/100),
            'product_uom_qty': line.product_uom_qty,
            'product_id': line.product_id.id,
            'layout_category_id': line.layout_category_id,
            'product_uom': line.product_uom_id.id,
            'website_description': line.website_description,
            'state': 'draft',
            'customer_lead': self._get_customer_lead(line.product_id.product_tmpl_id),
        }
        if self.pricelist_id:
            data.update(self.env['sale.order.line']._get_purchase_price(self.pricelist_id, line.product_id, line.product_uom_id, fields.Date.context_today(self)))
        order_lines.append((0, 0, data))

    self.order_line = order_lines
    self.order_line._compute_tax_id()

    option_lines = [(5, 0, 0)]
    for option in template.options:
        if self.pricelist_id:
            price = self.pricelist_id.with_context(uom=option.uom_id.id).get_product_price(option.product_id, 1, False)
        else:
            price = option.price_unit
        data = {
            'product_id': option.product_id.id,
            'layout_category_id': option.layout_category_id,
            'name': option.name,
            'quantity': option.quantity,
            'uom_id': option.uom_id.id,
            'price_unit': price,
            'discount': option.discount,
            'website_description': option.website_description,
        }
        option_lines.append((0, 0, data))
    self.options = option_lines

    if template.number_of_days > 0:
        self.validity_date = fields.Date.to_string(datetime.now() + timedelta(template.number_of_days))

    self.website_description = template.website_description
    self.require_payment = template.require_payment

    if template.note:
        self.note = template.note

如果您选择创建销售订单的模板,则此方法负责显示销售模板的值。

我只需要将自定义字段的名称添加到数据字典中即可获得正确的结果。

但是在我看来,我通过复制整个函数以蛮力解决了这个问题。没有更好的方法将我的更改插入到这样的函数中?

1 个答案:

答案 0 :(得分:1)

简短的回答:不,没有更好的方法。

长答案:如果您的代码部分易于更改,则应将其与其余函数主体分开。 因此,如果您将来要进行很多更改,请尝试重写该函数,以便从外部使用data可变参数。