POS Longpolling¶
Это пользовательский модуль odoo <https://github.com/it-projects-llc/pos-addons/tree/12.0/pos_longpolling>`__" ООО "ИТ-Проекты", <https://it-projects.info>`__, который позволяет отправлять мгновенные обновления на интерфейсы POS из серверной части.
Он предоставляет следующие методы в * Backend side *:
- `` self.env ['pos.config] .send_to_all_poses (channel_name, data) ``: передает сообщения всем открытым POS (см. пример ` <https://github.com/it-projects-llc/pos-addons/blob/28d2b00bfd3f5d09bb65d5bf3245a6b87ed1d67b/pos_longpolling/models/pos_longpolling_models.py#L49-L53>`__)
- `` pos_set._send_to_channel (channel_name, data)
: передает сообщение POS в `` pos_set
(см. пример ` <https://github.com/it-projects-llc/pos-addons/blob/28d2b00bfd3f5d09bb65d5bf3245a6b87ed1d67b/pos_longpolling/models/pos_longpolling_models.py#L22-L31>`__) - `` _send_to_channel_by_id (self, dbname, pos_id, channel_name)
: отправляет сообщение для точного POS `` pos_id
, использует имя базы данных `` dbname``, `` channel_name``, `` message = 'PONG'` (см. пример <https://github.com/it-projects-llc/pos-addons/blob/28d2b00bfd3f5d09bb65d5bf3245a6b87ed1d67b/pos_longpolling/models/pos_longpolling_models.py#L34-L38>`__)
Примечание
POS получит уведомление только в том случае, если он подписан на указанное `` имя_канала``.
Для * клиентской стороны * методы:
- `` add_bus (key, sync_server)
: позволяет создать дополнительную шину для синхронизации данных с другим сервером синхронизации (см. пример ` <https://github.com/it-projects-llc/pos-addons/blob/4b9385b71f13f5df993317196d23972b65a7c2f8/pos_multi_session/static/src/js/pos_multi_session.js#L146>`__ в` `pos_multi_session
- он получает данные с локального сервера для ускорения синхронизации)
Примечание
Вам не нужно использовать `` add_bus``, если вы подключаетесь к обычному серверу odoo.
- `` add_channel_callback: function (channel_name, callback, thisArg) ``: подписка на определенный канал (см. пример ` <https://github.com/it-projects-llc/pos-addons/blob/28d2b00bfd3f5d09bb65d5bf3245a6b87ed1d67b/pos_longpolling/static/src/js/pos_longpolling.js#L97>`__)
Давайте проверим пример использования, взяв за основу `` Sync Partners in POS`` модуль:
Синхронизация партнеров в POS-модуле¶
Этот `модуль <https://github.com/it-projects-llc/pos-addons/blob/907b16cc3a4ea613bf4fc81891a03739405e57a7/pos_partner_sync/> «__» при каждом обновлении партнера (в Backend) уведомляет POS об обновлении данных партнера.
Здесь вы можете увидеть, как он использует `` pos_longpolling``:
BACKEND¶
- При обновлении партнера метод `` send_field_updates```. <https://github.com/it-projects-llc/pos-addons/blob/907b16cc3a4ea613bf4fc81891a03739405e57a7/pos_partner_sync/models/res_partner.py#L39-L43::>`__ называется:
@api.model
def send_field_updates(self, partner_ids, action=''):
channel_name = "pos_partner_sync"
data = {'message': 'update_partner_fields', 'action': action, 'partner_ids': partner_ids}
self.env['pos.config'].send_to_all_poses(channel_name, data)
- Он использует метод `` send_to_all_poses``.
КЛИЕНТ¶
- При запуске POS он подписывается на канал <https://github.com/it-projects-llc/pos-addons/blob/e471b4af2f062852d256d46c200e582b0f20d0ad/pos_partner_sync/static/src/js/pos_partner_sync.js#L13-L19::>`__` pos_partner_sync`.
initialize: function () {
PosModelSuper.prototype.initialize.apply(this, arguments);
var self = this;
this.ready.then(function () {
self.bus.add_channel_callback("pos_partner_sync", self.on_barcode_updates, self);
});
},
- Об уведомлении on_barcode_updates вызывается, который перезагружает данные партнера:
on_barcode_updates: function(data){
var self = this;
if (data.message === 'update_partner_fields') {
var def = new $.Deferred();
if (data.action && data.action === 'unlink') {
// partner is deleted. Make necessary updates in UI
this.remove_unlinked_partners(data.partner_ids);
def.resolve();
} else {
// reload partner data
def = self.load_new_partners(data.partner_ids);
}
return def.done(function(){
var opened_client_list_screen = self.gui.get_current_screen() === 'clientlist' && self.gui.screen_instances.clientlist;
if (opened_client_list_screen){
// rerender partner list
opened_client_list_screen.update_client_list_screen(data.partner_ids);
}
});
}
},