Permission Fixes
This commit is contained in:
parent
2d5d367298
commit
f09cd2c1b7
19 changed files with 115 additions and 258 deletions
|
|
@ -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
|
||||
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_
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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()?
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
};
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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()
|
||||
]);
|
||||
});
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -12,6 +12,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
.frappe-chat
|
||||
{
|
||||
.panel.panel-span
|
||||
{
|
||||
border-radius: 0px;
|
||||
|
||||
.panel-heading
|
||||
{
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue