我想覆盖unlink模型的stock.move方法。原因是我想删除一个OSV异常,该异常警告禁止的操作,并用其他消息和其他条件替换它。
这是原始代码:

def unlink(self, cr, uid, ids, context=None):
    context = context or {}
    for move in self.browse(cr, uid, ids, context=context):
        if move.state not in ('draft', 'cancel'):
            raise osv.except_osv(_('User Error!'), _('You can only delete draft moves.'))
    return super(stock_move, self).unlink(cr, uid, ids, context=context)

我刚刚意识到删除那个消息比我想象的要复杂。这是我当前的代码,它正在检查我的状态,但随后检查我要避免的原始代码:
class StockMove(models.Model):
    _inherit = 'stock.move'

    @api.multi
    def unlink(self):
        for move in self:
            if move.lot_id and move.lot_id.any_unit_sold is True:
                raise Warning(_('You can only delete unsold moves.'))
        return super(StockMove, self).unlink()

如果将最后一行(super)转换为self.unlink(),则会得到最大递归深度超过错误。
如何从自定义模块管理目标?

最佳答案

不使用super()调用可能会有意外行为。您可以调用models.Model.unlink(),但这将跳过其他模块(甚至是Odoo S.A.应用程序/模块)的所有unlink()扩展。在你的情况下是:

class StockMove(models.Model):
    _inherit = 'stock.move'

    @api.multi
    def unlink(self):
        for move in self:
            if move.lot_id and move.lot_id.any_unit_sold is True:
                raise Warning(_('You can only delete unsold moves.'))
        return models.Model.unlink(self)

另一种可能是原始代码上的猴子补丁。

09-07 10:59