diff --git a/frappe/__init__.py b/frappe/__init__.py index b7cc65cbe1..5f96e8818a 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -1000,7 +1000,10 @@ def publish_realtime(*args, **kwargs): :param event: Event name, like `task_progress` etc. :param message: JSON message object. For async must contain `task_id` - :param room: Room in which to publish update (default entire site)""" + :param room: Room in which to publish update (default entire site) + :param user: Transmit to user + :param doctype: Transmit to doctype, docname + :param docname: Transmit to doctype, docname""" import frappe.async - frappe.async.publish_realtime(*args, **kwargs) + return frappe.async.publish_realtime(*args, **kwargs) diff --git a/frappe/async.py b/frappe/async.py index e2a748b4ba..fbe7856b23 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, room=None, user=None, doctype=None, docname=None): +def publish_realtime(event, message=None, room=None, user=None, doctype=None, docname=None): """Publish real-time updates :param event: Event name, like `task_progress` etc. @@ -128,18 +128,23 @@ def publish_realtime(event, message, room=None, user=None, doctype=None, docname :param room: Room in which to publish update (default entire site) :param user: Transmit to user :param doctype: Transmit to doctype, docname - :param doctype: Transmit to doctype, docname""" + :param docname: Transmit to doctype, docname""" + if message is None: + message = {} + if not room: if user: - get_user_room(user) - if doctype and docname: - get_doc_room(doctype, docname) + room = get_user_room(user) + elif doctype and docname: + room = get_doc_room(doctype, docname) + message["doctype"] = doctype + message["name"] = docname else: room = get_site_room() emit_via_redis(event, message, room) -def emit_via_redis(event, message, room=None): +def emit_via_redis(event, message, room): """Publish real-time updates via redis :param event: Event name, like `task_progress` etc. diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index e1789d655d..904906d1ad 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -1,519 +1,1204 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 1, - "creation": "2014-03-11 14:55:00", - "description": "Represents a User in the system.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Master", + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 1, + "creation": "2014-03-11 14:55:00", + "custom": 0, + "description": "Represents a User in the system.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "", "fields": [ { - "fieldname": "sb0_5", - "fieldtype": "Section Break", - "label": "", - "permlevel": 0 - }, - { - "default": "1", - "fieldname": "enabled", - "fieldtype": "Check", - "in_list_view": 0, - "label": "Enabled", - "no_copy": 0, - "oldfieldname": "enabled", - "oldfieldtype": "Check", - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "section_break_3", - "fieldtype": "Section Break", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "email", - "fieldtype": "Data", - "hidden": 0, - "label": "Email", - "no_copy": 1, - "oldfieldname": "email", - "oldfieldtype": "Data", - "options": "Email", - "permlevel": 0, - "reqd": 1, - "search_index": 0 - }, - { - "fieldname": "first_name", - "fieldtype": "Data", - "in_list_view": 0, - "label": "First Name", - "no_copy": 0, - "oldfieldname": "first_name", - "oldfieldtype": "Data", - "permlevel": 0, - "reqd": 1 - }, - { - "fieldname": "middle_name", - "fieldtype": "Data", - "label": "Middle Name (Optional)", - "no_copy": 0, - "oldfieldname": "middle_name", - "oldfieldtype": "Data", - "permlevel": 0 - }, - { - "fieldname": "last_name", - "fieldtype": "Data", - "in_list_view": 0, - "label": "Last Name", - "oldfieldname": "last_name", - "oldfieldtype": "Data", - "permlevel": 0 - }, - { - "default": "1", - "depends_on": "eval:doc.__islocal", - "fieldname": "send_welcome_email", - "fieldtype": "Check", - "label": "Send Welcome Email", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "unsubscribed", - "fieldtype": "Check", - "hidden": 1, - "label": "Unsubscribed", - "no_copy": 1, - "permlevel": 0 - }, - { - "fieldname": "column_break0", - "fieldtype": "Column Break", - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_width": "50%", + "allow_on_submit": 0, + "fieldname": "sb0_5", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "default": "1", + "fieldname": "enabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Enabled", + "no_copy": 0, + "oldfieldname": "enabled", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "section_break_3", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "email", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Email", + "no_copy": 1, + "oldfieldname": "email", + "oldfieldtype": "Data", + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "first_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "First Name", + "no_copy": 0, + "oldfieldname": "first_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "middle_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Middle Name (Optional)", + "no_copy": 0, + "oldfieldname": "middle_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "last_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last Name", + "no_copy": 0, + "oldfieldname": "last_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "default": "1", + "depends_on": "eval:doc.__islocal", + "fieldname": "send_welcome_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Send Welcome Email", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "unsubscribed", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Unsubscribed", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_width": "50%", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, - { - "description": "", - "fieldname": "language", - "fieldtype": "Select", - "label": "Language", - "options": "Loading...", - "permlevel": 0 - }, - { - "description": "", - "fieldname": "time_zone", - "fieldtype": "Select", - "label": "Timezone", - "permlevel": 0 - }, - { - "depends_on": "eval:!doc.__islocal", - "fieldname": "change_password", - "fieldtype": "Section Break", - "label": "", - "permlevel": 0 - }, - { - "fieldname": "new_password", - "fieldtype": "Password", - "label": "Set New Password", - "no_copy": 1, - "permlevel": 0 - }, - { - "depends_on": "", - "fieldname": "send_password_update_notification", - "fieldtype": "Check", - "label": "Send Password Update Notification", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "reset_password_key", - "fieldtype": "Data", - "hidden": 1, - "label": "Reset Password Key", - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "read_only": 1 - }, - { - "depends_on": "eval:!doc.__islocal", - "fieldname": "display_settings", - "fieldtype": "Section Break", - "label": "", - "permlevel": 0 - }, - { - "description": "Get your globally recognized avatar from Gravatar.com", - "fieldname": "user_image", - "fieldtype": "Attach", - "hidden": 0, - "label": "User Image", - "no_copy": 1, - "permlevel": 0 - }, - { - "fieldname": "cb21", - "fieldtype": "Column Break", - "permlevel": 0 - }, - { - "fieldname": "user_image_show", - "fieldtype": "Image", - "label": "user_image_show", - "options": "user_image", - "permlevel": 0 - }, - { - "fieldname": "email_settings", - "fieldtype": "Section Break", - "label": "Email Settings", - "permlevel": 0, - "precision": "" - }, - { - "default": "1", - "fieldname": "thread_notify", - "fieldtype": "Check", - "label": "Send Notifications for Transactions I Follow", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "email_signature", - "fieldtype": "Small Text", - "label": "Email Signature", - "no_copy": 1, - "permlevel": 0 - }, - { - "fieldname": "background", - "fieldtype": "Section Break", - "label": "", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "background_image", - "fieldtype": "Attach", - "label": "Background Image", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "background_style", - "fieldtype": "Select", - "label": "Background Style", - "options": "Fill Screen\nTile", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "short_bio", - "fieldtype": "Section Break", - "label": "", - "permlevel": 0 - }, - { - "fieldname": "gender", - "fieldtype": "Select", - "label": "Gender", - "oldfieldname": "gender", - "oldfieldtype": "Select", - "options": "\nMale\nFemale\nOther", - "permlevel": 0, - "search_index": 0 - }, - { - "fieldname": "birth_date", - "fieldtype": "Date", - "label": "Birth Date", - "no_copy": 1, - "oldfieldname": "birth_date", - "oldfieldtype": "Date", - "permlevel": 0 - }, - { - "fieldname": "location", - "fieldtype": "Data", - "label": "Location", - "no_copy": 1, - "permlevel": 0 - }, - { - "fieldname": "column_break_22", - "fieldtype": "Column Break", - "permlevel": 0 - }, - { - "fieldname": "bio", - "fieldtype": "Small Text", - "label": "Bio", - "no_copy": 1, - "permlevel": 0, - "set_only_once": 0 - }, - { - "description": "Check / Uncheck roles assigned to the User. Click on the Role to find out what permissions that Role has.", - "fieldname": "sb1", - "fieldtype": "Section Break", - "label": "Roles", - "permlevel": 1, - "read_only": 1 - }, - { - "fieldname": "roles_html", - "fieldtype": "HTML", - "label": "Roles HTML", - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "user_roles", - "fieldtype": "Table", - "hidden": 1, - "label": "Roles Assigned", - "options": "UserRole", - "permlevel": 1, - "print_hide": 1, - "read_only": 1 - }, - { - "default": "", - "description": "Uncheck modules to hide from user's desktop", - "fieldname": "modules_access", - "fieldtype": "Section Break", - "label": "Modules Access", - "permlevel": 1, - "precision": "" - }, - { - "fieldname": "modules_html", - "fieldtype": "HTML", - "label": "Modules HTML", - "permlevel": 1, - "precision": "" - }, - { - "fieldname": "block_modules", - "fieldtype": "Table", - "hidden": 1, - "label": "Block Modules", - "options": "Block Module", - "permlevel": 1, - "precision": "" - }, - { - "description": "These values will be automatically updated in transactions and also will be useful to restrict permissions for this user on transactions containing these values.", - "fieldname": "sb2", - "fieldtype": "Section Break", - "hidden": 1, - "label": "Defaults", - "oldfieldtype": "Column Break", - "permlevel": 1, - "print_width": "50%", - "read_only": 1, + }, + { + "allow_on_submit": 0, + "description": "", + "fieldname": "language", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Language", + "no_copy": 0, + "options": "Loading...", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "", + "fieldname": "time_zone", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Timezone", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "depends_on": "eval:!doc.__islocal || !cint(doc.send_welcome_email)", + "fieldname": "change_password", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "new_password", + "fieldtype": "Password", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Set New Password", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "send_password_update_notification", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Send Password Update Notification", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "reset_password_key", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reset Password Key", + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "display_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Get your globally recognized avatar from Gravatar.com", + "fieldname": "user_image", + "fieldtype": "Attach", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User Image", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "cb21", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "user_image_show", + "fieldtype": "Image", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "user_image_show", + "no_copy": 0, + "options": "user_image", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "email_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Email Settings", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "default": "1", + "fieldname": "thread_notify", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Send Notifications for Transactions I Follow", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "email_signature", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Email Signature", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "background", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "background_image", + "fieldtype": "Attach", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Background Image", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "background_style", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Background Style", + "no_copy": 0, + "options": "Fill Screen\nTile", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "short_bio", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "gender", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Gender", + "no_copy": 0, + "oldfieldname": "gender", + "oldfieldtype": "Select", + "options": "\nMale\nFemale\nOther", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "birth_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Birth Date", + "no_copy": 1, + "oldfieldname": "birth_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "location", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Location", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "column_break_22", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "bio", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Bio", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Check / Uncheck roles assigned to the User. Click on the Role to find out what permissions that Role has.", + "fieldname": "sb1", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Roles", + "no_copy": 0, + "permlevel": 1, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "roles_html", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Roles HTML", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "user_roles", + "fieldtype": "Table", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Roles Assigned", + "no_copy": 0, + "options": "UserRole", + "permlevel": 1, + "print_hide": 1, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "default": "", + "description": "Uncheck modules to hide from user's desktop", + "fieldname": "modules_access", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Modules Access", + "no_copy": 0, + "permlevel": 1, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "modules_html", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Modules HTML", + "no_copy": 0, + "permlevel": 1, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "block_modules", + "fieldtype": "Table", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Block Modules", + "no_copy": 0, + "options": "Block Module", + "permlevel": 1, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "These values will be automatically updated in transactions and also will be useful to restrict permissions for this user on transactions containing these values.", + "fieldname": "sb2", + "fieldtype": "Section Break", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Defaults", + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 1, + "print_hide": 0, + "print_width": "50%", + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, - { - "description": "Enter default value fields (keys) and values. If you add multiple values for a field, the first one will be picked. These defaults are also used to set \"match\" permission rules. To see list of fields, go to \"Customize Form\".", - "fieldname": "defaults", - "fieldtype": "Table", - "hidden": 1, - "label": "User Defaults", - "no_copy": 1, - "options": "DefaultValue", - "permlevel": 0 - }, - { - "fieldname": "sb3", - "fieldtype": "Section Break", - "label": "Security Settings", - "oldfieldtype": "Section Break", - "permlevel": 0, - "read_only": 1 - }, - { - "default": "System User", - "description": "User Type \"System User\" can access Desktop. \"Website User\" can only be logged into the website and portal pages. ", - "fieldname": "user_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "User Type", - "oldfieldname": "user_type", - "oldfieldtype": "Select", - "options": "System User\nWebsite User", - "permlevel": 0, - "read_only": 1, - "reqd": 1 - }, - { - "description": "Allow user to login only after this hour (0-24)", - "fieldname": "login_after", - "fieldtype": "Int", - "label": "Login After", - "permlevel": 0, - "read_only": 1 - }, - { - "description": "Allow user to login only before this hour (0-24)", - "fieldname": "login_before", - "fieldtype": "Int", - "label": "Login Before", - "permlevel": 0, - "read_only": 1 - }, - { - "description": "Restrict user from this IP address only. Multiple IP addresses can be added by separating with commas. Also accepts partial IP addresses like (111.111.111)", - "fieldname": "restrict_ip", - "fieldtype": "Data", - "label": "Restrict IP", - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_width": "50%", + }, + { + "allow_on_submit": 0, + "description": "Enter default value fields (keys) and values. If you add multiple values for a field, the first one will be picked. These defaults are also used to set \"match\" permission rules. To see list of fields, go to \"Customize Form\".", + "fieldname": "defaults", + "fieldtype": "Table", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User Defaults", + "no_copy": 1, + "options": "DefaultValue", + "permlevel": 0, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "sb3", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Security Settings", + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "default": "System User", + "description": "User Type \"System User\" can access Desktop. \"Website User\" can only be logged into the website and portal pages. ", + "fieldname": "user_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "User Type", + "no_copy": 0, + "oldfieldname": "user_type", + "oldfieldtype": "Select", + "options": "System User\nWebsite User", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Allow user to login only after this hour (0-24)", + "fieldname": "login_after", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Login After", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Allow user to login only before this hour (0-24)", + "fieldname": "login_before", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Login Before", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Restrict user from this IP address only. Multiple IP addresses can be added by separating with commas. Also accepts partial IP addresses like (111.111.111)", + "fieldname": "restrict_ip", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Restrict IP", + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_width": "50%", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, - { - "fieldname": "last_login", - "fieldtype": "Read Only", - "hidden": 0, - "label": "Last Login", - "no_copy": 1, - "oldfieldname": "last_login", - "oldfieldtype": "Read Only", - "permlevel": 0, - "read_only": 1, - "reqd": 0, - "search_index": 0 - }, - { - "fieldname": "last_ip", - "fieldtype": "Read Only", - "label": "Last IP", - "no_copy": 1, - "oldfieldname": "last_ip", - "oldfieldtype": "Read Only", - "permlevel": 0, - "read_only": 1 - }, - { - "description": "Stores the JSON of last known versions of various installed apps. It is used to show release notes.", - "fieldname": "last_known_versions", - "fieldtype": "Text", - "hidden": 1, - "label": "Last Known Versions", - "permlevel": 0, - "precision": "", - "read_only": 1 - }, - { - "fieldname": "third_party_authentication", - "fieldtype": "Section Break", - "label": "Third Party Authentication", - "permlevel": 1 - }, - { - "fieldname": "fb_username", - "fieldtype": "Data", - "label": "Facebook Username", - "no_copy": 1, - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "fb_userid", - "fieldtype": "Data", - "label": "Facebook User ID", - "no_copy": 1, - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "google_userid", - "fieldtype": "Data", - "label": "Google User ID", - "no_copy": 1, - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "column_break_49", - "fieldtype": "Column Break", - "permlevel": 0, - "precision": "" - }, - { - "fieldname": "github_userid", - "fieldtype": "Data", - "label": "Github User ID", - "no_copy": 1, - "permlevel": 0, - "read_only": 1 - }, - { - "fieldname": "github_username", - "fieldtype": "Data", - "label": "Github Username", - "no_copy": 1, - "permlevel": 0, - "read_only": 1 + }, + { + "allow_on_submit": 0, + "fieldname": "last_login", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last Login", + "no_copy": 1, + "oldfieldname": "last_login", + "oldfieldtype": "Read Only", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "last_ip", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last IP", + "no_copy": 1, + "oldfieldname": "last_ip", + "oldfieldtype": "Read Only", + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "description": "Stores the JSON of last known versions of various installed apps. It is used to show release notes.", + "fieldname": "last_known_versions", + "fieldtype": "Text", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last Known Versions", + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "third_party_authentication", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Third Party Authentication", + "no_copy": 0, + "permlevel": 1, + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "fb_username", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Facebook Username", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "fb_userid", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Facebook User ID", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "google_userid", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Google User ID", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "column_break_49", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "github_userid", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Github User ID", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "github_username", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Github Username", + "no_copy": 1, + "permlevel": 0, + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-user", - "idx": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 5, - "modified": "2015-07-27 01:00:32.901851", - "modified_by": "Administrator", - "module": "Core", - "name": "User", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-user", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 5, + "modified": "2015-08-18 11:58:00.000691", + "modified_by": "Administrator", + "module": "Core", + "name": "User", + "owner": "Administrator", "permissions": [ { - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "submit": 0, + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "read_only": 0, + ], + "read_only": 0, + "read_only_onload": 0, "search_fields": "first_name, last_name" -} +} \ No newline at end of file diff --git a/frappe/desk/page/messages/messages.js b/frappe/desk/page/messages/messages.js index 5cbd977596..5142cde7ac 100644 --- a/frappe/desk/page/messages/messages.js +++ b/frappe/desk/page/messages/messages.js @@ -42,7 +42,9 @@ frappe.desk.pages.Messages = Class.extend({ setup_realtime: function() { frappe.realtime.on('new_message', function(comment) { - frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment); + if(comment.modified_by !== user) { + frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment); + } if (frappe.get_route()[0] === 'messages') { var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); var on_broadcast_page = current_contact === user; diff --git a/frappe/desk/page/messages/messages_main.html b/frappe/desk/page/messages/messages_main.html index be2cf1b18f..726abf6600 100644 --- a/frappe/desk/page/messages/messages_main.html +++ b/frappe/desk/page/messages/messages_main.html @@ -8,11 +8,15 @@ class="form-control messages-textarea">
- {% if (contact === user) { %} - {%= __("Public") %} + + + {%= __("Public") %} + {% } %}
diff --git a/frappe/desk/page/messages/messages_row.html b/frappe/desk/page/messages/messages_row.html index 309174fd40..5fa07b8564 100644 --- a/frappe/desk/page/messages/messages_row.html +++ b/frappe/desk/page/messages/messages_row.html @@ -1,9 +1,12 @@
- {% if (data.owner==data.comment_docname && data.parenttype!="Assignment") { %} - - {% } %}
+ {% if (data.owner==data.comment_docname + && data.parenttype!="Assignment") { %} + + {% } else { %} + + {% } %} ', { "alert_class": alert_class || "", "icon": icon ? ' ' : "", diff --git a/frappe/public/js/frappe/list/doclistview.js b/frappe/public/js/frappe/list/doclistview.js index 0fb4b59522..a20a62db42 100644 --- a/frappe/public/js/frappe/list/doclistview.js +++ b/frappe/public/js/frappe/list/doclistview.js @@ -38,12 +38,16 @@ frappe.views.ListFactory = frappe.views.Factory.extend({ }); $(document).on("save", function(event, doc) { - var list_page = "List/" + doc.doctype; + frappe.views.set_list_as_dirty(doc.doctype); +}); + +frappe.views.set_list_as_dirty = function(doctype) { + var list_page = "List/" + doctype; if(frappe.pages[list_page]) { if(frappe.pages[list_page].doclistview) frappe.pages[list_page].doclistview.dirty = true; } -}) +} frappe.views.DocListView = frappe.ui.Listing.extend({ init: function(opts) { diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index 38505dd6f2..0931594bc5 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -34,6 +34,32 @@ $.extend(frappe.model, { new_names: {}, events: {}, + init: function() { + // setup refresh if the document is updated somewhere else + frappe.realtime.on("doc_update", function(data) { + // set list dirty + frappe.views.set_list_as_dirty(data.doctype); + var doc = locals[data.doctype] && locals[data.doctype][data.name]; + 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) { + doc.__needs_refresh = true; + cur_frm.show_if_needs_refresh(); + } + } else { + if(!doc.__unsaved) { + // no local changes, remove from locals + frappe.model.remove_from_locals(doc.doctype, doc.name); + } else { + // show message when user navigates back + doc.__needs_refresh = true; + } + } + } + }); + }, + is_value_type: function(fieldtype) { // not in no-value type return frappe.model.no_value_type.indexOf(fieldtype)===-1; diff --git a/frappe/public/js/frappe/socket.js b/frappe/public/js/frappe/socket.js index be4a4dcd2c..246de1119f 100644 --- a/frappe/public/js/frappe/socket.js +++ b/frappe/public/js/frappe/socket.js @@ -1,5 +1,6 @@ frappe.socket = { open_tasks: {}, + open_docs: [], init: function() { if (frappe.boot.disable_async) { return; @@ -16,9 +17,9 @@ frappe.socket = { frappe.socket.doc_subscribe(frm.doctype, frm.docname); }); - $(document).on('form-unload', function(e, frm) { - frappe.socket.doc_unsubscribe(frm.doctype, frm.docname); - }); + // $(document).on('form-unload', function(e, frm) { + // frappe.socket.doc_unsubscribe(frm.doctype, frm.docname); + // }); }, subscribe: function(task_id, opts) { frappe.socket.socket.emit('task_subscribe', task_id); @@ -28,11 +29,17 @@ frappe.socket = { }, doc_subscribe: function(doctype, docname) { frappe.socket.socket.emit('doc_subscribe', doctype, docname); - frappe.socket.open_doc = {doctype: doctype, docname: docname}; + frappe.socket.open_docs.push({doctype: doctype, docname: docname}); }, doc_unsubscribe: function(doctype, docname) { frappe.socket.socket.emit('doc_unsubscribe', doctype, docname); - frappe.socket.open_doc = null; + frappe.socket.open_docs = $.filter(frappe.socket.open_docs, function(d) { + if(d.doctype===doctype && d.name===docname) { + return null; + } else { + return d; + } + }) }, setup_listeners: function() { frappe.socket.socket.on('task_status_change', function(data) { @@ -47,7 +54,6 @@ frappe.socket = { frappe.socket.socket.on('task_progress', function(data) { frappe.socket.process_response(data, "progress"); }); - }, setup_reconnect: function() { // subscribe again to open_tasks @@ -55,11 +61,15 @@ frappe.socket = { $.each(frappe.socket.open_tasks, function(task_id, opts) { frappe.socket.subscribe(task_id, opts); }); + + // re-connect open docs + $.each(frappe.socket.open_docs, function(d) { + if(locals[d.doctype] && locals[d.doctype][d.name]) { + frappe.socket.doc_subscribe(d.doctype, d.name); + } + }) }); - if(frappe.socket.open_doc) { - frappe.socket.doc_subscribe(frappe.socket.open_doc.doctype, frappe.socket.open_doc.docname); - } }, process_response: function(data, method) { if(!data) { @@ -87,7 +97,7 @@ frappe.socket = { $(frappe.socket.init); -frappe.require("frappe.realtime"); +frappe.provide("frappe.realtime"); frappe.realtime.on = function(event, callback) { frappe.socket.socket.on(event, callback); } diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 276235a7d2..a76fa6a288 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -406,6 +406,16 @@ _f.Frm.prototype.refresh = function(docname) { if(this.print_preview.wrapper.is(":visible")) { this.print_preview.preview(); } + + this.show_if_needs_refresh(); + } +} + +_f.Frm.prototype.show_if_needs_refresh = function() { + if(this.doc.__needs_refresh) { + this.dashboard.set_headline_alert(__("This form has been modified after you have loaded it") + + '' + + __("Refresh") + '', "alert-warning"); } } diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index b5b6d4a980..838a74f270 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -212,8 +212,7 @@ select.form-control { .form-headline .alert { font-size: @text-medium; - border-color: @border-color; - // background-color: @light-bg; + background-color: @light-yellow; margin-bottom: 0px; } diff --git a/socketio.js b/socketio.js index 8dbe0b9578..6717176ffb 100644 --- a/socketio.js +++ b/socketio.js @@ -43,6 +43,7 @@ io.on('connection', function(socket){ var room = get_user_room(socket, res.body.message.user); // console.log('joining', room); socket.join(room); + socket.join(get_site_room(socket)); } }) socket.on('task_subscribe', function(task_id) { @@ -64,7 +65,7 @@ io.on('connection', function(socket){ docname: docname }) .end(function(err, res) { - console.log(err) + if(err) console.log(err); if(res.status == 200) { var room = get_doc_room(socket, doctype, docname); // console.log('joining', room) @@ -89,7 +90,7 @@ function send_existing_lines(task_id, socket) { }) } - + subscriber.on("message", function(channel, message) { message = JSON.parse(message); io.to(message.room).emit(message.event, message.message); @@ -97,7 +98,7 @@ subscriber.on("message", function(channel, message) { }); subscriber.subscribe("events"); - + http.listen(3000, function(){ console.log('listening on *:3000'); });