【问题标题】:protection not working with api.constrains保护不适用于 api.constrains
【发布时间】:2018-06-12 07:14:04
【问题描述】:

如果没有“qty_available”,我想禁止制作产品。但是这段代码不起作用。

仅当我将 @api.constrains 更改为 @api.onchange('move_lines') 时它才有效,但如果我使用 onchange 进行此操作,仍然有可能保存记录。

作为 api.constrains ingores 的名字,我怎样才能使它工作

class mrp_production(osv.osv):
    _inherit = 'mrp.production'

 @api.constrains('qty_available', 'move_lines.qty_available')
    def move_lines_check(self):
        for line in self.move_lines:
            if line.qty_available < 1:
                raise ValidationError(_('There is not enough raw material, check Quantity on hand'))

更新目标

所以再一次的目标是如果没有原材料来制造产品,就会出现警告(我们不能从无到有),如果没有足够的材料,应该是不可能制造产品的。

【问题讨论】:

  • 你知道,这些约束会在保存时触发吗?
  • 是的,但我仍然可以保存记录
  • 那就不要使用self.qty_available=123。使用 self.write({'wty_available':123})
  • qty_available 是 move_lines.qty_available 中的字段,这就是我努力回答的原因
  • 能否请您写下您在此“保护”背后的首选流程?因为我会在 bom 字段上编写一个 onchange 触发器,它应该检查其 bom 线产品的所有产品可用性。如果某些东西不可用,只需发出警告,然后将 bom 设置为 False(空)。

标签: odoo-8 odoo odoo-10 odoo-9


【解决方案1】:

如果原材料产品不足以生产,请在 mrp.production 模型中添加以下约束以限制保存制造订单。

from openerp import api
from openerp.exceptions import Warning
@api.one
@api.constrains('move_lines','bom_id')
def _check_product_stock_availability(self):
    if self.move_lines:
        for move in self.move_lines:
            qty_available = move.product_id.with_context(location=move.location_id.id).qty_available
            if qty_available < move.product_uom_qty:
                raise Warning(_('There is not enough raw material, check Quantity on hand.'))
    elif self.bom_id:
        factor = self.product_uom._compute_qty(self.product_uom.id,self.product_qty, self.bom_id.product_uom.id)
        result, result2 = self.bom_id._bom_explode(self.bom_id,self.product_id, factor / self.bom_id.product_qty, None, routing_id=self.routing_id.id)
        product_obj = self.env['product.product']
        for line in result:
            qty_available = product_obj.browse(line.get('product_id')).with_context(location=self.location_src_id.id).qty_available
            #qty_available = line.product_id.with_context(location=self.location_src_id.id).qty_available
            if qty_available < line.get('product_qty'):
                raise Warning(_('There is not enough raw material, check Quantity on hand for products in BOM.'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2015-02-15
    • 2021-03-02
    • 1970-01-01
    • 2011-06-21
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多