0
votes

I want to be able to change the context of a one2many field (work_unit) programatically to modify the default value of one of its fields (product_id).

Ideally I would like to change the o2m context directly from my widget, but I haven't had any success doing that, the view doesn't acknowledge any changes I make from javascript.

Current approach: I have another field selected_chapter which I pass through context as the default for work_unit.product_id. This works fine: when I change selected_chapter manually, the o2m context picks up the new default for the field product_id.

Now, I want to be able to modify selected_chapter programatically from a widget in javascript.

I do this by calling a python method with an _rpc() call from my widget, and it works, but the view doesn't update selected_chapter until I save the record which defeats the purpose of the call.

Widget code:

ListRenderer.include({
...
    _setSelectedChapter: function () {
        var self = this;

        this.trigger_up('mutexify', {
            action: function () {
                return self._rpc({
                    model: 'sale.order',
                    method: 'set_selected_chapter',

                    args: [
                        [self.res_id]
                    ],
                    kwargs: {
                        chapter_id: self.filter.getSelected()
                    },
                }).then(function (result) {
                    console.log("res", result);
                    self._render();
                });
            },
        });
    },
...
})

Model code:

    selected_chapter = fields.Many2one('product.product')

    @api.multi
    def set_selected_chapter(self, chapter_id):
        chapter = self.env['product.product'].browse(chapter_id)

        if not chapter.exists():
            return

        # I've also tried using self.update(), same results
        self.selected_chapter = chapter

View code:

<field name="work_unit" mode="tree,kanban" filter_field="product_id" context="{'default_product_id': selected_chapter}">
1
you have to use .trigger('change'); after changing valuesMohitGhodasara

1 Answers

0
votes

First, rename work_unit to work_unit_ids. Then, on the server side write an onchange method. See https://www.odoo.com/documentation/12.0/reference/orm.html#onchange-updating-ui-on-the-fly