Вызывать UserError, только если не выбрано ни одного поля - PullRequest
0 голосов
/ 03 сентября 2018

Я добавил свое настраиваемое поле в модель res.partner, и когда я создаю партнера, если выбран branch_id, я хочу, чтобы было выбрано одно из 3 полей. Если некоторые поля не выбраны, я хочу вызвать UserError.

Но теперь он вызывает UserError, даже если выбрано одно из полей.

class ResPartner(models.Model):
    _inherit = 'res.partner'

 branch_id = fields.Many2one('branch.responsibility','Responsibility by branch')
 drawer_id = fields.Many2one(
        'furniture.parts.type', string='Drawer Type',
        domain=[('type', '=', 'drawer')], )
flexible_id = fields.Many2one(
        'furniture.parts.type', string='Flexible Type',
        domain=[('type', '=', 'flexible')],)
 runner_id = fields.Many2one(
        'furniture.parts.type', string='Runner Type',
        domain=[('type', '=', 'runner')], )


@api.model
    def create(self, vals):
        if vals.get('branch_id'):
            if not vals['drawer_id'] or not vals['flexible_id'] or not vals['runner_id']:
                raise UserError('You need to chose values from notebook raport data')
        return super(ResPartner, self).create(vals)

UPDATE.

для метода записи, я попробовал это, как предложил CZoellner для создания, но всегда получал True True True для fields_to_check_in_vals

 @api.multi
     def write(self, vals):
         if vals.get('branch_id') or vals.get('drawer_id') or vals.get('flexible_id') or vals.get('runner_id') or
 vals.get('group_1_id') or vals.get('group_2_id')or
 vals.get('group_3_id'):
             fields_to_check = ['drawer_id', 'flexible_id', 'runner_id', 'group_1_id', 'group_2_id', 'group_3_id']
             fields_to_check_in_vals = [f in self for f in fields_to_check]
             if not any(fields_to_check_in_vals):
                 raise UserError('If branch is selected then you need to select one of the fields from data raport')
>         return super(ResPartner, self).write(vals)

1 Ответ

0 голосов
/ 03 сентября 2018

Ваша логика говорит, что все 3 поля должны быть установлены. Вы можете использовать any здесь:

if vals.get('branch_id'):
    fields_to_check = ['drawer_id', 'flexible_id', 'runner_id']
    fields_to_check_in_vals = [f in vals for f in fields_to_check]
    if not any(fields_to_check_in_vals):
        raise UserError()

Редактировать: метод write немного сложнее. Обычно это метод с несколькими записями, поэтому для каждого цикла на себя должен быть реализован. Затем вам нужно будет использовать либо getattr, либо просто (это предлагается в документе Odoo) рассматривать набор записей как диктовку. И тогда может случиться так, что изменение произойдет прямо при вызове записи. Таким образом, вы должны проверить как постоянные, так и новые значения:

for record in self:
    if vals.get('branch_id'):
        fields_to_check = ['drawer_id', 'flexible_id', 'runner_id']
        fields_to_check_dict = {f:record[f] for f in fields_to_check}
        fields_to_check_dict.update({f:f in vals for f in fields_to_check})
        if not any(fields_to_check_dict.values()):
            raise UserError()

Это немного сложно. Вы также можете сначала позвонить super и просто проверить после этого. Возбуждение исключения приведет к откату всех изменений, поэтому ничего не произойдет.

res = super(MyModel, self).write(vals)
for record in self:
    if vals.get('branch_id'):
        fields_to_check = ['drawer_id', 'flexible_id', 'runner_id']
        fields_to_check_in_record = [record[f] for f in fields_to_check]
        if not any(fields_to_check_in_record):
            raise UserError()
return res
...