fix(chat): refactor code to make chat work

fixes issues with token being wrongly passed as the owner, instead of
current session user (ie. frappe.session.user), which in turn causes the
following issue:

Traceback (most recent call last):
  File "/home/frappe/frappe-bench/apps/frappe/frappe/app.py", line 57, in application
    response = frappe.handler.handle()
  File "/home/frappe/frappe-bench/apps/frappe/frappe/handler.py", line 22, in handle
    data = execute_cmd(cmd)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/handler.py", line 61, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 1042, in call
    return fn(*args, **newargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/chat/doctype/chat_room/chat_room.py", line 203, in create
    room.save(ignore_permissions = True)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 272, in save
    return self._save(*args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 295, in _save
    self.insert()
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 223, in insert
    self._validate_links()
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 756, in _validate_links
    frappe.LinkValidationError)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 364, in throw
    msgprint(msg, raise_exception=exc, title=title, indicator='red')
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 350, in msgprint
    _raise_exception()
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 316, in _raise_exception
    raise raise_exception(msg)
frappe.exceptions.LinkValidationError: Could not find Owner: 0a4d6eb7763ef2065f44ece0653d829a1ba189f753562ab9ac261620

also fixes issue where the chat rooms do not load because of wrongly
passed parameters

Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
This commit is contained in:
Chinmay D. Pai 2019-12-11 18:04:09 +05:30
parent 234ab445a8
commit a8d2ed8d45
No known key found for this signature in database
GPG key ID: 75507BE256F40CED

View file

@ -93,14 +93,14 @@ class ChatRoom(Document):
frappe.publish_realtime('frappe.chat.room:update', update, room = self.name, after_commit = True)
@frappe.whitelist(allow_guest = True)
def get(user, rooms = None, fields = None, filters = None):
@frappe.whitelist(allow_guest=True)
def get(token, 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 get_if_empty (previous assign_if_none)
# - Achilles Rasquinha achilles@frappe.io
authenticate(user)
authenticate(token)
rooms, fields, filters = safe_json_loads(rooms, fields, filters)
@ -123,8 +123,8 @@ def get(user, rooms = None, fields = None, filters = None):
rooms = frappe.get_all('Chat Room',
or_filters = [
['Chat Room', 'owner', '=', user],
['Chat Room User', 'user', '=', user]
['Chat Room', 'owner', '=', frappe.session.user],
['Chat Room User', 'user', '=', frappe.session.user]
],
filters = const,
fields = param + ['name'] if param else default,
@ -151,9 +151,9 @@ def get(user, rooms = None, fields = None, filters = None):
return rooms
@frappe.whitelist(allow_guest = True)
def create(kind, owner, users = None, name = None):
authenticate(owner)
@frappe.whitelist(allow_guest=True)
def create(kind, token, users=None, name=None):
authenticate(token)
users = safe_json_loads(users)
create = True
@ -163,16 +163,16 @@ def create(kind, owner, users = None, name = None):
SELECT name
FROM `tabChat Room`
WHERE owner = "{owner}"
""".format(owner = owner), as_dict = True))
""".format(owner=frappe.session.user), as_dict=True))
if room:
room = frappe.get_doc('Chat Room', room.name)
create = False
if create:
room = frappe.new_doc('Chat Room')
room.type = kind
room.owner = owner
room = frappe.new_doc('Chat Room')
room.type = kind
room.owner = frappe.session.user
room.room_name = name
dusers = [ ]
@ -181,13 +181,13 @@ def create(kind, owner, users = None, name = None):
if users:
users = listify(users)
for user in users:
duser = frappe.new_doc('Chat Room User')
duser = frappe.new_doc('Chat Room User')
duser.user = user
dusers.append(duser)
room.users = dusers
else:
dsettings = frappe.get_single('Website Settings')
dsettings = frappe.get_single('Website Settings')
room.room_name = dsettings.chat_room_name
users = [user for user in room.users] if hasattr(room, 'users') else [ ]
@ -201,11 +201,12 @@ def create(kind, owner, users = None, name = None):
room.save(ignore_permissions = True)
room = get(owner, rooms = room.name)
users = [room.owner] + [u for u in room.users]
room = get(token, rooms=room.name)
if room:
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)
for user in users:
frappe.publish_realtime('frappe.chat.room:create', room, user=user, after_commit=True)
return room
@ -219,4 +220,4 @@ def history(room, user, fields = None, limit = 10, start = None, end = None):
mess = chat_message.history(room, limit = limit, start = start, end = end)
mess = squashify(mess)
return dictify(mess)
return dictify(mess)