功能的附加条件 - Odoo v8

时间:2017-10-30 21:15:51

标签: python openerp odoo-8

我有这个方法:

@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添加任何Many2one 1}}它不会抛出任何错误,但也不起作用。

它应该提出product.product警告,但它只是加载而且就是它。

如果您需要进一步说明,请告诉我。

2 个答案:

答案 0 :(得分:1)

试试这个,我做了一些修改,我使用ValidationError而不是警告,并且不使用@api.multi,系统将在我们使用@api.one时使用constraint,并且有一个注释最后一行

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 

答案 1 :(得分:1)

不要在循环中使用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'