From faba20c1095ef291fd60d805fdbcb630a235aac9 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 3 Dec 2012 16:30:20 +0100 Subject: [PATCH] Added users status + polling bzr revid: nicolas.vanhoren@openerp.com-20121203153020-yb92jj5kt7g7h6ct --- addons/web_im/im.py | 34 ++++++++++++++++++++++++++----- addons/web_im/static/src/js/im.js | 11 +++++++++- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/addons/web_im/im.py b/addons/web_im/im.py index 920e3423520..7027fe602f8 100644 --- a/addons/web_im/im.py +++ b/addons/web_im/im.py @@ -22,11 +22,13 @@ import openerp import openerp.tools.config import openerp.modules.registry +from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT import datetime from osv import osv, fields WATCHER_TIMER = 60 POLL_TIMER = 30 +DISCONNECTION_TIMER = POLL_TIMER + 5 if openerp.tools.config.options["gevent"]: import gevent @@ -91,12 +93,12 @@ class ImportController(openerp.addons.web.http.Controller): _cp_path = '/im' @openerp.addons.web.http.jsonrequest - def poll(self, req, last=None): + def poll(self, req, last=None, users_watch=None): if not openerp.tools.config.options["gevent"]: raise Exception("Not usable in a server not running gevent") num = 0 while True: - res = req.session.model('im.message').get_messages(last, req.context) + res = req.session.model('im.message').get_messages(last, users_watch, req.context) if num >= 1 or len(res["res"]) > 0: return res last = res["last"] @@ -117,7 +119,9 @@ class im_message(osv.osv): 'date': datetime.datetime.now(), } - def get_messages(self, cr, uid, last=None, context=None): + def get_messages(self, cr, uid, last=None, users_watch=None, context=None): + users_watch = users_watch or [] + # complex stuff to determine the last message to show users = self.pool.get("res.users") c_user = users.browse(cr, uid, uid, context=context) @@ -132,7 +136,9 @@ class im_message(osv.osv): res = self.read(cr, uid, res, ["id", "message", "from", "date"], context=context) if len(res) > 0: last = res[-1]["id"] - return {"res": res, "last": last, "dbname": cr.dbname} + print "users_watch:", users_watch + users_status = users.read(cr, uid, users_watch, ["im_status"], context=context) + return {"res": res, "last": last, "dbname": cr.dbname, "users_status": users_status} def post(self, cr, uid, message, to_user_id, context=None): self.create(cr, uid, {"message": message, 'from': uid, 'to': to_user_id}, context=context) @@ -147,6 +153,24 @@ class im_message(osv.osv): class res_user(osv.osv): _inherit = "res.users" + def _im_status(self, cr, uid, ids, something, something_else, context=None): + res = {} + current = datetime.datetime.now() + delta = datetime.timedelta(0, DISCONNECTION_TIMER) + for obj in self.browse(cr, uid, ids, context=context): + last_update = datetime.datetime.strptime(obj.im_last_status_update, DEFAULT_SERVER_DATETIME_FORMAT) + res[obj.id] = obj.im_last_status and (last_update + delta) > current + return res + _columns = { - 'im_last_received': fields.integer(string="Last Received Message"), + 'im_last_received': fields.integer(string="Instant Messaging Last Received Message"), + 'im_last_status': fields.boolean(strint="Instant Messaging Last Status"), + 'im_last_status_update': fields.datetime(string="Instant Messaging Last Status Update"), + 'im_status': fields.function(_im_status, string="Instant Messaging Status", type='boolean'), + } + + _defaults = { + 'im_last_received': -1, + 'im_last_status': False, + 'im_last_status_update': datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT), } diff --git a/addons/web_im/static/src/js/im.js b/addons/web_im/static/src/js/im.js index 4651975bc31..9d6ebc4a4cb 100644 --- a/addons/web_im/static/src/js/im.js +++ b/addons/web_im/static/src/js/im.js @@ -66,7 +66,9 @@ openerp.web_im = function(instance) { var self = this; return this.ensure_users([instance.session.uid]).then(function() { - self.c_manager.set_me(self.get_user(instance.session.uid)); + var me = self.users_cache[instance.session.uid]; + delete self.users_cache[instance.session.uid]; + self.c_manager.set_me(me); return new instance.web.Model("im.message").call("activated", [], {context: new instance.web.CompoundContext()}).then(function(activated) { if (activated) { self.activated = true; @@ -159,10 +161,17 @@ openerp.web_im = function(instance) { }, poll: function() { var self = this; + var user_ids = _.map(this.users_cache, function(el) { + return el.get("id"); + }); this.rpc("/im/poll", { last: this.last, + users_watch: user_ids, context: instance.web.pyeval.eval('context', {}), }, {shadow: true}).then(function(result) { + _.each(result.users_status, function(el) { + self.get_user(el.id).set(el); + }); self.last = result.last; var user_ids = _.pluck(_.pluck(result.res, "from"), 0); self.ensure_users(user_ids).then(function() {