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
This commit is contained in:
Gavin D'souza 2022-11-15 13:05:01 +05:30
parent 9931c3af04
commit 97d2eab3e2
6 changed files with 34 additions and 6 deletions

View file

@ -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,
)

View file

@ -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,
)

View file

@ -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);

View file

@ -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) {

View file

@ -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}"

View file

@ -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;
}