Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
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)
Esempio n. 10
0
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)
Esempio n. 11
0
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
Esempio n. 13
0
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
			))
Esempio n. 14
0
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
Esempio n. 15
0
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
Esempio n. 16
0
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
Esempio n. 17
0
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
Esempio n. 18
0
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
Esempio n. 19
0
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
Esempio n. 20
0
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
Esempio n. 21
0
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
Esempio n. 22
0
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
Esempio n. 23
0
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
Esempio n. 24
0
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
Esempio n. 25
0
    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)