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 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) room = frappe.new_doc('Chat Room') room.type = kind room.owner = owner room.room_name = name dusers = [] 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 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 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 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 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