From 65bc63f03143f764cc4d39df9d3dc858d2ed0b5e Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 21 Aug 2015 12:56:48 +0530 Subject: [PATCH] [fix] document refresh notification for same user in different tabs/sessions --- frappe/__init__.py | 1 + frappe/app.py | 5 +++++ frappe/async.py | 7 +++++-- frappe/model/document.py | 2 +- frappe/public/css/form.css | 1 + frappe/public/js/frappe/form/save.js | 8 ++++---- frappe/public/js/frappe/model/model.js | 2 +- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 5f96e8818a..e00c5ad875 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -89,6 +89,7 @@ def init(site, sites_path=None): local.error_log = [] local.message_log = [] local.debug_log = [] + local.realtime_log = [] local.flags = _dict({ "ran_schedulers": [], "redirect_location": "", diff --git a/frappe/app.py b/frappe/app.py index 61bc24086f..6d6b34b005 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -17,6 +17,7 @@ import frappe import frappe.handler import frappe.auth import frappe.api +import frappe.async import frappe.utils.response import frappe.website.render from frappe.utils import get_site_name, get_site_path @@ -122,6 +123,10 @@ def application(request): if updated_in_db: frappe.db.commit() + # publish realtime + for args in frappe.local.realtime_log: + frappe.async.emit_via_redis(*args) + finally: if frappe.local.request.method in ("POST", "PUT") and frappe.db and rollback: frappe.db.rollback() diff --git a/frappe/async.py b/frappe/async.py index b4f50f9a98..9d6a1501ef 100644 --- a/frappe/async.py +++ b/frappe/async.py @@ -120,7 +120,7 @@ def is_file_old(file_path): return ((time.time() - os.stat(file_path).st_mtime) > TASK_LOG_MAX_AGE) -def publish_realtime(event, message=None, room=None, user=None, doctype=None, docname=None): +def publish_realtime(event, message=None, room=None, user=None, doctype=None, docname=None, now=False): """Publish real-time updates :param event: Event name, like `task_progress` etc. @@ -140,7 +140,10 @@ def publish_realtime(event, message=None, room=None, user=None, doctype=None, do else: room = get_site_room() - emit_via_redis(event, message, room) + if now: + emit_via_redis(event, message, room) + else: + frappe.local.realtime_log.append([event, message, room]) def emit_via_redis(event, message, room): """Publish real-time updates via redis diff --git a/frappe/model/document.py b/frappe/model/document.py index d743fb7966..d31b3836b8 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -579,7 +579,7 @@ class Document(BaseDocument): def notify_modified(self): """Publish realtime that the current document is modified""" - frappe.publish_realtime("doc_update", {"modified_by": frappe.session.user, "doctype": self.doctype, "name": self.name}, + frappe.publish_realtime("doc_update", {"modified": self.modified, "doctype": self.doctype, "name": self.name}, doctype=self.doctype, docname=self.name) if not self.meta.get("read_only") and not self.meta.get("issingle") and \ diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 227a127981..000ec62c7f 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -165,6 +165,7 @@ select.form-control { font-size: 12px; background-color: #fffce7; margin-bottom: 0px; + margin: 0px -15px; } .delivery-status-indicator { display: inline-block; diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js index 554dcba54f..af86e33497 100644 --- a/frappe/public/js/frappe/form/save.js +++ b/frappe/public/js/frappe/form/save.js @@ -39,20 +39,20 @@ frappe.ui.form.save = function(frm, action, callback, btn) { var cancel = function() { var args = { - doctype: frm.doc.doctype, + doctype: frm.doc.doctype, name: frm.doc.name }; - + // update workflow state value if workflow exists var workflow_state_fieldname = frappe.workflow.get_state_fieldname(frm.doctype); if(workflow_state_fieldname) { $.extend(args, { workflow_state_fieldname: workflow_state_fieldname, workflow_state: frm.doc[workflow_state_fieldname] - + }); } - + _call({ method: "frappe.desk.form.save.cancel", args: args, diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index 6aa54c4dd4..707626b42d 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -43,7 +43,7 @@ $.extend(frappe.model, { if(doc) { // current document is dirty, show message if its not me if(cur_frm.doc.doctype===doc.doctype && cur_frm.doc.name===doc.name) { - if(data.modified_by!==user) { + if(!frappe.ui.form.is_saving && data.modified!=cur_frm.doc.modified) { doc.__needs_refresh = true; cur_frm.show_if_needs_refresh(); }