Browse Source

[fix] Show messages in realtime in the messages page

version-14
Anand Doshi 9 years ago
parent
commit
6983fa72f9
5 changed files with 32 additions and 10 deletions
  1. +1
    -0
      frappe/async.py
  2. +2
    -1
      frappe/core/doctype/comment/comment.py
  3. +13
    -6
      frappe/desk/page/messages/messages.js
  4. +2
    -0
      frappe/desk/page/messages/messages.py
  5. +14
    -3
      socketio.js

+ 1
- 0
frappe/async.py View File

@@ -145,6 +145,7 @@ def emit_via_redis(event, message, room):
try: try:
r.publish('events', frappe.as_json({'event': event, 'message': message, 'room': room})) r.publish('events', frappe.as_json({'event': event, 'message': message, 'room': room}))
except redis.exceptions.ConnectionError: except redis.exceptions.ConnectionError:
# print frappe.get_traceback()
pass pass


def put_log(line_no, line, task_id=None): def put_log(line_no, line, task_id=None):


+ 2
- 1
frappe/core/doctype/comment/comment.py View File

@@ -42,7 +42,8 @@ class Comment(Document):
message['broadcast'] = True message['broadcast'] = True
frappe.publish_realtime('new_message', message) frappe.publish_realtime('new_message', message)
else: else:
frappe.publish_realtime('new_message', self.as_dict(), user=frappe.session.user)
# comment_docname contains the user who is addressed in the messages' page comment
frappe.publish_realtime('new_message', self.as_dict(), user=self.comment_docname)
else: else:
frappe.publish_realtime('new_comment', self.as_dict(), doctype= self.comment_doctype, frappe.publish_realtime('new_comment', self.as_dict(), doctype= self.comment_doctype,
docname = self.comment_docname) docname = self.comment_docname)


+ 13
- 6
frappe/desk/page/messages/messages.js View File

@@ -41,6 +41,7 @@ frappe.desk.pages.Messages = Class.extend({
}, },


setup_realtime: function() { setup_realtime: function() {
var me = this;
frappe.realtime.on('new_message', function(comment) { frappe.realtime.on('new_message', function(comment) {
if(comment.modified_by !== user) { if(comment.modified_by !== user) {
frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment); frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment);
@@ -48,16 +49,20 @@ frappe.desk.pages.Messages = Class.extend({
if (frappe.get_route()[0] === 'messages') { if (frappe.get_route()[0] === 'messages') {
var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); var current_contact = $(cur_page.page).find('[data-contact]').data('contact');
var on_broadcast_page = current_contact === user; var on_broadcast_page = current_contact === user;
if (current_contact == comment.owner || (on_broadcast_page && comment.broadcast)) {
var $row = $('<div class="list-row"/>');
frappe.desk.pages.messages.list.data.unshift(comment);
frappe.desk.pages.messages.list.render_row($row, comment);
frappe.desk.pages.messages.list.parent.prepend($row);
if ((current_contact == comment.owner) || (on_broadcast_page && comment.broadcast)) {
me.prepend_comment(comment);
} }
} }
}); });
}, },


prepend_comment: function(comment) {
var $row = $('<div class="list-row"/>');
frappe.desk.pages.messages.list.data.unshift(comment);
frappe.desk.pages.messages.list.render_row($row, comment);
frappe.desk.pages.messages.list.$w.prepend($row);
},

make_sidebar: function() { make_sidebar: function() {
var me = this; var me = this;
return frappe.call({ return frappe.call({
@@ -124,7 +129,9 @@ frappe.desk.pages.Messages = Class.extend({
}, },
callback:function(r,rt) { callback:function(r,rt) {
textarea.val(''); textarea.val('');
me.list.run();
if (!r.exc) {
me.prepend_comment(r.message);
}
}, },
btn: this btn: this
}); });


+ 2
- 0
frappe/desk/page/messages/messages.py View File

@@ -89,6 +89,8 @@ def post(txt, contact, parenttype=None, notify=False, subject=None):
else: else:
_notify(contact, txt, subject) _notify(contact, txt, subject)


return d

@frappe.whitelist() @frappe.whitelist()
def delete(arg=None): def delete(arg=None):
frappe.get_doc("Comment", frappe.form_dict['name']).delete() frappe.get_doc("Comment", frappe.form_dict['name']).delete()


+ 14
- 3
socketio.js View File

@@ -25,10 +25,13 @@ io.on('connection', function(socket){
if (get_hostname(socket.request.headers.host) != get_hostname(socket.request.headers.origin)) { if (get_hostname(socket.request.headers.host) != get_hostname(socket.request.headers.origin)) {
return; return;
} }

// console.log("connection!");
var sid = cookie.parse(socket.request.headers.cookie).sid var sid = cookie.parse(socket.request.headers.cookie).sid
if(!sid) { if(!sid) {
return; return;
} }
// console.log("firing get_user_info");
request.post(get_url(socket, '/api/method/frappe.async.get_user_info')) request.post(get_url(socket, '/api/method/frappe.async.get_user_info'))
.type('form') .type('form')
.send({ .send({
@@ -45,16 +48,19 @@ io.on('connection', function(socket){
socket.join(room); socket.join(room);
socket.join(get_site_room(socket)); socket.join(get_site_room(socket));
} }
})
});

socket.on('task_subscribe', function(task_id) { socket.on('task_subscribe', function(task_id) {
var room = 'task:' + task_id; var room = 'task:' + task_id;
socket.join(room); socket.join(room);
})
});

socket.on('progress_subscribe', function(task_id) { socket.on('progress_subscribe', function(task_id) {
var room = 'task_progress:' + task_id; var room = 'task_progress:' + task_id;
socket.join(room); socket.join(room);
send_existing_lines(task_id, socket); send_existing_lines(task_id, socket);
})
});

socket.on('doc_subscribe', function(doctype, docname) { socket.on('doc_subscribe', function(doctype, docname) {
// console.log('trying to subscribe', doctype, docname) // console.log('trying to subscribe', doctype, docname)
request.post(get_url(socket, '/api/method/frappe.async.can_subscribe_doc')) request.post(get_url(socket, '/api/method/frappe.async.can_subscribe_doc'))
@@ -73,10 +79,15 @@ io.on('connection', function(socket){
} }
}) })
}); });

socket.on('doc_unsubscribe', function(doctype, docname) { socket.on('doc_unsubscribe', function(doctype, docname) {
var room = get_doc_room(socket, doctype, docname); var room = get_doc_room(socket, doctype, docname);
socket.leave(room); socket.leave(room);
}); });

// socket.on('disconnect', function (arguments) {
// console.log("user disconnected", arguments);
// });
}); });


function send_existing_lines(task_id, socket) { function send_existing_lines(task_id, socket) {


Loading…
Cancel
Save