work in progress: notifications listing
This commit is contained in:
parent
019eef29a6
commit
d09e2a9d0a
5 changed files with 48 additions and 8 deletions
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
View extension for support of i18n content.
|
View extension for support of i18n content.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from datetime import date, datetime
|
||||||
from zope import interface, component
|
from zope import interface, component
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
from zope.app.session.interfaces import ISession
|
from zope.app.session.interfaces import ISession
|
||||||
|
@ -28,6 +29,7 @@ from zope.i18n.interfaces import IUserPreferredLanguages
|
||||||
from zope.i18n.negotiator import negotiator
|
from zope.i18n.negotiator import negotiator
|
||||||
|
|
||||||
from cybertools.meta.interfaces import IOptions
|
from cybertools.meta.interfaces import IOptions
|
||||||
|
from cybertools.util import format
|
||||||
from loops.common import adapted
|
from loops.common import adapted
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,6 +78,8 @@ class I18NView(object):
|
||||||
""" View mix-in class.
|
""" View mix-in class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
timeStampFormat = 'short'
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def languageInfo(self):
|
def languageInfo(self):
|
||||||
return LanguageInfo(self.context, self.request)
|
return LanguageInfo(self.context, self.request)
|
||||||
|
@ -114,3 +118,10 @@ class I18NView(object):
|
||||||
self.setLanguage(lang)
|
self.setLanguage(lang)
|
||||||
return self()
|
return self()
|
||||||
|
|
||||||
|
def formatTimeStamp(self, ts, f='dateTime'):
|
||||||
|
if not ts:
|
||||||
|
return u''
|
||||||
|
value = datetime.fromtimestamp(ts)
|
||||||
|
return format.formatDate(value, f, self.timeStampFormat,
|
||||||
|
self.languageInfo.language)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -35,7 +35,7 @@ from zope.traversing.api import getName
|
||||||
from cybertools.organize.party import Person as BasePerson
|
from cybertools.organize.party import Person as BasePerson
|
||||||
from cybertools.relation.interfaces import IRelationRegistry
|
from cybertools.relation.interfaces import IRelationRegistry
|
||||||
from cybertools.typology.interfaces import IType
|
from cybertools.typology.interfaces import IType
|
||||||
from loops.common import AdapterBase
|
from loops.common import AdapterBase, baseObject
|
||||||
from loops.concept import Concept
|
from loops.concept import Concept
|
||||||
from loops.interfaces import IConcept
|
from loops.interfaces import IConcept
|
||||||
from loops.organize.interfaces import IAddress, IPerson, IHasRole
|
from loops.organize.interfaces import IAddress, IPerson, IHasRole
|
||||||
|
@ -64,7 +64,7 @@ def getPersonForUser(context, request=None, principal=None):
|
||||||
principal = getattr(request, 'principal', None)
|
principal = getattr(request, 'principal', None)
|
||||||
if principal is None:
|
if principal is None:
|
||||||
return None
|
return None
|
||||||
loops = context.getLoopsRoot()
|
loops = baseObject(context).getLoopsRoot()
|
||||||
pa = annotations(principal).get(ANNOTATION_KEY, None)
|
pa = annotations(principal).get(ANNOTATION_KEY, None)
|
||||||
if pa is None:
|
if pa is None:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -24,7 +24,9 @@ from zope import component
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
|
|
||||||
|
from cybertools.util.date import formatTimeStamp
|
||||||
from loops.browser.concept import ConceptView
|
from loops.browser.concept import ConceptView
|
||||||
|
from loops.common import adapted, baseObject
|
||||||
from loops.organize.personal.notification import Notifications
|
from loops.organize.personal.notification import Notifications
|
||||||
from loops.organize.party import getPersonForUser
|
from loops.organize.party import getPersonForUser
|
||||||
from loops import util
|
from loops import util
|
||||||
|
@ -50,3 +52,22 @@ class NotificationsListing(ConceptView):
|
||||||
def getNotifications(self, unreadOnly=True):
|
def getNotifications(self, unreadOnly=True):
|
||||||
tracks = self.notifications.listTracks()
|
tracks = self.notifications.listTracks()
|
||||||
return tracks
|
return tracks
|
||||||
|
|
||||||
|
def getNotificationsFormatted(self, unreadOnly=True):
|
||||||
|
result = []
|
||||||
|
for track in self.getNotifications(unreadOnly):
|
||||||
|
data = track.data
|
||||||
|
s = util.getObjectForUid(data.get('sender'))
|
||||||
|
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)))
|
||||||
|
read_ts = self.formatTimeStamp(data.get('read_ts'))
|
||||||
|
item = dict(timeStamp=self.formatTimeStamp(track.timeStamp),
|
||||||
|
sender=sender,
|
||||||
|
object=object,
|
||||||
|
text=data.get('text') or u'',
|
||||||
|
read_ts=read_ts)
|
||||||
|
result.append(item)
|
||||||
|
return result
|
||||||
|
|
|
@ -58,9 +58,16 @@
|
||||||
<th>Text</th>
|
<th>Text</th>
|
||||||
<th>Date/Time read</th>
|
<th>Date/Time read</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr tal:repeat="notif item/getNotifications">
|
<tr tal:repeat="notif item/getNotificationsFormatted">
|
||||||
<td colspan="5"
|
<td tal:content="notif/timeStamp" />
|
||||||
tal:content="notif" />
|
<td tal:define="sender notif/sender">
|
||||||
|
<a tal:attributes="href sender/url"
|
||||||
|
tal:content="sender/label" /></td>
|
||||||
|
<td tal:define="object notif/object">
|
||||||
|
<a tal:attributes="href object/url"
|
||||||
|
tal:content="object/label" /></td>
|
||||||
|
<td tal:content="notif/text" />
|
||||||
|
<td tal:content="notif/read_ts" />
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2014 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -153,6 +153,7 @@ class ChangeStateForm(ChangeStateBase, ObjectForm):
|
||||||
class ChangeState(ChangeStateBase, EditObject):
|
class ChangeState(ChangeStateBase, EditObject):
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
|
self.stateful.request = self.request
|
||||||
self.stateful.doTransition(self.action)
|
self.stateful.doTransition(self.action)
|
||||||
formData = self.request.form
|
formData = self.request.form
|
||||||
# store data in target object (unless field.nostore)
|
# store data in target object (unless field.nostore)
|
||||||
|
|
Loading…
Add table
Reference in a new issue