Моя цель
Я сделал виджет в JavaScript, который имеет кнопку. Я хочу изменить
One2many поле после нажатия на эту кнопку. Мой виджет отображается в
sale.order
представление формы, и я хочу изменить поле O2M order_line
после щелчка.
На самом деле, я пытаюсь эмулировать часть hr_timesheet_sheet модуля. Этот модуль добавляет виджет в hr_timesheet_sheet.sheet
виде формы и также имеет кнопку, каждый раз при нажатии кнопки изменяется O2M timesheet_ids
.
Исходный код
Так что я копировал эту часть шаг за шагом, но я получаю странную ошибку в
update_sheets
метод. Это исходный код:
update_sheets: function() {
if(this.querying) {
return;
}
this.updating = true;
var commands = [form_common.commands.delete_all()];
_.each(this.get("sheets"), function (_data) {
var data = _.clone(_data);
if(data.id) {
commands.push(form_common.commands.link_to(data.id));
commands.push(form_common.commands.update(data.id, data));
} else {
commands.push(form_common.commands.create(data));
}
});
var self = this;
this.field_manager.set_values({'timesheet_ids': commands}).done(function() {
self.updating = false;
});
},
Мой код: 1-я попытка
А это мое:
update_order_line_js: function() {
if(this.querying) {
return;
}
this.updating = true;
var commands = [form_common.commands.delete_all()];
_.each(this.get('order_line_js'), function (_data) {
var data = _.clone(_data);
if(data.id) {
commands.push(form_common.commands.link_to(data.id));
commands.push(form_common.commands.update(data.id, data));
} else {
commands.push(form_common.commands.create(data));
}
});
var self = this;
this.field_manager.set_values({'order_line': commands}).done(function() {
self.updating = false;
});
},
Ошибка
Как видите, я изменил только имена переменных, а order_line_js
содержит sale.order.line
данные, такие как sheets
содержит account.analytic.line
данные.
Но когда вызывается update_order_line_js
, следующая строка завершается с ошибкой:
this.field_manager.set_values({'order_line': commands}).done(function() {
self.updating = false;
});
И выдает мне эту ошибку:
Неизвестное поле qty_invoiced в домене
[ "|" "! =" [ "Qty_invoiced", ">", 0], [ "procurement_ids", []]]
ПРИМЕЧАНИЕ: Если я уберу строку commands.push(form_common.commands.create(data));
, которая находится в операторе else
, ошибка исчезнет.
* 1 058 * * Пример 1 059 *
Например, у меня есть заказ на продажу только с строкой заказа на продажу. Строка имеет идентификатор 28. Когда я добавляю вручную новую строку в O2M order_line
, вызывается update_order_line_js
и содержимое commands
непосредственно перед ошибкой следующее:
[
[5, false, false],
[0, false, {
analytic_tag_ids: [],
customer_lead: 0,
discount: 0,
invoice_status: "no",
layout_category_id: false,
name: "[CONS_DEL03] Basic Computer Dvorak keyboard left-handed mouse",
price_unit: 23500,
procurement_ids: [],
product_id: 32,
product_uom: 1,
product_uom_qty: 1,
qty_delivered: 0,
qty_delivered_updateable: true,
sequence: 13,
state: "draft",
tax_id: []
}],
[4, 28, false],
[1, 28, {
analytic_tag_ids: [],
company_id: [1, "Anubía Soluciones en la Nube, S.L."],
create_date: "2018-10-30 09:03:34",
create_uid: [1, "Administrator"],
currency_id: [1, "EUR"],
customer_lead: 0,
discount: 0,
display_name: "Screen X555",
id: 28,
invoice_lines: [],
invoice_status: "to invoice",
layout_category_id: false,
layout_category_sequence: 0,
name: "Screen X555",
order_id: [11, "SO010"],
order_partner_id: [8, "Agrolait"],
price_reduce: 10,
price_reduce_taxexcl: 10,
price_reduce_taxinc: 12.1,
price_subtotal: 10,
price_tax: 2.1,
price_total: 12.1,
price_unit: 10,
procurement_ids: [],
product_id: [44, "Screen X555"],
product_uom: [1, "Unit(s)"],
product_uom_qty: 1,
qty_delivered: 0,
qty_delivered_updateable: true,
qty_invoiced: 0,
qty_to_invoice: 1,
salesman_id: [1, "Administrator"],
sequence: 12,
state: "sale",
tax_id: [1],
write_date: "2018-10-30 09:03:34",
write_uid: [1, "Administrator"]
}]
]
Я думаю, проблема в том, что поле qty_invoiced
находится внутри словаря существующей строки, но почему оно выдает ошибку? Я застрял с этим.
Мой код: 2-я попытка
Я также пытался использовать Python, который вызывает метод Python из JS on_click
для обновления текущего One2many строк заказа на продажу:
JS on_click content
var sale_order_id = self.field_manager.datarecord.id;
var SaleOrder = new Model('sale.order');
SaleOrder.call(
'test', [sale_order_id],
).then(function(result) {
console.log(result);
});
Метод Python под названием
@api.model
def test(self, id):
self = self.browse([id])
self.update({
'order_line': [(6, 0, [24, 27])],
})
return True
Как видите, я всегда заменяю текущие строки на существующие (в моей тестовой базе данных) с идентификаторами 24 и 27, только чтобы попробовать метод. Проблема в том, что представление поля One2many не перезагружается автоматически, поэтому после нажатия на кнопку JS я все еще вижу старые записи, но когда я нажимаю кнопку Сохранить , я вижу записи 24 и 27. Кроме того, если я нажимаю кнопку Discard , я получаю ошибку домена, а старые записи перезаписываются на 24 и 27, игнорируя функциональность кнопки Discard . Я предполагаю, что использование update
из onchange метода действительно выполняет функциональность write
(что я не могу понять, это ошибка домена).
Мой код: 3-я попытка
И из-за этого я тоже пытался обновить O2M order_line
непосредственно в JS:
self.field_manager.fields['order_line'].viewmanager.views.list.controller.do_delete(
self.field_manager.fields['order_line'].dataset.ids
);
Эта строка прекрасно работает, но теперь мне нужно добавить старые записи с новыми данными, которые я хочу. Я искал, как использовать do_add_record
или do_edit
, но я до сих пор не знаю, какие аргументы им нужны, и мне было интересно, делаю ли я вещи более сложными, чем они.
Может кто-нибудь порекомендовать мне что-нибудь для достижения того, что мне нужно, или кто-нибудь знает, почему я получаю qty_invoiced
ошибку домена?