1
1
from __future__ import unicode_literals
2
2
3
- # imports - standard imports
4
- import json
5
-
6
3
# 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 _
9
6
import frappe
10
7
11
8
# imports - frappe module imports
12
- from frappe .chat import authenticate
9
+ from frappe .chat import authenticate
13
10
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
15
12
from frappe .chat .util import (
16
13
safe_json_loads ,
17
14
dictify ,
22
19
23
20
session = frappe .session
24
21
25
- def is_direct (owner , other , bidirectional = False ):
22
+
23
+ def is_direct (owner , other , bidirectional = False ):
26
24
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 )
32
30
33
31
return room
34
32
@@ -38,7 +36,8 @@ def get_room(owner, other):
38
36
39
37
return exists
40
38
41
- def get_chat_room_user_set (users , filter_ = None ):
39
+
40
+ def get_chat_room_user_set (users , filter_ = None ):
42
41
seen , uset = set (), list ()
43
42
44
43
for u in users :
@@ -48,12 +47,13 @@ def get_chat_room_user_set(users, filter_ = None):
48
47
49
48
return uset
50
49
50
+
51
51
class ChatRoom (Document ):
52
52
def validate (self ):
53
53
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 )
55
55
self .update (dict (
56
- users = users
56
+ users = users
57
57
))
58
58
59
59
if self .type == "Direct" :
@@ -63,7 +63,7 @@ def validate(self):
63
63
other = squashify (self .users )
64
64
65
65
if self .is_new ():
66
- if is_direct (self .owner , other .user , bidirectional = True ):
66
+ if is_direct (self .owner , other .user , bidirectional = True ):
67
67
frappe .throw (_ ('Direct room with {0} already exists.' ).format (other .user ))
68
68
69
69
if self .type == "Group" and not self .room_name :
@@ -74,40 +74,44 @@ def on_update(self):
74
74
before = self .get_doc_before_save ()
75
75
if not before : return
76
76
77
- after = self
78
- diff = dictify (get_diff (before , after ))
77
+ after = self
78
+ diff = dictify (get_diff (before , after ))
79
79
if diff :
80
- update = { }
80
+ update = {}
81
81
for changed in diff .changed :
82
82
field , old , new = changed
83
83
84
84
if field == 'last_message' :
85
85
new = chat_message .get (new )
86
86
87
- update .update ({ field : new })
87
+ update .update ({field : new })
88
88
89
89
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 ]))
91
91
92
- update = dict (room = self .name , data = update )
92
+ update = dict (room = self .name , data = update )
93
93
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 )
95
96
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 ):
98
100
# 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.
100
103
# I'm not even going to think searching for it.
101
104
# Hence, the hack was get_if_empty (previous assign_if_none)
102
105
# - Achilles Rasquinha [email protected]
103
- authenticate (user )
106
+ data = user or token
107
+ authenticate (data )
104
108
105
109
rooms , fields , filters = safe_json_loads (rooms , fields , filters )
106
110
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 , []))
109
113
110
- const = [ ] # constraints
114
+ const = [] # constraints
111
115
if rooms :
112
116
const .append (['Chat Room' , 'name' , 'in' , rooms ])
113
117
if filters :
@@ -117,24 +121,24 @@ def get(user, rooms = None, fields = None, filters = None):
117
121
const .append (filters )
118
122
119
123
default = ['name' , 'type' , 'room_name' , 'creation' , 'owner' , 'avatar' ]
120
- handle = ['users' , 'last_message' ]
124
+ handle = ['users' , 'last_message' ]
121
125
122
- param = [f for f in fields if f not in handle ]
126
+ param = [f for f in fields if f not in handle ]
123
127
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
+ )
133
137
134
138
if not fields or 'users' in fields :
135
139
for i , r in enumerate (rooms ):
136
140
droom = frappe .get_doc ('Chat Room' , r .name )
137
- rooms [i ]['users' ] = [ ]
141
+ rooms [i ]['users' ] = []
138
142
139
143
for duser in droom .users :
140
144
rooms [i ]['users' ].append (duser .user )
@@ -151,46 +155,47 @@ def get(user, rooms = None, fields = None, filters = None):
151
155
152
156
return rooms
153
157
154
- @frappe .whitelist (allow_guest = True )
155
- def create (kind , owner , users = None , name = None ):
156
- authenticate (owner )
157
158
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 )
159
164
create = True
160
165
161
166
if kind == 'Visitor' :
162
167
room = squashify (frappe .db .sql ("""
163
168
SELECT name
164
169
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 ))
167
172
168
173
if room :
169
- room = frappe .get_doc ('Chat Room' , room .name )
174
+ room = frappe .get_doc ('Chat Room' , room .name )
170
175
create = False
171
176
172
177
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
176
181
room .room_name = name
177
182
178
- dusers = [ ]
183
+ dusers = []
179
184
180
185
if kind != 'Visitor' :
181
186
if users :
182
- users = listify (users )
187
+ users = listify (users )
183
188
for user in users :
184
- duser = frappe .new_doc ('Chat Room User' )
189
+ duser = frappe .new_doc ('Chat Room User' )
185
190
duser .user = user
186
191
dusers .append (duser )
187
192
188
193
room .users = dusers
189
194
else :
190
- dsettings = frappe .get_single ('Website Settings' )
195
+ dsettings = frappe .get_single ('Website Settings' )
191
196
room .room_name = dsettings .chat_room_name
192
197
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 []
194
199
195
200
for user in dsettings .chat_operators :
196
201
if user .user not in users :
@@ -199,24 +204,26 @@ def create(kind, owner, users = None, name = None):
199
204
chat_room_user = {"doctype" : "Chat Room User" , "user" : user .user }
200
205
room .append ('users' , chat_room_user )
201
206
202
- room .save (ignore_permissions = True )
207
+ room .save (ignore_permissions = True )
203
208
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 ]
206
212
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 )
209
215
210
216
return room
211
217
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 ):
214
221
if frappe .get_doc ('Chat Room' , room ).type != 'Visitor' :
215
222
authenticate (user )
216
223
217
224
fields = safe_json_loads (fields )
218
225
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 )
221
228
222
- return dictify (mess )
229
+ return dictify (mess )
0 commit comments