附加功能条件 - Odoo v8

Additional condition to function - Odoo v8

我有这个方法:

@api.multi
@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
def check_quantity(self):
    for rec in self:
        if rec.order_lines:
            for line in rec.order_lines:
                if line.qty > line.isbn.qty_available:
                    raise Warning(('Quantity is invalid.'))
                if not line.isbn:
                    raise Warning(('Enter​ ​at least​ ​1​ ​ISBN to produce'))
                else:
                    self.write({'state': 'inprogress',},)

它完美地适用于 qty_available 条件和 inprogress 状态,但如果我不添加任何 isbn,它是 Many2oneproduct.product 它不会抛出任何错误,但也不起作用。

它应该引发 'Enter​ ​at least​ ​1​ ​ISBN to produce' 警告,但它只是加载而已。

如果您需要进一步的解释,请告诉我。

试试这个,我做了一些修改,我用ValidationError代替Warning,并且不使用@api.multi,当我们使用constraint时系统会使用@api.one,并且有一个请注意最后一行

from openerp.exceptions import ValidationError

#@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
@api.one
def check_quantity(self):
    for line in self.order_lines:
        if line.isbn.qty_available and (line.qty > line.isbn.qty_available):
            raise ValidationError("Quantity is invalid. %s" % line.qty)
        if not line.isbn:
            raise ValidationError('Enter​ ​at least​ ​1​ ​ISBN to produce')
        else:
            self.write({'state': 'inprogress',},) # here you have used @api.multi, and this not correct 

不要在循环中使用 self 永远记住这一点,因为如果你调用 一种方法,它将应用于其中的所有记录。

并且不要在 @api.constrainsdepends 中调用 write 这将导致递归错误。因为这两个装饰器在 createwrite 方法中被调用。

@api.multi
@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
def check_quantity(self):
    for rec in self:
        if rec.order_lines:
            for line in rec.order_lines:
                if not line.isbn:
                    # and check for the product before the quantity
                    # because if there is no product line.isbn.qty_available 
                    # will raise exception
                    raise Warning(('Enter​ ​at least​ ​1​ ​ISBN to produce'))

                if line.qty > line.isbn.qty_available:
                    raise Warning(('Quantity is invalid.'))

                else:
                    # if you use self here you will update all records
                    # and don't use write in the constrains
                    # try to use update it may work if not you need to override write or create method
                    rec.update({'state': 'inprogress',},)
                # or if you are changing just one field
                # rec.state = 'inprogress'