Как скопировать поле One2many в методе onchange и изменить его? - PullRequest
0 голосов
/ 20 декабря 2018

Я думаю, что делал это тысячу раз, но сегодня я не могу этого достичь и у меня много сомнений.

НАЗНАЧЕНИЕ

Мне нужноскопируйте записи поля One2many в мое поле One2many , но изменив значение столбца.Это действие должно быть выполнено методом onchange .

SCENARIO

Я в модели mrp.bom.Он имеет поле One2many с именем bom_line_ids.Он также имеет поле Many2one с именем product_id.

Каждый раз, когда меняется product_id, я должен автоматически заполнять bom_line_ids текущей записи ведомости материалов, принимаяданные из поля bom_line_ids другого перечня материалов.Но эти записи не будут точно такими же, мне нужно изменить столбец.

ПРИМЕР

В методе onchange мне нужноскопируйте набор записей mrp.bom.line(10, 11) в мое поле One2many , но в моем поле One2many обе записи будут иметь поле line_type со значением 'standard' (не имеет значения line_type значение исходных записей).

МОЯ ПОПЫТКА

Я много чего пробовал.Самая близкая попытка решения была этой.Но это не удается, если текущая запись ведомости материалов еще не сохранена в базе данных из-за _origin.Ошибка говорит о том, что bom_id имеет значение NULL и является обязательным ... Проблема заключается в том, что если я не пишу _origin, эта ошибка возникает всегда, не имеет значения, существует ли текущая ведомость материалов или нет.И если я уберу ключ bom_id из словаря default, новые строки будут добавлены в источник One2many вместо моего ...

@api.onchange('product_id')
def onchange_product_id(self):
    if self.product_id and \
       self.product_id.product_tmpl_id.bom_ids:
        # Following lines are only for taking the source BoM
        bom_ids = self.product_id.product_tmpl_id.bom_ids.filtered(
            lambda r: not r.product_id)
        bom_id = bom_ids[0] if bom_ids else False
        # Following lines are for doing the copy
        new_lines = self.env['mrp.bom.line']
        for line in bom_id.bom_line_ids:
            new_lines += line.copy(default={
                'bom_id': self._origin.id,
                'line_type': 'standard',
            })
        self.bom_line_ids = [(6, 0, new_lines.ids)]

ЗАКЛЮЧЕНИЕ

Я думаю, что я делаю это сложнее, чем он есть, должно быть какое-то более простое решение ... Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете попробовать другие опции, такие как добавить «активное» поле в объекте bom.line.

При этом вы можете отключить свою предыдущую строку ввода и добавить новые строки ввода в методе onchange, не нарушая никакого другого потока.

PS: я не пробовал.

РЕДАКТИРОВАТЬ:

Просмотр строк и подготовка списка (0, 0, { values }) для обновления одного2many поля.

@api.onchange('product_id')
def onchange_product_id(self):
    if self.product_id and \
       self.product_id.product_tmpl_id.bom_ids:
        bom_ids = self.product_id.product_tmpl_id.bom_ids.filtered(
            lambda r: not r.product_id)
        bom_id = bom_ids[0] if bom_ids else False
        new_lines = []
        for line in bom_id.bom_line_ids:
            vals = line.read()[0]
            vals.update({
                'line_type': 'standard',
            })
            vals.pop('bom_id', False)
            new_lines.append((0, 0, vals))
        self.bom_line_ids = new_lines
...