Skip to content

Commit dab18b8

Browse files
authored
Merge pull request frappe#9022 from Thunderbottom/chat-fix
fix(chat): refactor code to make chat work
2 parents 9b7c591 + b7ad4a0 commit dab18b8

File tree

2 files changed

+76
-69
lines changed

2 files changed

+76
-69
lines changed
Lines changed: 75 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
from __future__ import unicode_literals
22

3-
# imports - standard imports
4-
import json
5-
63
# imports - module imports
7-
from frappe.model.document import Document
8-
from frappe import _
4+
from frappe.model.document import Document
5+
from frappe import _
96
import frappe
107

118
# imports - frappe module imports
12-
from frappe.chat import authenticate
9+
from frappe.chat import authenticate
1310
from frappe.core.doctype.version.version import get_diff
14-
from frappe.chat.doctype.chat_message import chat_message
11+
from frappe.chat.doctype.chat_message import chat_message
1512
from frappe.chat.util import (
1613
safe_json_loads,
1714
dictify,
@@ -22,13 +19,14 @@
2219

2320
session = frappe.session
2421

25-
def is_direct(owner, other, bidirectional = False):
22+
23+
def is_direct(owner, other, bidirectional=False):
2624
def get_room(owner, other):
27-
room = frappe.get_all('Chat Room', filters = [
28-
['Chat Room', 'type' , 'in', ('Direct', 'Visitor')],
29-
['Chat Room', 'owner', '=' , owner],
30-
['Chat Room User', 'user' , '=' , other]
31-
], distinct = True)
25+
room = frappe.get_all('Chat Room', filters=[
26+
['Chat Room', 'type', 'in', ('Direct', 'Visitor')],
27+
['Chat Room', 'owner', '=', owner],
28+
['Chat Room User', 'user', '=', other]
29+
], distinct=True)
3230

3331
return room
3432

@@ -38,7 +36,8 @@ def get_room(owner, other):
3836

3937
return exists
4038

41-
def get_chat_room_user_set(users, filter_ = None):
39+
40+
def get_chat_room_user_set(users, filter_=None):
4241
seen, uset = set(), list()
4342

4443
for u in users:
@@ -48,12 +47,13 @@ def get_chat_room_user_set(users, filter_ = None):
4847

4948
return uset
5049

50+
5151
class ChatRoom(Document):
5252
def validate(self):
5353
if self.is_new():
54-
users = get_chat_room_user_set(self.users, filter_ = lambda u: u.user != session.user)
54+
users = get_chat_room_user_set(self.users, filter_=lambda u: u.user != session.user)
5555
self.update(dict(
56-
users = users
56+
users=users
5757
))
5858

5959
if self.type == "Direct":
@@ -63,7 +63,7 @@ def validate(self):
6363
other = squashify(self.users)
6464

6565
if self.is_new():
66-
if is_direct(self.owner, other.user, bidirectional = True):
66+
if is_direct(self.owner, other.user, bidirectional=True):
6767
frappe.throw(_('Direct room with {0} already exists.').format(other.user))
6868

6969
if self.type == "Group" and not self.room_name:
@@ -74,40 +74,44 @@ def on_update(self):
7474
before = self.get_doc_before_save()
7575
if not before: return
7676

77-
after = self
78-
diff = dictify(get_diff(before, after))
77+
after = self
78+
diff = dictify(get_diff(before, after))
7979
if diff:
80-
update = { }
80+
update = {}
8181
for changed in diff.changed:
8282
field, old, new = changed
8383

8484
if field == 'last_message':
8585
new = chat_message.get(new)
8686

87-
update.update({ field: new })
87+
update.update({field: new})
8888

8989
if diff.added or diff.removed:
90-
update.update(dict(users = [u.user for u in self.users]))
90+
update.update(dict(users=[u.user for u in self.users]))
9191

92-
update = dict(room = self.name, data = update)
92+
update = dict(room=self.name, data=update)
9393

94-
frappe.publish_realtime('frappe.chat.room:update', update, room = self.name, after_commit = True)
94+
frappe.publish_realtime('frappe.chat.room:update', update, room=self.name,
95+
after_commit=True)
9596

96-
@frappe.whitelist(allow_guest = True)
97-
def get(user, rooms = None, fields = None, filters = None):
97+
98+
@frappe.whitelist(allow_guest=True)
99+
def get(user=None, token=None, rooms=None, fields=None, filters=None):
98100
# There is this horrible bug out here.
99-
# Looks like if frappe.call sends optional arguments (not in right order), the argument turns to an empty string.
101+
# Looks like if frappe.call sends optional arguments (not in right order),
102+
# the argument turns to an empty string.
100103
# I'm not even going to think searching for it.
101104
# Hence, the hack was get_if_empty (previous assign_if_none)
102105
# - Achilles Rasquinha [email protected]
103-
authenticate(user)
106+
data = user or token
107+
authenticate(data)
104108

105109
rooms, fields, filters = safe_json_loads(rooms, fields, filters)
106110

107-
rooms = listify(get_if_empty(rooms, [ ]))
108-
fields = listify(get_if_empty(fields, [ ]))
111+
rooms = listify(get_if_empty(rooms, []))
112+
fields = listify(get_if_empty(fields, []))
109113

110-
const = [ ] # constraints
114+
const = [] # constraints
111115
if rooms:
112116
const.append(['Chat Room', 'name', 'in', rooms])
113117
if filters:
@@ -117,24 +121,24 @@ def get(user, rooms = None, fields = None, filters = None):
117121
const.append(filters)
118122

119123
default = ['name', 'type', 'room_name', 'creation', 'owner', 'avatar']
120-
handle = ['users', 'last_message']
124+
handle = ['users', 'last_message']
121125

122-
param = [f for f in fields if f not in handle]
126+
param = [f for f in fields if f not in handle]
123127

124-
rooms = frappe.get_all('Chat Room',
125-
or_filters = [
126-
['Chat Room', 'owner', '=', user],
127-
['Chat Room User', 'user', '=', user]
128-
],
129-
filters = const,
130-
fields = param + ['name'] if param else default,
131-
distinct = True
132-
)
128+
rooms = frappe.get_all('Chat Room',
129+
or_filters=[
130+
['Chat Room', 'owner', '=', frappe.session.user],
131+
['Chat Room User', 'user', '=', frappe.session.user]
132+
],
133+
filters=const,
134+
fields=param + ['name'] if param else default,
135+
distinct=True
136+
)
133137

134138
if not fields or 'users' in fields:
135139
for i, r in enumerate(rooms):
136140
droom = frappe.get_doc('Chat Room', r.name)
137-
rooms[i]['users'] = [ ]
141+
rooms[i]['users'] = []
138142

139143
for duser in droom.users:
140144
rooms[i]['users'].append(duser.user)
@@ -151,46 +155,47 @@ def get(user, rooms = None, fields = None, filters = None):
151155

152156
return rooms
153157

154-
@frappe.whitelist(allow_guest = True)
155-
def create(kind, owner, users = None, name = None):
156-
authenticate(owner)
157158

158-
users = safe_json_loads(users)
159+
@frappe.whitelist(allow_guest=True)
160+
def create(kind, token, users=None, name=None):
161+
authenticate(token)
162+
163+
users = safe_json_loads(users)
159164
create = True
160165

161166
if kind == 'Visitor':
162167
room = squashify(frappe.db.sql("""
163168
SELECT name
164169
FROM `tabChat Room`
165-
WHERE owner = "{owner}"
166-
""".format(owner = owner), as_dict = True))
170+
WHERE owner=%s
171+
""", (frappe.session.user), as_dict=True))
167172

168173
if room:
169-
room = frappe.get_doc('Chat Room', room.name)
174+
room = frappe.get_doc('Chat Room', room.name)
170175
create = False
171176

172177
if create:
173-
room = frappe.new_doc('Chat Room')
174-
room.type = kind
175-
room.owner = owner
178+
room = frappe.new_doc('Chat Room')
179+
room.type = kind
180+
room.owner = frappe.session.user
176181
room.room_name = name
177182

178-
dusers = [ ]
183+
dusers = []
179184

180185
if kind != 'Visitor':
181186
if users:
182-
users = listify(users)
187+
users = listify(users)
183188
for user in users:
184-
duser = frappe.new_doc('Chat Room User')
189+
duser = frappe.new_doc('Chat Room User')
185190
duser.user = user
186191
dusers.append(duser)
187192

188193
room.users = dusers
189194
else:
190-
dsettings = frappe.get_single('Website Settings')
195+
dsettings = frappe.get_single('Website Settings')
191196
room.room_name = dsettings.chat_room_name
192197

193-
users = [user for user in room.users] if hasattr(room, 'users') else [ ]
198+
users = [user for user in room.users] if hasattr(room, 'users') else []
194199

195200
for user in dsettings.chat_operators:
196201
if user.user not in users:
@@ -199,24 +204,26 @@ def create(kind, owner, users = None, name = None):
199204
chat_room_user = {"doctype": "Chat Room User", "user": user.user}
200205
room.append('users', chat_room_user)
201206

202-
room.save(ignore_permissions = True)
207+
room.save(ignore_permissions=True)
203208

204-
room = get(owner, rooms = room.name)
205-
users = [room.owner] + [u for u in room.users]
209+
room = get(token=token, rooms=room.name)
210+
if room:
211+
users = [room.owner] + [u for u in room.users]
206212

207-
for u in users:
208-
frappe.publish_realtime('frappe.chat.room:create', room, user = u, after_commit = True)
213+
for user in users:
214+
frappe.publish_realtime('frappe.chat.room:create', room, user=user, after_commit=True)
209215

210216
return room
211217

212-
@frappe.whitelist(allow_guest = True)
213-
def history(room, user, fields = None, limit = 10, start = None, end = None):
218+
219+
@frappe.whitelist(allow_guest=True)
220+
def history(room, user, fields=None, limit=10, start=None, end=None):
214221
if frappe.get_doc('Chat Room', room).type != 'Visitor':
215222
authenticate(user)
216223

217224
fields = safe_json_loads(fields)
218225

219-
mess = chat_message.history(room, limit = limit, start = start, end = end)
220-
mess = squashify(mess)
226+
mess = chat_message.history(room, limit=limit, start=start, end=end)
227+
mess = squashify(mess)
221228

222-
return dictify(mess)
229+
return dictify(mess)

frappe/public/js/frappe/chat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ frappe.chat.room.create = function (kind, owner, users, name, fn) {
718718

719719
return new Promise(resolve => {
720720
frappe.call("frappe.chat.doctype.chat_room.chat_room.create",
721-
{ kind: kind, owner: owner || frappe.session.user, users: users, name: name },
721+
{ kind: kind, token: owner || frappe.session.user, users: users, name: name },
722722
r => {
723723
let room = r.message
724724
room = { ...room, creation: new frappe.datetime.datetime(room.creation) }

0 commit comments

Comments
 (0)