diff --git a/addons/im/im.py b/addons/im/im.py index aa659e9bcd0..b9bb957fce2 100644 --- a/addons/im/im.py +++ b/addons/im/im.py @@ -203,14 +203,14 @@ class im_session(osv.osv): session_id = None if user_to: # FP Note: does the ORM allows something better than this? == on many2many - sids = self.search(cr, uid, [('user_ids', 'in', [user_to]), ('user_ids', 'in', [my_id])], context=context, limit=1) + sids = self.search(cr, openerp.SUPERUSER_ID, [('user_ids', 'in', [user_to]), ('user_ids', 'in', [my_id])], context=context, limit=1) for session in self.browse(cr, uid, sids, context=context): if len(session.user_ids) == 2: session_id = session.id break if not session_id: - session_id = self.create(cr, uid, { - 'user_ids': [(6, 0, (user_to, uid))] + session_id = self.create(cr, openerp.SUPERUSER_ID, { + 'user_ids': [(6, 0, [user_to, my_id])] }, context=context) return self.read(cr, uid, session_id, context=context) diff --git a/addons/im/security/im_security.xml b/addons/im/security/im_security.xml index c99b7ec96e1..d6b854c8a98 100644 --- a/addons/im/security/im_security.xml +++ b/addons/im/security/im_security.xml @@ -22,16 +22,5 @@ - - - Can modify sessions if you are in it. - - - [('user_ids', 'in', [user.id])] - - - - - diff --git a/addons/im/security/ir.model.access.csv b/addons/im/security/ir.model.access.csv index 87593f28ea2..651aa68c1bb 100644 --- a/addons/im/security/ir.model.access.csv +++ b/addons/im/security/ir.model.access.csv @@ -1,4 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_im_message,im.message,model_im_message,base.group_user,1,0,1,0 access_im_user,im.user,model_im_user,,1,1,1,0 -access_im_session,im.session,model_im_session,base.group_user,1,1,1,0 \ No newline at end of file +access_im_session,im.session,model_im_session,,1,0,0,0 \ No newline at end of file diff --git a/addons/im_livechat/im_livechat.py b/addons/im_livechat/im_livechat.py index cec546c8b8c..c8060b3fe92 100644 --- a/addons/im_livechat/im_livechat.py +++ b/addons/im_livechat/im_livechat.py @@ -75,7 +75,7 @@ class LiveChatController(http.Controller): def available(self, db, channel): reg, uid = self._auth(db) with reg.cursor() as cr: - return reg.get('im_livechat.channel').get_available_user(cr, uid, channel) > 0 + return len(reg.get('im_livechat.channel').get_available_users(cr, uid, channel)) > 0 class im_livechat_channel(osv.osv): _name = 'im_livechat.channel' @@ -159,7 +159,7 @@ class im_livechat_channel(osv.osv): 'image': _get_default_image, } - def get_available_user(self, cr, uid, channel_id, context=None): + def get_available_users(self, cr, uid, channel_id, context=None): channel = self.browse(cr, openerp.SUPERUSER_ID, channel_id, context=context) im_user_ids = self.pool.get("im.user").search(cr, uid, [["user_id", "in", [user.id for user in channel.user_ids]]], context=context) users = [] @@ -167,9 +167,17 @@ class im_livechat_channel(osv.osv): imuser = self.pool.get("im.user").browse(cr, uid, iuid, context=context) if imuser.im_status: users.append(imuser) + return users + + def get_session(self, cr, uid, channel_id, uuid, context=None): + my_id = self.pool.get("im.user").get_my_id(cr, uid, uuid, context=context) + users = self.get_available_users(cr, uid, channel_id, context=context) if len(users) == 0: return False - return random.choice(users).id + user_id = random.choice(users).id + session = self.pool.get("im.session").session_get(cr, uid, user_id, uuid, context=context) + self.pool.get("im.session").write(cr, openerp.SUPERUSER_ID, session.get("id"), {'channel_id': channel_id}, context=context) + return session.get("id") def test_channel(self, cr, uid, channel, context=None): if not channel: @@ -198,50 +206,9 @@ class im_livechat_channel(osv.osv): self.write(cr, uid, ids, {'user_ids': [(3, uid)]}) return True -""" -class im_message(osv.osv): - _inherit = 'im.message' - - def _support_member(self, cr, uid, ids, name, arg, context=None): - res = {} - for record in self.browse(cr, uid, ids, context=context): - res[record.id] = False - if record.to_id.user_id and record.from_id.user_id: - continue - elif record.to_id.user_id: - res[record.id] = record.to_id.user_id.id - elif record.from_id.user_id: - res[record.id] = record.from_id.user_id.id - return res - - def _customer(self, cr, uid, ids, name, arg, context=None): - res = {} - for record in self.browse(cr, uid, ids, context=context): - res[record.id] = False - if record.to_id.uuid and record.from_id.uuid: - continue - elif record.to_id.uuid: - res[record.id] = record.to_id.id - elif record.from_id.uuid: - res[record.id] = record.from_id.id - return res - - def _direction(self, cr, uid, ids, name, arg, context=None): - res = {} - for record in self.browse(cr, uid, ids, context=context): - res[record.id] = False - if not not record.to_id.user_id and not not record.from_id.user_id: - continue - elif not not record.to_id.user_id: - res[record.id] = "c2s" - elif not not record.from_id.user_id: - res[record.id] = "s2c" - return res +class im_session(osv.osv): + _inherit = 'im.session' _columns = { - 'support_member_id': fields.function(_support_member, type='many2one', relation='res.users', string='Support Member', store=True, select=True), - 'customer_id': fields.function(_customer, type='many2one', relation='im.user', string='Customer', store=True, select=True), - 'direction': fields.function(_direction, type="selection", selection=[("s2c", "Support Member to Customer"), ("c2s", "Customer to Support Member")], - string='Direction', store=False), + 'channel_id': fields.many2one("im.user", "Channel"), } -""" diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index fd5cecfe7d9..dc579345705 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -92,7 +92,7 @@ define(["openerp", "im_common", "underscore", "require", "jquery", setTimeout(function() { def.reject(); }, 5000); - def.then(_.bind(this.chat, this), function() { + return def.then(_.bind(this.chat, this), function() { im_common.notification(_t("It seems the connection to the server is encountering problems, please try again later.")); }); }, @@ -100,13 +100,12 @@ define(["openerp", "im_common", "underscore", "require", "jquery", var self = this; if (this.manager.conversations.length > 0) return; - im_common.connection.model("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) { - if (! user_id) { + im_common.connection.model("im_livechat.channel").call("get_session", [this.channel, this.manager.me.get("uuid")]).then(function(session_id) { + if (! session_id) { im_common.notification(_t("None of our collaborators seems to be available, please try again later.")); return; } - self.manager.ensure_users([user_id]).then(function() { - var conv = self.manager.activate_user(self.manager.get_user(user_id), true); + self.manager.activate_session(session_id, true).then(function(conv) { if (self.options.defaultMessage) { conv.received_message({message: self.options.defaultMessage, date: openerp.datetime_to_str(new Date())});