2016-09-28 6 views
0

Я пытаюсь переопределить функцию _amount_line в модели sale.order.line, чтобы добавить логику custum.Odoo 8 override _amount_line

Вот мой код:

class SaleOrderLine(models.Model): 
    _inherit = 'sale.order.line' 

    def _amount_line(self): 
     tax_obj = self.env['account.tax'] 
     cur_obj = self.env['res.currency'] 
     res = {} 
     for line in self: 
      print line.tax_id 
      price = self._calc_line_base_price(line) 
      qty = self._calc_line_quantity(line) 
      print" price:{} & quantity: {}".format(price,qty) 
      taxes = tax_obj.compute_all(line.tax_id, price, qty, 
             line.product_id, 
             line.order_id.partner_id) 
      cur = line.order_id.pricelist_id.currency_id 
      res[line.id] = cur_obj.round(cur, taxes['total']) 
     return res 

    remise_palier = fields.Float('Remise palier (%)') 
    remise_total = fields.Float('Remise totale (%)') 
    price_subtotal = fields.Float(compute='_amount_line', string='Subtotal') 

Когда я бегу Odoo, я получаю эту ошибку:

enter image description here

ответ

2

Вы сделали ошибку в compute_all метод вызова.

Этот метод должен быть таким,

@api.multi 
def _amount_line(self): 
    tax_obj = self.env['account.tax'] 
    cur_obj = self.env['res.currency'] 
    for line in self: 
     print line.tax_id 
     price = self._calc_line_base_price(line) 
     qty = self._calc_line_quantity(line) 
     print" price:{} & quantity: {}".format(price,qty) 
     taxes = line.tax_id.compute_all(price, qty, line.product_id, line.order_id.partner_id)   
     cur = line.order_id.pricelist_id.currency_id 
     line.price_subtotal = cur.round(taxes['total']) 
+0

Hi. это не сработало. Вот исходная строка в sale.py 'tax = tax_obj.compute_all (cr, uid, line.tax_id, price, qty, line.product_id, line.order_id.partner_id)' –

+0

Простите, это работает, но я получив другую ошибку: 'return new_api (self, * args, ** kwargs) TypeError: round() принимает ровно 2 аргумента (3 данных)' –

+0

'line.price_subtotal = cur.round (налоги ['total']) 'Это не сработало? –

1

В Odoo V8 + compute_all вызов должен быть на самих налогов. Вам не нужно называть его «метод класса». Следующий фрагмент кода должен работать для вас:

@api.multi 
# @api.depends() use it for recomputation triggers 
def _amount_line(self): 
    for line in self: 
     print line.tax_id 
     price = self._calc_line_base_price(line) 
     qty = self._calc_line_quantity(line) 
     print" price:{} & quantity: {}".format(price,qty) 
     taxes = line.tax_id.compute_all(
      price, qty, line.product_id, line.order_id.partner_id) 
     cur = line.order_id.pricelist_id.currency_id 
     line.price_subtotal = cur.round(taxes['total']) 

Edit: Вам не нужно, чтобы вернуть то, что по новым API вычисленных функций поля. Просто присвойте значения вычисленным полям.

Редактировать2: Существует новый метод стиля API для валюты round(). Я изменил свой фрагмент.

+0

Привет @CZoellner это дает мне теперь 'return new_api (self, * args, ** kwargs) TypeError: round() принимает ровно 2 аргумента (3 заданных) ' –

+0

Я думаю, что это та же проблема, позвольте мне взглянуть – CZoellner

+0

Это отредактировано. Вы должны вызвать 'round' на объект валюты с новым API. – CZoellner