2016-11-02 15 views
4

Я пытаюсь применить ограничение в Odoo 8. Я прочитал свое объяснение и последовал пример:Как работает @ api.constrains в Odoo 8?

Украшает ограничение проверки. Каждый аргумент должен быть именем поля , используемым в чеке. Вызывается в записях, на которых было изменено одно из названных полей . (от https://www.odoo.com/documentation/8.0/reference/orm.html)

Этот декоратор будет гарантировать, что декорированная функция будет вызвана создавать, писать, разъединить операцию. Если выполняется ограничение, функция должна поднять openerp.exceptions.Warning с соответствующим сообщением. (от http://odoo-new-api-guide-line.readthedocs.io/en/latest/decorator.html)

Но он не работает вообще в моем случае. Я сделал ограничение для stock.picking модели, которая зависит от state поля (в начале это зависело от picking_type_id, state и move_lines полей, но я изменил, что для упрощения задачи):

@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.') 
     ) 

Проблема в том, что ограничение является когда я создаю новый сбор и не больше раз. Если я отмечаю, что делать, подтверждать или переносить выбор, его состояние изменяется, но ограничение больше не вызывается.

Что-нибудь я пропустил? Кто-нибудь может мне помочь?

+0

Поместите свое ограничение с помощью функции рабочего процесса –

ответ

1

Похоже, проблема может быть связана с тем фактом, что это вычисленное поле в старом стиле. Просто переопределение поля state и метода _state_get модели stock.picking с использованием api нового стиля, похоже, устраняет проблему, и ограничения вызываются при каждом изменении состояния.

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) 

Это обходное решение сработало для меня.