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.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
// ...
}
},