3 import openerp.tools.config
4 import openerp.modules.registry
5 from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
7 from openerp.osv import osv, fields
14 from openerp.addons.im.im import *
16 _logger = logging.getLogger(__name__)
18 class ImWatcher(object):
22 def get_watcher(db_name):
23 if not ImWatcher.watchers.get(db_name):
25 return ImWatcher.watchers[db_name]
27 def __init__(self, db_name):
28 self.db_name = db_name
29 ImWatcher.watchers[db_name] = self
34 gevent.spawn(self.loop)
37 _logger.info("Begin watching on channel im_channel for database " + self.db_name)
41 registry = openerp.modules.registry.RegistryManager.get(self.db_name)
42 with registry.cursor() as cr:
43 listen_channel(cr, "im_channel", self.handle_message, self.check_stop)
46 # if something crash, we wait some time then try again
47 _logger.exception("Exception during watcher activity")
48 time.sleep(WATCHER_ERROR_DELAY)
49 _logger.info("End watching on channel im_channel for database " + self.db_name)
50 del ImWatcher.watchers[self.db_name]
52 def handle_message(self, message):
53 if message["type"] == "message":
54 for receiver in message["receivers"]:
55 for waiter in self.users.get(receiver, {}).values():
58 for waiter in self.users_watch.get(message["user"], {}).values():
62 return self.waiting == 0
64 def _get_wait_id(self):
68 def stop(self, user_id, watch_users, timeout=None):
69 wait_id = self._get_wait_id()
70 event = gevent.event.Event()
72 self.users.setdefault(user_id, {})[wait_id] = event
73 for watch in watch_users:
74 self.users_watch.setdefault(watch, {})[wait_id] = event
78 for watch in watch_users:
79 del self.users_watch[watch][wait_id]
80 if len(self.users_watch[watch]) == 0:
81 del self.users_watch[watch]
82 del self.users[user_id][wait_id]
83 if len(self.users[user_id]) == 0:
84 del self.users[user_id]