Как создать кнопку в заголовке древовидного списка (рядом с кнопками создания и импорта) и придать ей функциональность? В одоо 9

Я пытаюсь добавить кнопку в древовидное представление модуля заказ на продажу рядом с кнопками создать и импортировать. Эта кнопка выполнит метод Python.

Я создал свой собственный модуль, расширив модуль заказа на продажу, а затем выполнил следующие шаги:

Шаг 1. Создайте кнопку в my_module/static/src/xml/qweb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
  <t t-extend="ListView.buttons">
    <t t-jquery="button.o_list_button_add" t-operation="after">
      <t t-if="widget.model=='sale.order'">
        <button class="btn btn-sm btn-primary update_sales_button" type="button">Run my stuff</button>
      </t>
    </t>
  </t>
</templates>

Шаг 2. Добавьте файл в раздел qweb в __openerp.py__ моего модуля:

'depends': ['sale'],
'data': [],
'qweb': ['static/src/xml/qweb.xml'],

Теперь появляется кнопка.

Шаг 3. Создайте метод python для придания функциональности кнопке в файле my_module/my_python_file.py:

from openerp import api, fields, models, _

class SaleOrderExtended(models.Model):
  _inherit = ['sale.order']

  @api.multi
  def update_sales_button(self):
    ...

Примечание. Метод Python был протестирован вне odoo и работает нормально.

Как я могу связать этот метод Python с кнопкой?


person MouTio    schedule 10.04.2017    source источник


Ответы (2)


Вам нужно расширить виджет 'ListView', добавив прослушиватель кликов. Также добавьте в свой метод декоратор '@api.model', чтобы вы могли вызывать его из js с помощью метода 'call'. Что-то вроде этого:

ListView = require('web.ListView')

ListView.include({
    render_buttons: function() {

        // GET BUTTON REFERENCE
        this._super.apply(this, arguments)
        if (this.$buttons) {
            var btn = this.$buttons.find('.update_sales_button')
        }

        // PERFORM THE ACTION
        btn.on('click', this.proxy('do_new_button'))

    },
    do_new_button: function() {

        instance.web.Model('sale.order')
            .call('update_sale_button', [[]])
            .done(function(result) {
                < do your stuff, if you don't need to do anything remove the 'done' function >
            })
})
person Michele Zaccheddu    schedule 10.04.2017
comment
Я поместил его в файл update_sales_button.js, и теперь в консоли браузера отображается следующее: Uncaught ReferenceError: instance is notdefined at update_sales_button.js:1 - person MouTio; 11.04.2017
comment
Я думаю, это зависит от того, какой метод включения js вы используете. Если вы используете старый способ: 'openerp.your_object_name = function(instance, local) {}', вы можете использовать 'instance', иначе в новом стиле 'odoo.define('your_widget_name', function(require) {})' вы должны получить виджет ListView через 'require('web.ListView')'. Вы присваиваете его переменной типа: var ListView = require('web.ListView'), а затем просто вызываете ListView.include({ ‹ all the stuff › }). Попробуйте просмотреть файл 'addons/web/static/src/js/views/list_view.js'. - person Michele Zaccheddu; 11.04.2017

Я использую odoo 11, и мне пришлось заменить widget.model на widget.modelName в шаблоне темы для начинающих (первый — это объект, второй — строка). Кроме того, чтобы добавить кнопку в конец строки, я изменил t-operation на "append" при поиске родительского div:

<t t-extend="ListView.buttons">
    <t t-jquery="div.o_list_buttons" t-operation="append">
        <t t-if="widget.modelName=='sale.order'">
            <button class="btn btn-sm btn-default import_email_button" type="button">
                Import E-mail Order
            </button>
        </t>
    </t>
</t>
person skirill    schedule 10.04.2018