From 97d2eab3e2620221b1762c005da99103f35ee35f Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Tue, 15 Nov 2022 13:05:01 +0530 Subject: [PATCH] refactor(socketio): docinfo_update - Rename event from `update_docinfo_for_{}_{}` to docinfo_update - Separate rooms for separate documents generated on requirement - Check if user has access to doc before sharing docinfo --- frappe/core/doctype/comment/comment.py | 4 +++- .../core/doctype/communication/communication.py | 4 +++- frappe/public/js/frappe/form/form.js | 7 +++---- frappe/public/js/frappe/socketio_client.js | 3 +++ frappe/realtime.py | 6 ++++++ socketio.js | 16 ++++++++++++++++ 6 files changed, 34 insertions(+), 6 deletions(-) diff --git a/frappe/core/doctype/comment/comment.py b/frappe/core/doctype/comment/comment.py index 3d886cf93b..9cad86ece1 100644 --- a/frappe/core/doctype/comment/comment.py +++ b/frappe/core/doctype/comment/comment.py @@ -44,8 +44,10 @@ class Comment(Document): return frappe.publish_realtime( - f"update_docinfo_for_{self.reference_doctype}_{self.reference_name}", + "docinfo_update", {"doc": self.as_dict(), "key": key, "action": action}, + doctype=self.reference_doctype, + docname=self.reference_name, after_commit=True, ) diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index bd85023025..9944961ca9 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -233,8 +233,10 @@ class Communication(Document, CommunicationEmailMixin): def notify_change(self, action): frappe.publish_realtime( - f"update_docinfo_for_{self.reference_doctype}_{self.reference_name}", + "docinfo_update", {"doc": self.as_dict(), "key": "communications", "action": action}, + doctype=self.reference_doctype, + docname=self.reference_name, after_commit=True, ) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 4f119f2551..78cdb03f6e 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1942,10 +1942,9 @@ frappe.ui.form.Form = class FrappeForm { setup_docinfo_change_listener() { let doctype = this.doctype; let docname = this.docname; - let listener_name = `update_docinfo_for_${doctype}_${docname}`; - // to avoid duplicates - frappe.realtime.off(listener_name); - frappe.realtime.on(listener_name, ({ doc, key, action = "update" }) => { + + frappe.socketio.docinfo_subscribe(doctype, docname); + frappe.realtime.on("docinfo_update", ({ doc, key, action = "update" }) => { let doc_list = frappe.model.docinfo[doctype][docname][key] || []; if (action === "add") { frappe.model.docinfo[doctype][docname][key].push(doc); diff --git a/frappe/public/js/frappe/socketio_client.js b/frappe/public/js/frappe/socketio_client.js index 7bbd9fea76..e744a04c54 100644 --- a/frappe/public/js/frappe/socketio_client.js +++ b/frappe/public/js/frappe/socketio_client.js @@ -152,6 +152,9 @@ frappe.socketio = { frappe.socketio.socket.emit("doc_subscribe", doctype, docname); frappe.socketio.open_docs.push({ doctype: doctype, docname: docname }); }, + docinfo_subscribe: function (doctype, docname) { + frappe.socketio.socket.emit("docinfo_update", doctype, docname); + }, doc_unsubscribe: function (doctype, docname) { frappe.socketio.socket.emit("doc_unsubscribe", doctype, docname); frappe.socketio.open_docs = $.filter(frappe.socketio.open_docs, function (d) { diff --git a/frappe/realtime.py b/frappe/realtime.py index d843696c50..c1af250fcd 100644 --- a/frappe/realtime.py +++ b/frappe/realtime.py @@ -51,6 +51,8 @@ def publish_realtime( elif event == "list_update": doctype = doctype or message.get("doctype") room = get_list_room(doctype) + elif event == "docinfo_update": + room = get_docinfo_room(doctype, docname) if not task_id and hasattr(frappe.local, "task_id"): task_id = frappe.local.task_id @@ -148,6 +150,10 @@ def get_doc_room(doctype, docname): return f"{frappe.local.site}:doc:{doctype}/{cstr(docname)}" +def get_docinfo_room(doctype, docname): + return f"{frappe.local.site}:doc:{doctype}/{cstr(docname)}" + + def get_user_room(user): return f"{frappe.local.site}:user:{user}" diff --git a/socketio.js b/socketio.js index 050e42bcd8..5f6057c707 100644 --- a/socketio.js +++ b/socketio.js @@ -87,6 +87,18 @@ io.on("connection", function (socket) { send_existing_lines(task_id, socket); }); + socket.on("docinfo_update", function (doctype, docname) { + can_subscribe_doc({ + socket, + doctype, + docname, + callback: () => { + var room = get_docinfo_room(socket, doctype, docname); + socket.join(room); + }, + }); + }); + socket.on("doc_subscribe", function (doctype, docname) { can_subscribe_doc({ socket, @@ -214,6 +226,10 @@ function get_doc_room(socket, doctype, docname) { return get_site_name(socket) + ":doc:" + doctype + "/" + docname; } +function get_docinfo_room(socket, doctype, docname) { + return get_site_name(socket) + ":docinfo:" + doctype + "/" + docname; +} + function get_open_doc_room(socket, doctype, docname) { return get_site_name(socket) + ":open_doc:" + doctype + "/" + docname; }