2016-09-27 10 views
1

stock.moveモデルのunlinkメソッドを上書きしたいと思います。その理由は、禁止されたアクションについて警告するOSV例外を取り除き、それを他のメッセージおよび他の状態に置き換えるためです。カスタムモジュールからORMメソッドのリンクを上書きする方法は?

これは元のコードです:

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) 

私はちょうどそのメッセージを削除すると、私は思ったよりcomplexerであることを実現しています。

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() 

私はself.unlink()への最後の行を(super)有効にした場合、私は超え最大再帰の深さを得る:これは私の状態をチェックしている私の現在のコードですが、その後、私は避けたいオリジナルのものをチェックしますエラー。

カスタムモジュールから目的を管理するにはどうすればよいですか?

+1

super()呼び出しを使用しないと予期しない動作が発生することがあります。 models.Model.unlink()を呼び出すことができますが、これは 'stock.move'のすべてのunlink()拡張をスキップします。もう一つの可能​​性は、元のコードにサルのパッチがあることです。 – CZoellner

+1

私はむしろ 'super'を無視したくないですが、私はこの場合、元のコードのサルパッチよりも優れていると思います。最後に私は 'models.Model.unlink(self)'を使いました。ありがとう@CZoellner! – forvas

答えて

1

super()を使用していないと、予期しない動作が発生する可能性があります。 models.Model.unlink()に電話することはできますが、stock.moveのすべてのunlink()の拡張は、他のモジュール(Odoo S.A.app/modulesも含む)によってスキップされます。あなたの場合、それは次のようになります:

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) 

もう一つの可能​​性は、元のコードにサルのパッチがあります。

関連する問題