def get(user=None, token=None, 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 [email protected] data = user or token authenticate(data) rooms, fields, filters = safe_json_loads(rooms, fields, filters) rooms = listify(get_if_empty(rooms, [])) fields = listify(get_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'] param = [f for f in fields if f not in handle] rooms = frappe.get_all('Chat Room', or_filters=[ ['Chat Room', 'owner', '=', frappe.session.user], ['Chat Room User', 'user', '=', frappe.session.user] ], filters=const, fields=param + ['name'] if param else default, distinct=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
def create(kind, token, users=None, name=None): authenticate(token) users = safe_json_loads(users) create = True if kind == 'Visitor': room = squashify(frappe.db.sql(""" SELECT name FROM `tabChat Room` WHERE owner=%s """, (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 = frappe.session.user room.room_name = name dusers = [] if kind != 'Visitor': if users: users = listify(users) for user in users: duser = frappe.new_doc('Chat Room User') duser.user = user dusers.append(duser) room.users = dusers else: 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 [] for user in dsettings.chat_operators: if user.user not in users: # appending user to room.users will remove the user from chat_operators # this is undesirable, create a new Chat Room User instead chat_room_user = {"doctype": "Chat Room User", "user": user.user} room.append('users', chat_room_user) room.save(ignore_permissions=True) room = get(token=token, rooms=room.name) if room: users = [room.owner] + [u for u in room.users] for user in users: frappe.publish_realtime('frappe.chat.room:create', room, user=user, after_commit=True) return room
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 get_if_empty (previous assign_if_none) # - Achilles Rasquinha [email protected] authenticate(user) rooms, fields, filters = safe_json_loads(rooms, fields, filters) rooms = listify(get_if_empty(rooms, [ ])) fields = listify(get_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'] 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 = const, fields = param + ['name'] if param else default, distinct = 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
def create(kind, owner, users = None, name = None): authenticate(owner) users = safe_json_loads(users) create = True if kind == 'Visitor': room = squashify(frappe.db.sql(""" SELECT name FROM `tabChat Room` WHERE owner = "{owner}" """.format(owner = owner), 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.room_name = name dusers = [ ] if kind != 'Visitor': if users: users = listify(users) for user in users: duser = frappe.new_doc('Chat Room User') duser.user = user dusers.append(duser) room.users = dusers else: 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 [ ] for user in dsettings.chat_operators: if user.user not in users: # appending user to room.users will remove the user from chat_operators # this is undesirable, create a new Chat Room User instead chat_room_user = {"doctype": "Chat Room User", "user": user.user} room.append('users', chat_room_user) room.save(ignore_permissions = True) 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) return room
def history(room, user, fields=None, limit=10, start=None, end=None): if frappe.get_doc('Chat Room', room).type != 'Visitor': authenticate(user) fields = safe_json_loads(fields) mess = chat_message.history(room, limit=limit, start=start, end=end) mess = squashify(mess) return dictify(mess)
def history(room, user, fields = None, limit = 10, start = None, end = None): if frappe.get_doc('Chat Room', room).type != 'Visitor': authenticate(user) fields = safe_json_loads(fields) mess = chat_message.history(room, limit = limit, start = start, end = end) mess = squashify(mess) return dictify(mess)
def seen(message, user = None): authenticate(user) mess = frappe.get_doc('Chat Message', message) mess.add_seen(user) room = mess.room resp = dict(message = message, data = dict(seen = json.loads(mess._seen))) frappe.publish_realtime('frappe.chat.message:update', resp, room = room, after_commit = True)
def create(kind, owner, users = None, name = None): authenticate(owner) users = safe_json_loads(users) create = True if kind == 'Visitor': room = squashify(frappe.db.sql(""" SELECT name FROM `tabChat Room` WHERE owner = "{owner}" """.format(owner = owner), 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.room_name = name dusers = [ ] if kind != 'Visitor': if users: users = listify(users) for user in users: duser = frappe.new_doc('Chat Room User') duser.user = user dusers.append(duser) room.users = dusers else: 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 [ ] for user in dsettings.chat_operators: if user.user not in users: room.append('users', user) room.save(ignore_permissions = True) 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) return room
def seen(message, user = None): authenticate(user) has_message = frappe.db.exists('Chat Message', message) if has_message: mess = frappe.get_doc('Chat Message', message) mess.add_seen(user) mess.load_from_db() room = mess.room resp = dict(message = message, data = dict(seen = json.loads(mess._seen) if mess._seen else [])) frappe.publish_realtime('frappe.chat.message:update', resp, room = room, after_commit = True)
def seen(message, user=None): authenticate(user) mess = frappe.get_doc('Chat Message', message) mess.add_seen(user) room = mess.room resp = dict(message=message, data=dict(seen=json.loads(mess._seen))) frappe.publish_realtime('frappe.chat.message:update', resp, room=room, after_commit=True)
def seen(message, user=None): authenticate(user, raise_err=True) has_message = frappe.db.exists('Chat Message', message) if has_message: mess = frappe.get_doc('Chat Message', message) mess.add_seen(user) mess.load_from_db() room = mess.room seen = dict.fromkeys(json.loads(mess._seen)) if mess._seen else [] resp = dict(message=message, data={"seen": list(seen.keys())}) frappe.publish_realtime('frappe.chat.message:update', resp, room=room, after_commit=True)