diff --git a/addons/im/watcher.py b/addons/im/watcher.py
index b8cb74df5ba..c733b189778 100644
--- a/addons/im/watcher.py
+++ b/addons/im/watcher.py
@@ -51,8 +51,9 @@ class ImWatcher(object):
def handle_message(self, message):
if message["type"] == "message":
- for waiter in self.users.get(message["receiver"], {}).values():
- waiter.set()
+ for receiver in message["receivers"]:
+ for waiter in self.users.get(receiver, {}).values():
+ waiter.set()
else: #type status
for waiter in self.users_watch.get(message["user"], {}).values():
waiter.set()
diff --git a/addons/im_livechat/im_livechat.py b/addons/im_livechat/im_livechat.py
index a47f87a9fd2..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,49 +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/im_livechat_view.xml b/addons/im_livechat/im_livechat_view.xml
index 65401f3b88f..1fccc1b301c 100644
--- a/addons/im_livechat/im_livechat_view.xml
+++ b/addons/im_livechat/im_livechat_view.xml
@@ -124,7 +124,7 @@
History
im.message
list
-
["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]
+
[('session_id.channel_id', '!=', None)]
@@ -133,10 +133,9 @@
im.message
+
-
-
-
+
diff --git a/addons/im_livechat/security/im_livechat_security.xml b/addons/im_livechat/security/im_livechat_security.xml
index 9088d0ed3db..b93798f96a9 100644
--- a/addons/im_livechat/security/im_livechat_security.xml
+++ b/addons/im_livechat/security/im_livechat_security.xml
@@ -25,7 +25,7 @@
Live Support Managers can read messages from live support
-
["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]
+
[('session_id.channel_id', '!=', None)]
diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js
index fd5cecfe7d9..5ccdbd66cb7 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,16 +100,18 @@ 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())});
+ conv.received_message({
+ message: self.options.defaultMessage,
+ date: openerp.datetime_to_str(new Date()),
+ from_id: [conv.users[0].get("id"), "Unknown"]
+ });
}
});
});