如何阻止Odoo多次调用函数?

时间:2019-03-27 12:27:20

标签: python odoo

我一直在努力解决我们公司遇到的问题。我们使用连接到odoo的prestashop网页。有时,每个平台的订单价格会有所不同(仅美分,但如果差异大于0.03,您将无法通过订单,我们可以更改该数字,但不要)。 我做了一个python程序,为我提供了新值来调整odoo的价格,现在我正在尝试在odoo中实现它,事实证明,说起来容易做起来难。 为了调用该函数,我需要在odoo界面中搜索订单,单击“编辑”并更改一个值(如果两个价格之间的差大于所调用函数的0.03),那么我可以在终端中看到价格可以完美地重新计算(即使该函数被调用太多次,每个订单两次。order_line,也不知道为什么)。那一刻,我可以直接看到ddbb并检查该值是否已实际更改。

问题:单击“保存”按钮时,该函数又被调用,为什么呢?当odoo按顺序重新读取每一行时,它会采用先前的值(仅第一行)并仅修改该值。

>

那么,有人知道为什么会这样吗?更重要的是,我如何才能做到这一点,以便odoo读取最后一个值?

我们正在使用odoo 9。 没有错误,只是错误的结果。

我仅附加可能导致问题的代码段。初始函数为amount_all,该函数称为self._price_readjuster_when_different_odooPR(),在该函数中调用了updateLinePrices。

希望一切都清楚易懂

SaleOrder(models.Model)类:     _inherit ='sale.order'

def updatingLinePrices(self, order, price_adjusted):
    ## Updates the new price for each product
    for line, newPrice in zip(order.order_line, price_adjusted):
        #import pdb; pdb.set_trace()
        try:
            if order.order_line.search([['id', '=', line.id], ['name', '=', '[DISCOUNT] Cupon de Descuento']]).id == False:
                #56 => 10%
                tax = 1.1 if str(line.tax_id.id) == 56 else 1.21 #
                if not self.env.context.get('line'):
                    line.with_context(line=True).write({
                    "price_subtotal": newPrice * line.product_uom_qty,
                    "price_unit": newPrice,
                    "price_tax": (newPrice*tax)-newPrice,
                    "price_total": newPrice*tax,
                    "price_reduce": newPrice,
                    })    

        except Exception as e:
            print("Error updating to new prices: {}".format(e))
    return line

@api.depends('order_line.price_total')
def _amount_all(self):
    """
    Overrides method to calculate amount_tax over price_tax ignoring tax calculation method.
    """
    #print("_amount_all function has been called")
    for order in self:
        amount_total = amount_untaxed = amount_tax = 0.0
        for line in order.order_line:
            amount_untaxed += line.price_subtotal
            amount_tax += line.price_tax

        amount_total = amount_untaxed + amount_tax
        if self.prestashop_bind_ids.total_amount_tax and self.prestashop_bind_ids.total_amount:
            variation_in_tax = abs(self.prestashop_bind_ids.total_amount_tax - amount_tax)
            variation_in_total = abs(self.prestashop_bind_ids.total_amount - amount_total)
            variation = variation_in_tax + variation_in_total
            print('\n\nvariation_tax: {}\nvariation_total: {}\nVariation: {}\n\n'.format( variation_in_tax, variation_in_total, variation))
            if variation >= 0.03 and variation_in_tax >= 0.03 or variation_in_total > 0.03:

                self._price_readjuster_when_different_odooPR()

            order.update({
                'amount_untaxed': order.pricelist_id.currency_id.round(amount_untaxed),
                'amount_tax': order.pricelist_id.currency_id.round(amount_tax),
                'amount_total': amount_total,
            })

1 个答案:

答案 0 :(得分:0)

我有点解决了。问题是odoo调用该方法的次数远远超出了我的控制范围,可能我应该将代码放在另一个位置,但是由于我不知道该方法的调用方式,所以我只添加了一个按钮即可使用正好。 这个想法是让odoo重新调整价格本身,但问题并不那么频繁。