POS Longpolling

Это пользовательский модуль odoo <https://github.com/it-projects-llc/pos-addons/tree/12.0/pos_longpolling>`__&quot; ООО &quot;ИТ-Проекты&quot;, <https://it-projects.info>`__, который позволяет отправлять мгновенные обновления на интерфейсы POS из серверной части.

Он предоставляет следующие методы в * Backend side *:

Примечание

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.

Давайте проверим пример использования, взяв за основу `` Sync Partners in POS`` модуль:

Синхронизация партнеров в POS-модуле

Этот `модуль <https://github.com/it-projects-llc/pos-addons/blob/907b16cc3a4ea613bf4fc81891a03739405e57a7/pos_partner_sync/> «__» при каждом обновлении партнера (в Backend) уведомляет POS об обновлении данных партнера.

Здесь вы можете увидеть, как он использует `` pos_longpolling``:

BACKEND

@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``.

КЛИЕНТ

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);
      }
    });
  }
},