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 update(user, data): authenticate(user) data = safe_json_loads(data) dprof = frappe.get_doc('Chat Profile', user) dprof.update(data) dprof.save(ignore_permissions = True)
def update(user, data): authenticate(user) data = safe_json_loads(data) dprof = frappe.get_doc('Chat Profile', user) dprof.update(data) dprof.save(ignore_permissions=True)
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 history(room, user, fields=None, limit=10, start=None, end=None): 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 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 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 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 get_version(doctype, name, limit = None, head = False, raise_err = True): ''' Returns a list of version information of a given DocType (Applicable only if DocType has changes tracked). Example >>> frappe.get_version('User', '*****@*****.**') >>> [ { "version": [version.data], # Refer Version DocType get_diff method and data attribute "user": "******" # User that created this version "creation": <datetime.datetime> # Creation timestamp of that object. } ] ''' meta = get_meta(doctype) if meta.track_changes: names = db.sql(""" SELECT name from tabVersion WHERE ref_doctype = '{doctype}' AND docname = '{name}' {order_by} {limit} """.format( doctype = doctype, name = name, order_by = 'ORDER BY creation' if head else '', limit = 'LIMIT {limit}'.format(limit = limit) if limit else '' )) from frappe.chat.util import squashify, dictify, safe_json_loads versions = [ ] for name in names: name = squashify(name) doc = get_doc('Version', name) data = doc.data data = safe_json_loads(data) data = dictify(dict( version = data, user = doc.owner, creation = doc.creation )) versions.append(data) return versions else: if raise_err: raise ValueError('{doctype} has no versions tracked.'.format( doctype = doctype ))
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 get(name, rooms=None, fields=None): rooms, fields = safe_json_loads(rooms, fields) dmess = frappe.get_doc('Chat Message', name) data = dict(name=dmess.name, user=dmess.user, room=dmess.room, content=dmess.content, urls=dmess.urls, mentions=dmess.mentions, creation=dmess.creation, seen=assign_if_empty(dmess._seen, [])) return data
def create(user, exists_ok = False, fields = None): authenticate(user) exists_ok, fields = safe_json_loads(exists_ok, fields) try: dprof = frappe.new_doc('Chat Profile') dprof.user = user dprof.save(ignore_permissions = True) except frappe.DuplicateEntryError: if not exists_ok: frappe.throw(_('Chat Profile for User {0} exists.').format(user)) profile = get(user, fields = fields) return profile
def create(user, exists_ok=False, fields=None): authenticate(user) exists_ok, fields = safe_json_loads(exists_ok, fields) try: dprof = frappe.new_doc('Chat Profile') dprof.user = user dprof.save(ignore_permissions=True) except frappe.DuplicateEntryError: if not exists_ok: frappe.throw(_('Chat Profile for User {0} exists.').format(user)) profile = get(user, fields=fields) return profile
def settings(fields=None): fields = safe_json_loads(fields) dsettings = frappe.get_single('Website Settings') response = dict( socketio=dict(port=frappe.conf.socketio_port), enable=bool(dsettings.chat_enable), enable_from=dsettings.chat_enable_from, enable_to=dsettings.chat_enable_to, room_name=dsettings.chat_room_name, welcome_message=dsettings.chat_welcome_message, operators=[duser.user for duser in dsettings.chat_operators]) if fields: response = filter_dict(response, fields) return response
def get(name, rooms=None, fields=None): rooms, fields = safe_json_loads(rooms, fields) dmess = frappe.get_doc('Chat Message', name) data = dict(name=dmess.name, user=dmess.user, room=dmess.room, room_type=dmess.room_type, content=json.loads(dmess.content) if dmess.type in ["File"] else dmess.content, type=dmess.type, urls=dmess.urls, mentions=dmess.mentions, creation=dmess.creation, seen=get_if_empty(dmess._seen, [])) return data
def create(user, exists_ok=False, fields=None): authenticate(user) exists_ok, fields = safe_json_loads(exists_ok, fields) if frappe.db.exists('Chat Profile', user): if not exists_ok: frappe.throw( _('Chat Profile for User {user} exists.'.format(user=user))) else: dprof = frappe.new_doc('Chat Profile') dprof.user = user dprof.save(ignore_permissions=True) profile = get(user, fields=fields) return profile
def get(name, rooms = None, fields = None): rooms, fields = safe_json_loads(rooms, fields) dmess = frappe.get_doc('Chat Message', name) data = dict( name = dmess.name, user = dmess.user, room = dmess.room, room_type = dmess.room_type, content = json.loads(dmess.content) if dmess.type in ["File"] else dmess.content, type = dmess.type, urls = dmess.urls, mentions = dmess.mentions, creation = dmess.creation, seen = get_if_empty(dmess._seen, [ ]) ) return data
def create(user, exists_ok=False, fields=None): authenticate(user) exists_ok, fields = safe_json_loads(exists_ok, fields) result = frappe.db.sql(""" SELECT * FROM `tabChat Profile` WHERE user = "******" """.format(user=user)) if result: if not exists_ok: frappe.throw(_('Chat Profile for User {0} exists.').format(user)) else: dprof = frappe.new_doc('Chat Profile') dprof.user = user dprof.save(ignore_permissions=True) profile = get(user, fields=fields) return profile
def settings(fields = None): fields = safe_json_loads(fields) dsettings = frappe.get_single('Website Settings') response = dict( socketio = dict( port = frappe.conf.socketio_port ), enable = bool(dsettings.chat_enable), enable_from = dsettings.chat_enable_from, enable_to = dsettings.chat_enable_to, room_name = dsettings.chat_room_name, welcome_message = dsettings.chat_welcome_message, operators = [ duser.user for duser in dsettings.chat_operators ] ) if fields: response = filter_dict(response, fields) return response
def create(user, exists_ok = False, fields = None): authenticate(user) exists_ok, fields = safe_json_loads(exists_ok, fields) result = frappe.db.sql(""" SELECT * FROM `tabChat Profile` WHERE user = "******" """.format(user = user)) if result: if not exists_ok: frappe.throw(_('Chat Profile for User {0} exists.').format(user)) else: dprof = frappe.new_doc('Chat Profile') dprof.user = user dprof.save(ignore_permissions = True) profile = get(user, fields = fields) return profile
def get_previous_version(doctype, name): meta = get_meta(doctype) if meta.track_changes: docs = frappe.db.sql(""" SELECT name, data from tabVersion WHERE ref_doctype = '{doctype}' AND docname = '{name}' ORDER BY creation DESC LIMIT 1 """.format( doctype=doctype, name=name, ), as_dict=True) from frappe.chat.util import safe_json_loads version = None if len(docs) > 0: version = docs[0].data version = safe_json_loads(version) return version
def test_safe_json_loads(self): number = safe_json_loads("1") self.assertEqual(type(number), int) number = safe_json_loads("1.0") self.assertEqual(type(number), float) string = safe_json_loads("foobar") self.assertEqual(type(string), str) array = safe_json_loads('[{ "foo": "bar" }]') self.assertEqual(type(array), list) objekt = safe_json_loads('{ "foo": "bar" }') self.assertEqual(type(objekt), dict) true, null = safe_json_loads("true", "null") self.assertEqual(true, True) self.assertEqual(null, None)