Динамический прогресс в Odoo10/Odoo11 - запуск функции javascript внутри python

Моя задача: динамический индикатор выполнения в оду.

Я использую виджет Odoo: "progressbar". Я хочу обновлять представление каждый раз, когда значение обновляется, поэтому я хочу запустить функцию javascript on_change_input внутри моего метода записи python, чтобы отобразить представление.

 @api.one
 def updatevalue(self, val):
      self.value = val
      # TODO call javascript function on_change_input()

Цель состоит в том, чтобы индикатор прогресса обновлялся во время выполнения процесса, и пользователь должен видеть прогресс без обновления сайта.

Возможно ли моя задача с помощью виджета progressbar? Или есть еще одна возможность показать динамический контент в Odoo?

Если я использую метод updatevalue как кнопку, индикатор прогресса обновляется после нажатия кнопки без вызова функции javascript и без обновления страницы... но я хочу вызвать метод в своем коде (и, возможно, rpc), поэтому это не помогает -.-

Спасибо за ваше время!


Вот рабочий процесс, который у меня есть до сих пор:

Пользователь нажимает кнопку do_time_consuming_task и вызывается следующая функция:

def do_timeconsuming_task(self):
  ws = websocket.WebSocket()
  ws.connect('ws:/129.0.0.1:1234/')
  data = { 'topic' : 'server_command', 'id' : self.id, 'commandName' : 'do_sth',}
  payload = ujson.dumps(data)
  ws.send(payload)
  ws.close()

На сервере команда принимается и обрабатывается. Существует открытое соединение rpc:

odoo = odoorpc.ODOO("129.0.0.1", port=8069)
odoo.login("database", "user", "password")
my_module = odoo.env['my_module.progress_widget_test']

progress_instance = my_module.browse(id)

Каждый раз, когда изменяется значение прогресса, я вызываю следующий метод моего модуля:

progress_instance.updatevalue(new_value)

когда значение равно 100%, я закрываю соединение

odoo.logout()

Ответ 1

Эта функция уже существует, и вы можете скопировать ее части из account/static/src/js/account_reconciliation_widgets.js из метода updateProgressBar и processReconciliations. Вы увидите здесь правильный способ обновления индикатора выполнения.

Цель состоит в том, чтобы индикатор прогресса обновлялся во время процесса и пользователь должен увидеть прогресс, не обновляя сайт.

Посмотрите на processReconciliations, как это делается, в основном вы вызываете метод process_reconciliations, который существует на задней панели, и вы возвращаете объект deferred. Из этого отложенного объекта вы можете использовать progress()

Просматривая документацию .progress(), вы увидите, что вам нужно сообщить о своем прогрессе, используя .[notify][2]()

Как вы определяете процент завершения процесса ?