diff --git a/organize/personal/browser/configure.zcml b/organize/personal/browser/configure.zcml
index 5d7ff50..5291df4 100644
--- a/organize/personal/browser/configure.zcml
+++ b/organize/personal/browser/configure.zcml
@@ -35,4 +35,11 @@
class="loops.organize.personal.browser.notification.NotificationsListing"
permission="zope.View" />
+
+
diff --git a/organize/personal/browser/notification.py b/organize/personal/browser/notification.py
index 90697f3..075cf7b 100644
--- a/organize/personal/browser/notification.py
+++ b/organize/personal/browser/notification.py
@@ -24,7 +24,8 @@ from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
-from cybertools.util.date import formatTimeStamp
+from cybertools.browser.form import FormController
+from cybertools.util.date import formatTimeStamp, getTimeStamp
from loops.browser.concept import ConceptView
from loops.common import adapted, baseObject
from loops.organize.personal.notification import Notifications
@@ -49,11 +50,12 @@ class NotificationsListing(ConceptView):
def notifications(self):
return Notifications(self.person)
- def getNotifications(self, unreadOnly=True):
- tracks = self.notifications.listTracks()
+ def getNotifications(self, unreadOnly):
+ tracks = self.notifications.listTracks(unreadOnly)
return tracks
- def getNotificationsFormatted(self, unreadOnly=True):
+ def getNotificationsFormatted(self):
+ unreadOnly = not self.request.form.get('show_all')
result = []
for track in self.getNotifications(unreadOnly):
data = track.data
@@ -61,8 +63,11 @@ class NotificationsListing(ConceptView):
sender = dict(label=s.title,
url=self.nodeView.getUrlForTarget(baseObject(s)))
obj = util.getObjectForUid(track.taskId)
- object = dict(label=obj.title,
- url=self.nodeView.getUrlForTarget(baseObject(obj)))
+ ov = self.nodeView.getViewForTarget(obj)
+ url = '%s?form.action=notification_read&track=%s' % (
+ self.nodeView.getUrlForTarget(obj),
+ util.getUidForObject(track))
+ object = dict(label=ov.title, url=url)
read_ts = self.formatTimeStamp(data.get('read_ts'))
item = dict(timeStamp=self.formatTimeStamp(track.timeStamp),
sender=sender,
@@ -71,3 +76,17 @@ class NotificationsListing(ConceptView):
read_ts=read_ts)
result.append(item)
return result
+
+
+class ReadNotification(FormController):
+
+ def update(self):
+ form = self.request.form
+ trackId = form.get('track')
+ track = util.getObjectForUid(trackId)
+ data = track.data
+ alreadyRead = data.get('read_ts')
+ if not alreadyRead:
+ data['read_ts'] = getTimeStamp()
+ track.data = data
+ return True
diff --git a/organize/personal/browser/personal_macros.pt b/organize/personal/browser/personal_macros.pt
index c5988f8..0a76c59 100644
--- a/organize/personal/browser/personal_macros.pt
+++ b/organize/personal/browser/personal_macros.pt
@@ -50,25 +50,35 @@
diff --git a/organize/personal/notification.py b/organize/personal/notification.py
index 5f65f60..f575e8e 100644
--- a/organize/personal/notification.py
+++ b/organize/personal/notification.py
@@ -33,9 +33,12 @@ class Notifications(Favorites):
self.context = (baseObject(person).
getLoopsRoot().getRecordManager()['favorites'])
- def listTracks(self):
- return super(Notifications, self).listTracks(
+ def listTracks(self, unreadOnly=False):
+ tracks = super(Notifications, self).listTracks(
baseObject(self.person), type='notification')
+ if unreadOnly:
+ tracks = [t for t in tracks if not t.data.get('read_ts')]
+ return tracks
def add(self, obj, sender, text):
senderUid = util.getUidForObject(baseObject(sender))