Source code for ploneintranet.notifications.queue
# -*- coding: utf-8 -*-
from Acquisition import Explicit
from BTrees import OOBTree
from BTrees.LOBTree import LOBTree
from interfaces import INotificationsQueues
from persistent import Persistent
from zope.interface import implements
import logging
import time
logger = logging.getLogger(__name__)
[docs]class AppendableLOBTree(LOBTree):
""" Implement append to LOBtrees to make it work like lists
"""
[docs] def append(self, value):
""" We append to the LOBtree value generating a key based on the
current time
"""
key = long(time.time() * 1.0e6)
while key in self:
key = key + 1
self[key] = value
[docs] def as_tuple(self, limit=None):
""" Return the values as a tuple.
"""
keys = sorted(self)
if limit is not None:
keys = keys[:limit]
return tuple(self[key] for key in keys)
[docs]class Queues(Persistent, Explicit):
"""
Stores queues for each user.
Users are referenced as string userids.
Return values are BTrees.OOBTree.OOTreeSet iterables.
"""
implements(INotificationsQueues)
def __init__(self, context=None):
self._users = OOBTree.OOBTree()
[docs] def clear(self):
self._users = OOBTree.OOBTree()
[docs] def append_to_user_queue(self, userid, value):
if userid not in self._users:
self._users[userid] = AppendableLOBTree()
self._users[userid].append(value)
[docs] def get_user_queue(self, userid, limit=None):
if userid not in self._users:
return ()
return self._users[userid].as_tuple(limit)
[docs] def del_user_queue(self, userid):
del self._users[userid]