diff --git a/frappe/async.py b/frappe/async.py index 764c7d4dfe..f4539ecb48 100644 --- a/frappe/async.py +++ b/frappe/async.py @@ -145,6 +145,7 @@ def emit_via_redis(event, message, room): try: r.publish('events', frappe.as_json({'event': event, 'message': message, 'room': room})) except redis.exceptions.ConnectionError: + # print frappe.get_traceback() pass def put_log(line_no, line, task_id=None): diff --git a/frappe/build.py b/frappe/build.py index d65efc538a..b91f8e85e4 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -174,6 +174,10 @@ def files_dirty(): return False def compile_less(): + from distutils.spawn import find_executable + if not find_executable("lessc"): + return + for path in app_paths: less_path = os.path.join(path, "public", "less") if os.path.exists(less_path): @@ -189,4 +193,4 @@ def compile_less(): print "compiling {0}".format(fpath) css_path = os.path.join(path, "public", "css", fname.rsplit(".", 1)[0] + ".css") - os.system("which lessc && lessc {0} > {1}".format(fpath, css_path)) + os.system("lessc {0} > {1}".format(fpath, css_path)) diff --git a/frappe/core/doctype/comment/comment.py b/frappe/core/doctype/comment/comment.py index cca70fc6b4..6d798de258 100644 --- a/frappe/core/doctype/comment/comment.py +++ b/frappe/core/doctype/comment/comment.py @@ -42,7 +42,8 @@ class Comment(Document): message['broadcast'] = True frappe.publish_realtime('new_message', message) 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: frappe.publish_realtime('new_comment', self.as_dict(), doctype= self.comment_doctype, docname = self.comment_docname) diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index 6125464ed8..da81b7fe15 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -33,6 +33,16 @@ class Communication(Document): else: self.status = "Open" + def after_insert(self): + # send new comment to listening clients + comment = self.as_dict() + comment["comment"] = comment["content"] + comment["comment_by"] = comment["sender"] + comment["comment_type"] = comment["communication_medium"] + + frappe.publish_realtime('new_comment', comment, doctype = self.reference_doctype, + docname = self.reference_name) + def on_update(self): """Update parent status as `Open` or `Replied`.""" self.update_parent() @@ -49,7 +59,7 @@ class Communication(Document): to_status = "Open" if self.sent_or_received=="Received" else "Replied" if to_status in status_field.options.splitlines(): - frappe.db.set_value(parent.doctype, parent.name, "status", to_status) + parent.db_set("status", to_status) parent.notify_update() diff --git a/frappe/desk/page/messages/messages.js b/frappe/desk/page/messages/messages.js index 5142cde7ac..5d5a2911dd 100644 --- a/frappe/desk/page/messages/messages.js +++ b/frappe/desk/page/messages/messages.js @@ -41,6 +41,7 @@ frappe.desk.pages.Messages = Class.extend({ }, setup_realtime: function() { + var me = this; frappe.realtime.on('new_message', function(comment) { if(comment.modified_by !== user) { 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') { var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); var on_broadcast_page = current_contact === user; - if (current_contact == comment.owner || (on_broadcast_page && comment.broadcast)) { - var $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 = $(''); + 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() { var me = this; return frappe.call({ @@ -124,7 +129,9 @@ frappe.desk.pages.Messages = Class.extend({ }, callback:function(r,rt) { textarea.val(''); - me.list.run(); + if (!r.exc) { + me.prepend_comment(r.message); + } }, btn: this }); diff --git a/frappe/desk/page/messages/messages.py b/frappe/desk/page/messages/messages.py index 9c050d8390..6fb86fd64a 100644 --- a/frappe/desk/page/messages/messages.py +++ b/frappe/desk/page/messages/messages.py @@ -89,6 +89,8 @@ def post(txt, contact, parenttype=None, notify=False, subject=None): else: _notify(contact, txt, subject) + return d + @frappe.whitelist() def delete(arg=None): frappe.get_doc("Comment", frappe.form_dict['name']).delete() diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index 86105afc39..ac4d72f3e0 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -154,10 +154,11 @@ $.extend(frappe.model, { }, new_comment: function(comment) { - if (frappe.model.docinfo[comment.comment_doctype] - && frappe.model.docinfo[comment.comment_doctype][comment.comment_docname]) { - var comments = frappe.model.docinfo[comment.comment_doctype][comment.comment_docname].comments; + var reference_doctype = comment.comment_doctype || comment.reference_doctype; + var reference_name = comment.comment_docname || comment.reference_name; + if (frappe.model.docinfo[reference_doctype] && frappe.model.docinfo[reference_doctype][reference_name]) { + var comments = frappe.model.docinfo[reference_doctype][reference_name].comments; var comment_exists = false; for (var i=0, l=comments.length; i