2016-11-02 5 views
4

Ich versuche, eine Einschränkung in Odoo 8. Ich seine Erklärung habe anzuwenden und die Beispiele folgen:Wie funktioniert @ api.constrains in Odoo 8?

Schmückt ein Constraint-Checker. Jedes Argument muss ein Feldname in der Prüfung verwendet werden. Wird in den Datensätzen aufgerufen, in denen eines der Felder geändert wurde. (von https://www.odoo.com/documentation/8.0/reference/orm.html)

Dieser Dekorateur wird sichergestellt, dass dekoriert Funktion auf aufgerufen wird, erstellen, schreiben, den Betrieb entkoppeln. Wenn eine Bedingung erfüllt ist, sollte die Funktion eine openerp.exceptions.Warning mit entsprechender Nachricht auslösen. (von http://odoo-new-api-guide-line.readthedocs.io/en/latest/decorator.html)

Aber es funktioniert nicht in meinem Fall. Ich machte eine Einschränkung für stock.picking Modell, das auf state Feld abhängt (am Anfang auf picking_type_id abhing, state und move_lines Felder, aber ich geändert, dass das Problem zu vereinfachen):

@api.one 
@api.constrains('state') 
def _check_lot_in_outgoing_picking(self): 
    _logger.info('MY CONSTRAINT IS CALLED') 
    if self.picking_type_id.code == 'outgoing' and \ 
     self.state not in ['draft', 'cancel'] and \ 
     any(not move.restrict_lot_id for move in self.move_lines): 
     raise ValidationError(
      _('The lot is mandatory in outgoing pickings.') 
     ) 

Das Problem ist, dass die Einschränkung ist, wenn ich eine neue Kommissionierung erstelle und keine Male mehr anrufe. Wenn ich die Auswahl festlege, bestätige oder übertrage, ändert sich ihr Zustand, aber die Bedingung wird nicht mehr aufgerufen.

Alles was ich vermisse? Kann mir bitte jemand helfen?

+0

setzen Sie Ihre Einschränkung mit Workflow-Funktion –

Antwort

1

Es sieht so aus, als ob das Problem damit zusammenhängen könnte, dass es sich um ein altes berechnetes Feld handelt. Überschreibt einfach das state Feld und die _state_get Methode des stock.picking Modells, das neue-Stil-API verwendet, das Problem zu beheben, und die Einschränkungen werden jede Statusänderung genannt.

class stock_picking(models.Model): 
    _inherit = "stock.picking" 

    @api.one 
    @api.depends('move_lines', 'move_type', 'move_lines.state') 
    def _state_get(self): 
     self.state = super(stock_picking, self)._state_get(field_name='state', arg=None, context=self._context)[self.id] 

    state = fields.Selection(compute=_state_get) 

Diese Workaround funktionierte für mich.