diff --git a/frappe/chat/doctype/chat_message/chat_message.py b/frappe/chat/doctype/chat_message/chat_message.py index 9309c910b2..749caca99b 100644 --- a/frappe/chat/doctype/chat_message/chat_message.py +++ b/frappe/chat/doctype/chat_message/chat_message.py @@ -15,7 +15,8 @@ from frappe.chat.util import ( get_user_doc, check_url, dictify, - get_emojis + get_emojis, + safe_json_loads ) session = frappe.session @@ -96,13 +97,13 @@ def get_new_chat_message_doc(user, room, content, link = True): mess.mentions = json.dumps(meta.mentions) mess.urls = ','.join(meta.urls) - mess.save() + mess.save(ignore_permissions = True) if link: room.update(dict( last_message = mess.name )) - room.save() + room.save(ignore_permissions = True) return mess @@ -146,7 +147,7 @@ def get_messages(room, user = None, fields = None, pagination = 20): user = get_user_doc(user) room = frappe.get_doc('Chat Room', room) - mess = frappe.get_list('Chat Message', + mess = frappe.get_all('Chat Message', filters = [ ('Chat Message', 'room', '=', room.name), ('Chat Message', 'type', '=', room.type) @@ -159,4 +160,20 @@ def get_messages(room, user = None, fields = None, pagination = 20): ] ) - return mess \ No newline at end of file + return mess + +@frappe.whitelist() +def get(name, rooms = None, fields = None): + rooms, fields = safe_json_loads(rooms, fields) + dmess = frappe.get_doc('Chat Message', name) + dict_ = dict( + name = dmess.name, + user = dmess.user, + room = dmess.room, + content = dmess.content, + urls = dmess.urls, + mentions = dmess.mentions, + creation = dmess.creation + ) + + return dict_ \ No newline at end of file diff --git a/frappe/chat/doctype/chat_message_attachment/__init__.py b/frappe/chat/doctype/chat_message_attachment/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.json b/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.json deleted file mode 100644 index e49f75a124..0000000000 --- a/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 1, - "creation": "2017-11-15 13:27:05.706207", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "attachment", - "fieldtype": "Attach", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Attachment", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2017-11-15 13:33:27.405470", - "modified_by": "Administrator", - "module": "Chat", - "name": "Chat Message Attachment", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.py b/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.py deleted file mode 100644 index b399628e89..0000000000 --- a/frappe/chat/doctype/chat_message_attachment/chat_message_attachment.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2017, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class ChatMessageAttachment(Document): - pass diff --git a/frappe/chat/doctype/chat_profile/chat_profile.js b/frappe/chat/doctype/chat_profile/chat_profile.js index e59b370c08..b56743a231 100644 --- a/frappe/chat/doctype/chat_profile/chat_profile.js +++ b/frappe/chat/doctype/chat_profile/chat_profile.js @@ -1,9 +1,10 @@ /* eslint semi: "never" */ frappe.ui.form.on('Chat Profile', { - refresh: (form) => { + refresh: function (form) { if ( form.doc.user !== frappe.session.user ) { - form.disable_save(true) + form.disable_save() form.set_read_only(true) + // There's one more that faris@frappe.io told me to add here. form.refresh_fields()? } } }); diff --git a/frappe/chat/doctype/chat_profile/chat_profile.py b/frappe/chat/doctype/chat_profile/chat_profile.py index 8078141a1f..bc621cfe71 100644 --- a/frappe/chat/doctype/chat_profile/chat_profile.py +++ b/frappe/chat/doctype/chat_profile/chat_profile.py @@ -29,7 +29,7 @@ class ChatProfile(Document): fields = [changed[0] for changed in diff.changed] if 'status' in fields: - rooms = chat_room.get(user, filters = ['type', '=', 'Direct']) + rooms = chat_room.get(user, filters = ['Chat Room', 'type', '=', 'Direct']) update = dict(user = user, data = dict(status = self.status)) for room in rooms: @@ -53,7 +53,6 @@ def get(user, fields = None): username = duser.username, avatar = duser.user_image, bio = duser.bio, - # Chat Profile status = dprof.status, chat_background = dprof.chat_background, diff --git a/frappe/chat/doctype/chat_room/chat_room.py b/frappe/chat/doctype/chat_room/chat_room.py index b86cd6deea..aaef176a14 100644 --- a/frappe/chat/doctype/chat_room/chat_room.py +++ b/frappe/chat/doctype/chat_room/chat_room.py @@ -8,14 +8,14 @@ import frappe # imports - frappe module imports from frappe.core.doctype.version.version import get_diff -from frappe.chat.doctype.chat_message.chat_message import get_messages +from frappe.chat.doctype.chat_message import chat_message from frappe.chat.util import ( get_user_doc, safe_json_loads, dictify, listify, squashify, - assign_if_none + assign_if_empty ) session = frappe.session @@ -127,9 +127,9 @@ class ChatRoom(Document): frappe.publish_realtime('frappe.chat.room:update', resp, room = self.name, after_commit = True) - def on_trash(self): - if self.owner != session.user: - frappe.throw(_("Sorry, you're not authorized to delete this room.")) + # def on_trash(self): + # if self.owner != session.user: + # frappe.throw(_("Sorry, you're not authorized to delete this room.")) def is_admin(user, room): if user != session.user: @@ -142,7 +142,7 @@ def is_one_on_one(owner, other, bidirectional = False): checks if the owner and other have a direct conversation room. ''' def get_room(owner, other): - room = frappe.get_list('Chat Room', filters = [ + room = frappe.get_all('Chat Room', filters = [ ['Chat Room', 'type' , 'in', ('Direct', 'Visitor')], ['Chat Room', 'owner', '=' , owner], ['Chat Room User', 'user' , '=' , other] @@ -172,87 +172,6 @@ def get_chat_room_user_set(users): return news -def get_new_chat_room_doc(kind, owner, users = None, name = None): - room = frappe.new_doc('Chat Room') - room.type = kind - room.owner = owner - room.room_name = name - - users = users if isinstance(users, list) or users is None else [users] - docs = [ ] - if users: - for user in users: - doc = frappe.new_doc('Chat Room User') - doc.user = user - - docs.append(doc) - - room.users = docs - room.save(ignore_permissions = True) - - return room - -def get_new_chat_room(kind, owner, users = None, name = None): - room = get_new_chat_room_doc(kind = kind, owner = owner, users = users, name = name) - room = get_user_chat_rooms(user = owner, rooms = room.name) - - return room - -def get_user_chat_rooms(user = None, rooms = None, fields = None): - ''' - if user is None, defaults to session user. - if room is None, returns the entire list of rooms subscribed by user. - ''' - user = get_user_doc(user) - - rooms = assign_if_none(rooms, [ ]) - fields = assign_if_none(fields, [ ]) - - param = [f for f in fields if f != 'users' or f != 'last_message'] - - rooms = frappe.get_list('Chat Room', - or_filters = [ - ['Chat Room', 'owner', '=', user.name], - ['Chat Room User', 'user', '=', user.name] - ], - filters = [ - ['Chat Room', 'name', 'in', rooms] - ] if rooms else None, - fields = param + ['name'] if param or 'users' in fields else [ - 'type', 'name', 'owner', 'room_name', 'avatar', 'creation' - ], - distinct = True - ) - - if not fields or 'users' in fields: - for i, r in enumerate(rooms): - doc_room = frappe.get_doc('Chat Room', r.name) - rooms[i]['users'] = [ ] - - for user in doc_room.users: - rooms[i]['users'].append(user.user) - - if not fields or 'last_message' in fields: - for i, r in enumerate(rooms): - doc_room = frappe.get_doc('Chat Room', r.name) - if doc_room.last_message: - doc_message = frappe.get_doc('Chat Message', doc_room.last_message) - rooms[i]['last_message'] = dict( - name = doc_message.name, - user = doc_message.user, - room = doc_message.room, - content = doc_message.content, - urls = doc_message.urls, - mentions = doc_message.mentions, - creation = doc_message.creation - ) - else: - rooms[i]['last_message'] = None - - rooms = dictify(rooms) - - return rooms - @@ -263,7 +182,7 @@ def get_user_chat_rooms(user = None, rooms = None, fields = None): @frappe.whitelist() def get_history(room, user = None, pagination = 20): user = get_user_doc(user) - mess = get_messages(room, pagination = pagination) + mess = chat_message.get_messages(room, pagination = pagination) mess = squashify(mess) @@ -275,13 +194,63 @@ def authenticate(user): @frappe.whitelist() def get(user, rooms = None, fields = None, filters = None): + # There is this horrible bug out here. + # Looks like if frappe.call sends optional arguments (not in right order), the argument turns to an empty string. + # I'm not even going to think searching for it. + # Hence, the hack was assign_if_empty (previous assign_if_none) + # - Achilles Rasquinha achilles@frappe.io + authenticate(user) rooms, fields, filters = safe_json_loads(rooms, fields, filters) - data = get_user_chat_rooms(user = user, rooms = rooms, fields = fields) + rooms = listify(assign_if_empty(rooms, [ ])) + fields = listify(assign_if_empty(fields, [ ])) + + const = [ ] # constraints + if rooms: + const.append(['Chat Room', 'name', 'in', rooms]) + if filters: + if isinstance(filters[0], list): + const = const + filters + else: + const.append(filters) + + default = ['name', 'type', 'room_name', 'creation', 'owner', 'avatar'] + handle = ['users', 'last_message'] - return data + param = [f for f in fields if f not in handle] + + rooms = frappe.get_all('Chat Room', + or_filters = [ + ['Chat Room', 'owner', '=', user], + ['Chat Room User', 'user', '=', user] + ], + filters = filters, + fields = param + ['name'] if param else default, + distinct = True, + debug = True + ) + + if not fields or 'users' in fields: + for i, r in enumerate(rooms): + droom = frappe.get_doc('Chat Room', r.name) + rooms[i]['users'] = [ ] + + for duser in droom.users: + rooms[i]['users'].append(duser.user) + + if not fields or 'last_message' in fields: + for i, r in enumerate(rooms): + droom = frappe.get_doc('Chat Room', r.name) + if droom.last_message: + rooms[i]['last_message'] = chat_message.get(droom.last_message) + else: + rooms[i]['last_message'] = None + + rooms = squashify(dictify(rooms)) + + return rooms @frappe.whitelist() def create(kind, owner, users = None, name = None): @@ -295,26 +264,19 @@ def create(kind, owner, users = None, name = None): dusers = [ ] if users: + users = listify(users) for user in users: duser = frappe.new_doc('Chat Room User') - duser.name = user + duser.user = user dusers.append(duser) room.users = dusers room.save(ignore_permissions = True) - - - - - - - room = get_new_chat_room(kind = kind, owner = owner, users = users, name = name) - room = squashify(room) - + room = get(owner, rooms = room.name) users = [room.owner] + [u for u in room.users] + for u in users: - frappe.publish_realtime('frappe.chat.room:create', room, - user = u, after_commit = True) + frappe.publish_realtime('frappe.chat.room:create', room, user = u, after_commit = True) return room \ No newline at end of file diff --git a/frappe/chat/doctype/chat_room_user/chat_room_user.json b/frappe/chat/doctype/chat_room_user/chat_room_user.json index fc485915d0..24ea4ff81f 100644 --- a/frappe/chat/doctype/chat_room_user/chat_room_user.json +++ b/frappe/chat/doctype/chat_room_user/chat_room_user.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, - "autoname": "field:user", + "autoname": "", "beta": 1, "creation": "2017-11-08 15:24:21.029314", "custom": 0, @@ -86,7 +86,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-01-02 12:28:45.145823", + "modified": "2018-01-02 17:12:12.622244", "modified_by": "achilles@erpnext.com", "module": "Chat", "name": "Chat Room User", diff --git a/frappe/chat/page/__init__.py b/frappe/chat/page/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/chat/page/chat/__init__.py b/frappe/chat/page/chat/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/chat/page/chat/chat.js b/frappe/chat/page/chat/chat.js deleted file mode 100644 index 1ec9d0c803..0000000000 --- a/frappe/chat/page/chat/chat.js +++ /dev/null @@ -1,11 +0,0 @@ -frappe.pages.chat.on_page_load = function (container) -{ - const page = new frappe.ui.Page({ - title: __('Chat'), parent: container - }); - const $container = $(container).find('.layout-main') - $container.html("") - - // const chat = new frappe.Chat($container, { layout: frappe.Chat.Layout.PAGE }); - // chat.render(); -}; \ No newline at end of file diff --git a/frappe/chat/page/chat/chat.json b/frappe/chat/page/chat/chat.json deleted file mode 100644 index a7d35c6e94..0000000000 --- a/frappe/chat/page/chat/chat.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "content": null, - "creation": "2017-11-08 14:55:47.986307", - "docstatus": 0, - "doctype": "Page", - "icon": "octicon octiocn-comment", - "idx": 0, - "modified": "2017-12-17 10:44:23.698446", - "modified_by": "Administrator", - "module": "Chat", - "name": "chat", - "owner": "Administrator", - "page_name": "chat", - "roles": [], - "script": null, - "standard": "Yes", - "style": null, - "system_page": 0, - "title": "Chat" -} \ No newline at end of file diff --git a/frappe/chat/page/chat/test_chat.js b/frappe/chat/page/chat/test_chat.js deleted file mode 100644 index 58e8c30725..0000000000 --- a/frappe/chat/page/chat/test_chat.js +++ /dev/null @@ -1,27 +0,0 @@ -QUnit.test("test: Chat", function (assert) -{ - const done = assert.async(3); - - assert.expect(3); - - // test - frappe._.fuzzy_search - frappe.run_serially([ - () => assert.equal(frappe._.fuzzy_search("foo", ["foobar", "tooti"]), "foobar"), - ]); - - // test - frappe.chat.profile.create - frappe.run_serially([ - () => frappe.set_route('chat'), - // empty promise - () => frappe.chat.profile.create(), - (profile) => { - assert.equal(profile.status, "Online"); - }, - // one key only - () => frappe.chat.profile.create("status"), - (profile) => { - assert.equal(Object.keys(profile).length, 1); - }, - () => done() - ]); -}); \ No newline at end of file diff --git a/frappe/chat/util/__init__.py b/frappe/chat/util/__init__.py index 1d3a7de5a3..a74feb2868 100644 --- a/frappe/chat/util/__init__.py +++ b/frappe/chat/util/__init__.py @@ -4,7 +4,7 @@ from frappe.chat.util.util import ( squashify, safe_json_loads, filter_dict, - assign_if_none, + assign_if_empty, listify, dictify, check_url, diff --git a/frappe/chat/util/util.py b/frappe/chat/util/util.py index d61139b824..8ff86f8ecb 100644 --- a/frappe/chat/util/util.py +++ b/frappe/chat/util/util.py @@ -64,8 +64,8 @@ def filter_dict(what, keys, ignore = False): return copy -def assign_if_none(a, b): - if a is None: +def assign_if_empty(a, b): + if not a: a = b return a diff --git a/frappe/public/css/chat.css b/frappe/public/css/chat.css index 6ab2afb613..e5b8b9d5a5 100644 --- a/frappe/public/css/chat.css +++ b/frappe/public/css/chat.css @@ -5,6 +5,12 @@ .frappe-chat-toggle .octicon { margin-top: 5px; } +.frappe-chat .panel.panel-span { + border-radius: 0px; +} +.frappe-chat .panel.panel-span .panel-heading { + border-radius: 0px; +} .font-bold { font-weight: 700; } diff --git a/frappe/public/js/frappe/chat.js b/frappe/public/js/frappe/chat.js index 945adcad79..cce03fd031 100644 --- a/frappe/public/js/frappe/chat.js +++ b/frappe/public/js/frappe/chat.js @@ -1740,8 +1740,7 @@ class extends Component // !frappe._.is_mobile() ? // h("a", { class: "action", onclick: () => // { - // frappe.set_route('chat') - // this.toggle(false) + // // }}, // h(frappe.components.FontAwesome, { type: "expand", fixed: true }) // ) : null, diff --git a/frappe/public/js/frappe/ui/toolbar/notifications.js b/frappe/public/js/frappe/ui/toolbar/notifications.js index 01d6805f7b..12034bbf7d 100644 --- a/frappe/public/js/frappe/ui/toolbar/notifications.js +++ b/frappe/public/js/frappe/ui/toolbar/notifications.js @@ -3,7 +3,6 @@ frappe.provide("frappe.ui.notifications"); frappe.ui.notifications = { config: { "ToDo": { label: __("To Do") }, - "Chat": { label: __("Chat"), route: "chat"}, "Event": { label: __("Calendar"), route: "List/Event/Calendar" }, "Email": { label: __("Email"), route: "List/Communication/Inbox" }, "Likes": { label: __("Likes"), diff --git a/frappe/public/less/chat.less b/frappe/public/less/chat.less index bfe3331232..992959806d 100644 --- a/frappe/public/less/chat.less +++ b/frappe/public/less/chat.less @@ -12,6 +12,19 @@ } } +.frappe-chat +{ + .panel.panel-span + { + border-radius: 0px; + + .panel-heading + { + border-radius: 0px; + } + } +} +