Permission Fixes

This commit is contained in:
Achilles Rasquinha 2018-01-03 15:08:26 +05:30
parent 2d5d367298
commit f09cd2c1b7
19 changed files with 115 additions and 258 deletions

View file

@ -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_

View file

@ -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
}

View file

@ -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

View file

@ -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()?
}
}
});

View file

@ -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,

View file

@ -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

View file

@ -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",

View file

@ -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();
};

View file

@ -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"
}

View file

@ -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()
]);
});

View file

@ -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,

View file

@ -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

View file

@ -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;
}

View file

@ -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,

View file

@ -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"),

View file

@ -12,6 +12,19 @@
}
}
.frappe-chat
{
.panel.panel-span
{
border-radius: 0px;
.panel-heading
{
border-radius: 0px;
}
}
}