Как добавить несколько новых записей в поле One2many в методе onchange в Odoo 10? - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь изменить поле One2many с помощью метода onchange . Мне нужно добавить некоторые записи, но сохранить некоторые из существующих до вычисления onchange .

Чтобы быть более точным, у меня есть поле с именем tax_line_ids. В этом поле хранятся налоги. У налогов есть поле с именем manual, Boolean.

. Поэтому при каждом изменении поля my_field мне нужно добавлять новые налоги в поле One2many tax_line_ids, но мне нужно сохранить старые, для которых manual установлено на True .

Попытка A

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    tax_line_ids = self.tax_line_ids.filtered(
        lambda r: r.manual).ids
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax = self.env['account.invoice.tax'].create(tax)
        tax_line_ids.append(new_tax.id)
    self.tax_line_ids = [(6, 0, tax_line_ids)]

Проблема

Метод onchange работает нормально, но когда я нажимаю кнопку Сохранить , записи tax_line_ids, представленные моим onchange метод исчезнуть (tax_line_ids не является полем только для чтения).

Попытка B

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    manual_tax_lines = self.tax_line_ids.filtered(
        lambda r: r.manual)
    for manual_tax_line in manual_tax_lines:
        new_tax_lines.append(manual_tax_line.sudo().read()[0])
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax_lines.append((0, 0, tax))
    self.tax_line_ids = new_tax_lines

Проблема

Метод onchange отлично работает в первый раз, даже если я нажимаю кнопку Сохранить (записи не исчезают), но если я изменяю my_field во второй раз перед сохранением я получил ошибку безопасного доступа (я работаю с администратором):

(Тип документа: account.invoice.tax, Операция: чтение)

Это причина, по которой я добавил sudo() до read(), на всякий случай, но ошибка все еще остается.

Заключение

Итак, в моем методе onchange , как добавить новые записи в поле One2many , сохранив некоторые из существующих?

Ответы [ 3 ]

0 голосов
/ 17 марта 2020
@api.onchange('my_field')
def onchange_my_field(self):
    tax_line_ids = self.tax_line_ids.filtered(
        lambda r: r.manual).ids
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    new_tax_datas = []
    for tax in tax_grouped.values():
        new_tax_datas.append(tax)
    self.tax_line_ids = [
        (4, tl_id) for tl_id in tax_line_ids,
        (0, 0, td) for td in new_tax_datas]

ИЛИ

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    tax_lines = self.tax_line_ids.filtered(
        lambda r: r.manual)
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax = self.env['account.invoice.tax'].create(tax)
        tax_lines += new_tax
    self.tax_line_ids = [(6, 0, tax_lines.ids)]
0 голосов
/ 18 марта 2020

попробуй сделать вот так

@api.onchange('my_field')
def onchange_my_field(self):
    account_invoice_tax = self.env['account.invoice.tax']
    for invoice in self:
        invoice._cr.execute("DELETE FROM account_invoice_tax WHERE invoice_id=%s AND manual is False", (invoice.id,))
        if invoice._cr.rowcount:
            invoice.invalidate_cache()
        tax_grouped = invoice.get_taxes_values()

        # Create new tax lines
        for tax in tax_grouped.values():
            account_invoice_tax.create(tax)

Я только что попробовал существующий метод.

0 голосов
/ 17 марта 2020

forvas

Попробуйте сделать это, return {'value': {'your_one2many_field': list_of_ids}}

Спасибо

...