附加功能条件 - 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
,它是 Many2one
的 product.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.constrains
或 depends
中调用 write 这将导致递归错误。因为这两个装饰器在 create
或 write
方法中被调用。
@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'
我有这个方法:
@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
的 product.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.constrains
或 depends
中调用 write 这将导致递归错误。因为这两个装饰器在 create
或 write
方法中被调用。
@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'