Как мне помешать Odoo вызывать функцию слишком много раз?

#python #odoo

#python #odoo

Вопрос:

Я пытался решить проблему, с которой мы столкнулись в моей компании. Мы используем веб-страницу prestashop, которая подключена к odoo. Иногда каждая платформа получает разную цену в заказах (всего центы, но вы не можете передать заказ, если разница больше 0,03, мы можем изменить это число, но не хотим). Я создал программу на python, которая предоставила мне новые значения для корректировки цен в odoo, и теперь я пытаюсь реализовать это в odoo, оказывается, это легче сказать, чем сделать. Чтобы вызвать функцию, мне нужно выполнить поиск заказа в интерфейсе odoo, нажать Редактировать и изменить значение (если разница между обеими ценами больше 0,03 для вызываемой функции), тогда я вижу в терминале, что цены пересчитаны идеально (хотя функция вызывается слишком много раз, дважды за order.order_line, не знаю почему). В этот момент я могу напрямую просмотреть ddbb и проверить, действительно ли значение было изменено.

Проблема: при нажатии кнопки сохранить функция вызывается еще раз, почему?, когда odoo перечитывает каждую строку в порядке, он принимает предыдущее значение (только первую строку) и продолжает изменять только это значение.

Итак, кто-нибудь знает, почему это происходит? и, что более важно, как я мог бы сделать так, чтобы odoo считывал последнее значение?

мы используем odoo 9. Ошибок нет, просто неправильные результаты.

Я прикрепляю только те фрагменты кода, которые могут быть причиной проблемы. Начальная функция — amount_all, она вызывает self._price_readjuster_when_different_odooPR(), внутри этой функции вызывается updatingLinePrices.

Надеюсь, все понятно

класс SaleOrder (модели.Модель): _inherit = ‘продажа.заказ’

 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('nnvariation_tax: {}nvariation_total: {}nVariation: {}nn'.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. ups, заголовок — how. lol

2. Вы используете значения с плавающей запятой для обработки валюты. Используйте десятичные дроби.

3. @DanD. легко сделать при использовании фреймворка … не

4. Я действительно мог бы перейти на десятичное число, но это не решит проблему.

Ответ №1:

Я вроде как решил это. Проблема в том, что odoo вызывает метод гораздо чаще, чем я могу контролировать, вероятно, мне следовало поместить код в другое место, но поскольку я не знаю, как этот метод вызывается, я просто добавил кнопку, и она работает просто отлично. Идея заключалась в том, чтобы odoo сам скорректировал цену, но проблема в любом случае возникает не так часто.