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 @@
- - - - - - - - - - - - -
Date/TimeSenderObjectTextDate/Time read
- - - - -
+
+ + +
  + + + + + + + + + + + + +
Date/TimeSenderObjectMessageDate/Time read
+ + + + +
+
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))