diff --git a/addons/live_support/live_support.py b/addons/live_support/live_support.py index eb3adf4f7e7..dc649b766eb 100644 --- a/addons/live_support/live_support.py +++ b/addons/live_support/live_support.py @@ -201,3 +201,50 @@ class im_user(osv.osv): _columns = { 'support_channel_ids': fields.many2many('live_support.channel', 'live_support_channel_im_user', 'user_id', 'channel_id', string="Support Channels"), } + + +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 and record.from_id.user: + continue + elif record.to_id.user: + res[record.id] = record.to_id.user.id + elif record.from_id.user: + res[record.id] = record.from_id.user.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 and not not record.from_id.user: + continue + elif not not record.to_id.user: + res[record.id] = "c2s" + elif not not record.from_id.user: + res[record.id] = "s2c" + return res + + _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), + } diff --git a/addons/live_support/live_support_view.xml b/addons/live_support/live_support_view.xml index 5f3db09f5c5..d9276b18dfa 100644 --- a/addons/live_support/live_support_view.xml +++ b/addons/live_support/live_support_view.xml @@ -119,6 +119,26 @@ + + History + im.message + list + + + + + im.message.tree + im.message + + + + + + + + + + diff --git a/addons/live_support/security/live_support_security.xml b/addons/live_support/security/live_support_security.xml index b42c35b6163..7e5bc895010 100644 --- a/addons/live_support/security/live_support_security.xml +++ b/addons/live_support/security/live_support_security.xml @@ -21,5 +21,16 @@ + + Live Support Managers can read messages from live support + + + ["|", ('to_id.user', '=', None), ('from_id.user', '=', None)] + + + + + + diff --git a/addons/live_support/static/ext/static/js/livesupport.js b/addons/live_support/static/ext/static/js/livesupport.js index 93aef638ee9..d5afdca8189 100644 --- a/addons/live_support/static/ext/static/js/livesupport.js +++ b/addons/live_support/static/ext/static/js/livesupport.js @@ -249,10 +249,10 @@ define(["nova", "underscore", "oeclient", "require", "jquery", self.get_user(el.id).set(el); }); self.last = result.last; - var user_ids = _.pluck(_.pluck(result.res, "from"), 0); + var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0); self.ensure_users(user_ids).then(function() { _.each(result.res, function(mes) { - var user = self.get_user(mes.from[0]); + var user = self.get_user(mes.from_id[0]); self.received_message(mes, user); }); self.poll(); diff --git a/addons/web_im/im.py b/addons/web_im/im.py index 5253d350aef..97420b26871 100644 --- a/addons/web_im/im.py +++ b/addons/web_im/im.py @@ -202,11 +202,14 @@ def assert_uuid(uuid): class im_message(osv.osv): _name = 'im.message' + + _order = "date" + _columns = { 'message': fields.char(string="Message", size=200, required=True), - 'from': fields.many2one("im.user", "From", required= True, ondelete='cascade'), - 'to': fields.many2one("im.user", "To", required=True, select=True, ondelete='cascade'), - 'date': fields.datetime("Date", required=True), + 'from_id': fields.many2one("im.user", "From", required= True, ondelete='cascade'), + 'to_id': fields.many2one("im.user", "To", required=True, select=True, ondelete='cascade'), + 'date': fields.datetime("Date", required=True, select=True), } _defaults = { @@ -228,8 +231,8 @@ class im_message(osv.osv): last = c_user.im_last_received or -1 # how fun it is to always need to reorder results from read - mess_ids = self.search(cr, openerp.SUPERUSER_ID, [['id', '>', last], ['to', '=', my_id]], order="id", context=context) - mess = self.read(cr, openerp.SUPERUSER_ID, mess_ids, ["id", "message", "from", "date"], context=context) + mess_ids = self.search(cr, openerp.SUPERUSER_ID, [['id', '>', last], ['to_id', '=', my_id]], order="id", context=context) + mess = self.read(cr, openerp.SUPERUSER_ID, mess_ids, ["id", "message", "from_id", "date"], context=context) index = {} for i in xrange(len(mess)): index[mess[i]["id"]] = mess[i] @@ -245,7 +248,7 @@ class im_message(osv.osv): def post(self, cr, uid, message, to_user_id, uuid=None, context=None): assert_uuid(uuid) my_id = self.pool.get('im.user').get_by_user_id(cr, uid, uuid or uid)["id"] - self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from': my_id, 'to': to_user_id}, context=context) + self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from_id': my_id, 'to_id': to_user_id}, context=context) notify_channel(cr, "im_channel", {'type': 'message', 'receiver': to_user_id}) return False diff --git a/addons/web_im/security/web_im_security.xml b/addons/web_im/security/web_im_security.xml index a5f71eee58c..10297ac0669 100644 --- a/addons/web_im/security/web_im_security.xml +++ b/addons/web_im/security/web_im_security.xml @@ -5,7 +5,7 @@ Can only read messages that you sent or messages sent to you - ["|", ('to.user', '=', user.id), ('from.user', '=', user.id)] + ["|", ('to_id.user', '=', user.id), ('from_id.user', '=', user.id)] diff --git a/addons/web_im/static/src/js/im.js b/addons/web_im/static/src/js/im.js index 053efc341d7..a2ad2536ec6 100644 --- a/addons/web_im/static/src/js/im.js +++ b/addons/web_im/static/src/js/im.js @@ -267,10 +267,10 @@ openerp.web_im = function(instance) { self.get_user(el.id).set(el); }); self.last = result.last; - var user_ids = _.pluck(_.pluck(result.res, "from"), 0); + var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0); self.ensure_users(user_ids).then(function() { _.each(result.res, function(mes) { - var user = self.get_user(mes.from[0]); + var user = self.get_user(mes.from_id[0]); self.received_message(mes, user); }); self.poll();