work in progress: basic implementation of notification features
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2421 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
7c8489f170
commit
85d2423663
5 changed files with 99 additions and 17 deletions
|
@ -5,7 +5,7 @@ from zope.testing.doctestunit import DocFileSuite
|
|||
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
"Basic tests for the cybertools.tracking.notify package."
|
||||
"Basic tests for the cybertools.tracking.comment package."
|
||||
|
||||
def testBasics(self):
|
||||
pass
|
||||
|
|
|
@ -1,10 +1,31 @@
|
|||
========
|
||||
Comments
|
||||
========
|
||||
=============
|
||||
Notifications
|
||||
=============
|
||||
|
||||
($Id$)
|
||||
|
||||
>>> from zope import component
|
||||
>>> from cybertools.tracking.btree import TrackingStorage
|
||||
>>> from cybertools.tracking.comment.base import Comment
|
||||
>>> from cybertools.tracking.notify.base import Notification, NotificationManager
|
||||
>>> component.provideAdapter(NotificationManager)
|
||||
|
||||
>>> comments = TrackingStorage(trackFactory=Comment)
|
||||
>>> notifications = TrackingStorage(trackFactory=Notification)
|
||||
|
||||
>>> from cybertools.tracking.notify.interfaces import INotificationManager
|
||||
>>> manager = INotificationManager(notifications)
|
||||
|
||||
|
||||
Storing and Retrieving Notifications
|
||||
====================================
|
||||
|
||||
>>> manager.notify('obj01', 'user01', 'object_changed')
|
||||
|
||||
>>> ntf01 = manager.query(userName='user01')[0]
|
||||
>>> ntf01
|
||||
<Notification ['obj01', 1, 'user01', '...']:
|
||||
{'media': ['inbox'], 'state': 'new', 'type': 'object_changed'}>
|
||||
|
||||
>>> print ntf01.state
|
||||
new
|
||||
>>> print ntf01.timingType
|
||||
None
|
||||
|
|
|
@ -22,12 +22,45 @@ Base classes for a notification framework.
|
|||
$Id$
|
||||
"""
|
||||
|
||||
from zope.component import adapts
|
||||
from zope.interface import implements
|
||||
|
||||
from cybertools.tracking.btree import Track
|
||||
from cybertools.tracking.notify.interfaces import INotification
|
||||
from cybertools.tracking.interfaces import ITrackingStorage
|
||||
from cybertools.tracking.notify.interfaces import INotification, INotificationManager
|
||||
|
||||
|
||||
class NotificationManager(object):
|
||||
|
||||
implements(INotificationManager)
|
||||
adapts(ITrackingStorage)
|
||||
|
||||
def __init__(self, context):
|
||||
self.context = context
|
||||
|
||||
def notify(self, taskId, userName, ntfType, media=None, priority='info', **kw):
|
||||
runId = self.context.startRun()
|
||||
if media is None:
|
||||
media = ['inbox']
|
||||
data = dict(type=ntfType, state='new', media=media)
|
||||
data.update(kw)
|
||||
self.context.saveUserTrack(taskId, runId, userName, data)
|
||||
|
||||
def cleanUp(self, age=1, removeIgnored=False):
|
||||
pass
|
||||
|
||||
def query(self, **kw):
|
||||
return self.context.query(**kw)
|
||||
|
||||
|
||||
class Notification(Track):
|
||||
|
||||
implements(INotification)
|
||||
|
||||
typeName = 'Notification'
|
||||
|
||||
def __getattr__(self, attr):
|
||||
if attr in INotification:
|
||||
return self.data.get(attr)
|
||||
raise AttributeError(attr)
|
||||
|
||||
|
|
|
@ -28,10 +28,29 @@ from zope import schema
|
|||
from cybertools.tracking.interfaces import ITrack
|
||||
|
||||
|
||||
class INotificationManager(Interface):
|
||||
""" Provides methods for working with notifications.
|
||||
|
||||
Typically used as an adapter for ITrackingStorage objects.
|
||||
"""
|
||||
|
||||
def notify(taskId, userName, type, media=None, **kw):
|
||||
""" Create a notification object according to the information given.
|
||||
"""
|
||||
|
||||
def cleanUp(age=1, removeIgnored=False):
|
||||
""" Remove old (finished) runs and (done) tracks; the last change
|
||||
(timeStamp) being before ``now - age`` days.
|
||||
|
||||
If the ``removeIgnored`` argument is True remove also tracks
|
||||
in ``ignored`` state.
|
||||
"""
|
||||
|
||||
|
||||
class INotification(ITrack):
|
||||
""" A notification carries information necessary to inform a
|
||||
receiver (typically a user or person, but possibly also another
|
||||
entity) about an event.
|
||||
kind of entity) about an event.
|
||||
The object the notification is related to is referenced via the
|
||||
task id attribute; interdependent notifications (i.e. notifications
|
||||
that are triggered by the identical event or have been created
|
||||
|
@ -40,20 +59,22 @@ class INotification(ITrack):
|
|||
"""
|
||||
|
||||
type = Attribute('A string (token) that specifies the '
|
||||
'type of the notification.') # TODO: vocabulary
|
||||
'type of the notification.')
|
||||
state = Attribute('A string (token) specifying the '
|
||||
'current state of the notification.') # TODO: vocabulary
|
||||
'current state of the notification.')
|
||||
priority = Attribute('A string (token) specifying the '
|
||||
'priority/importance of the notification.')
|
||||
parent = Attribute('The id of the parent notification, i.e. the '
|
||||
'notification that triggered the creation of this one. '
|
||||
'None if there is not parent notification.')
|
||||
eventType = Attribute('A string (token or title) that specifies the '
|
||||
'type of the event that triggered this notification.')
|
||||
media = Attribute('A string (token) specifying the '
|
||||
'media type that will be used for presenting '
|
||||
'the notification.') # TODO: vocabulary
|
||||
media = Attribute('A collection of strings (tokens) specifying the '
|
||||
'media types that will be used for presenting '
|
||||
'the notification.')
|
||||
timingType = Attribute('A string (token) specifying the '
|
||||
'type of timing that will be used for presenting '
|
||||
'the notification.') # TODO: vocabulary
|
||||
'the notification.')
|
||||
timing = Attribute('A list of (typically) time/date values specifying '
|
||||
'the time range for presentation. The possible values and '
|
||||
'their interpretation depend on the timing type.')
|
||||
|
@ -67,4 +88,11 @@ class INotification(ITrack):
|
|||
# media + timingType + timing + deliveryInfo could be combined to
|
||||
# a `deliverySpec` attribute.
|
||||
|
||||
# TODO: Action class (type + instance); vocabulary of action types
|
||||
types = ('object_changed', 'object_new', 'invitation', 'assignment')
|
||||
states = ('new', 'active', 'deferred', 'done', 'ignored')
|
||||
priorities = ('critical', 'important', 'normal', 'info')
|
||||
media = ('inbox', 'mail', 'im', 'rss')
|
||||
timingTypes = ('immediate', 'hourly', 'daily', 'explicit')
|
||||
actionTypes = ('accept', 'reject', 'ignore', 'note', 'delegate')
|
||||
|
||||
# TODO: Action class (type + instance)
|
||||
|
|
|
@ -5,7 +5,7 @@ from zope.testing.doctestunit import DocFileSuite
|
|||
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
"Basic tests for the cybertools.tracking.comment package."
|
||||
"Basic tests for the cybertools.tracking.notify package."
|
||||
|
||||
def testBasics(self):
|
||||
pass
|
||||
|
|
Loading…
Add table
Reference in a new issue