bus.bus

автобус

Bus - это модуль для мгновенных уведомлений через longpolling. Добавьте его в список зависимостей:

'depends': ['bus']

Примечание

Почтовый модуль в odoo 9.0 уже зависит от шины модуля.

Предупреждение

Не путайте longpolling bus с core.bus, который только на стороне клиента и является частью модуля `` web``.

Что такое длинный опрос

Как реализовать лонгполлинг

Схема работы

  • Укажите каналы, которые слушает текущий клиент
  • Привязать событие уведомления к вашему обработчику
  • Начать опрос
  • Отправить уведомление на некоторый канал через код Python

Идентификатор канала

Идентификатор канала - это способ отличить один канал от другого. В основном канал содержит dbname, некоторую строку и некоторый идентификатор.

Добавленные через js идентификаторы могут быть только строковыми.

var channel = JSON.stringify([dbname, 'model.name', uid]);

С помощью идентификаторов Python может быть добавлена строка или любая структура данных.

# tuple
channel = (request.db, 'model.name', request.uid)
# or a string
channel = '["%s","%s","%s"]' % (request.db, 'model.name', request.uid)

Предупреждение

JSON.stringify в js и json.dumps в python могут дать другой результат.

Прослушанные каналы

Вы можете добавить каналы двумя способами: либо на стороне сервера через функцию `` _poll`` в контроллере шины, либо в файле js, используя метод `` bus.add_channel () ``.

С контроллерами:

# In odoo 8.0:
import openerp.addons.bus.bus.Controller as BusController

# In odoo 9.0:
import openerp.addons.bus.controllers.main.BusController

class Controller(BusController):
    def _poll(self, dbname, channels, last, options):
        if request.session.uid:
            registry, cr, uid, context = request.registry, request.cr, request.session.uid, request.context
            new_channel = (request.db, 'module.name', request.uid)
            channels.append(new_channel)
        return super(Controller, self)._poll(dbname, channels, last, options)

В файле js:

// 8.0
var bus = openerp.bus.bus;
// 9.0+
var bus = require('bus.bus').bus;

var channel = JSON.stringify([dbname, 'model.name', uid]);
bus.add_channel(new_channel);

Обязательное уведомление о событии

В файле js:

bus.on("notification", this, this.on_notification);

Начать опрос

В файле js:

bus.start_polling();

Примечание

Вам не нужно вызывать `` bus.start_polling (); ``, если он уже был запущен другим модулем.

Когда начинается опрос, отправляется запрос `` / longpolling / poll``, так что вы можете найти и проверить его с помощью инструмента «Сеть» в своем браузере.

Отправка уведомления

Вы можете отправить уведомление только через питона. Если вам нужно сделать это через клиента, сначала отправьте сигнал на сервер обычным способом (например, через контроллеры).

self.env['bus.bus'].sendmany([(channel1, message1), (channel2, message2), ...])
# or
self.env['bus.bus'].sendone(channel, message)

Обработка уведомлений

on_notification: function (notifications) {
    // Old versions passes single notification item here. Convert it to the latest format.
    if (typeof notification[0][0] === 'string') {
        notification = [notification]
    }
    for (var i = 0; i < notification.length; i++) {
        var channel = notification[i][0];
        var message = notification[i][1];

        // proceed a message as you need
        // ...
    }
},