[silva.app.news][Emiliano D'Alterio] Changed date generation cod...
[email protected] Tue, 12 Nov 2013 19:36:46 +0100
| Newsgroups | gmane.comp.web.zope.silva.cvs |
|---|---|
| Message-ID | <[email protected]> |
author: Emiliano D'Alterio
date: Tue Nov 12 19:36:40 2013 +0100
revision: 2042:bd8300f53207 in silva.app.news
branch: 2.4
details: https://hg.infrae.com/silva.app.news?cmd=changeset;node=bd8300f53207
modified: src/silva/app/news/AgendaItem/views.py src/silva/app/news/AgendaItem/views_templates/agendaitemlistitemview.cpt src/silva/app/news/AgendaItem/views_templates/agendaitemview.cpt src/silva/app/news/NewsItem/views.py src/silva/app/news/interfaces.py src/silva/app/news/silvaxml/xmlexport.py src/silva/app/news/silvaxml/xmlimport.py src/silva/app/news/tests/data/test_export_agendafilter.silvaxml src/silva/app/news/tests/data/test_export_agendaitem.silvaxml src/silva/app/news/tests/data/test_export_agendaviewer.silvaxml src/silva/app/news/tests/data/test_export_newsfilter.silvaxml src/silva/app/news/tests/data/test_export_newsitem.silvaxml src/silva/app/news/tests/data/test_export_newsviewer.silvaxml src/silva/app/news/tests/data/test_export_newsviewer_external.silvaxml src/silva/app/n
ews/tests/data/test_import_newspublication.silvaxml src/silva/app/news/tests/test_feeds.py src/silva/app/news/tests/test_inline_news_viewer.py src/silva/app/news/viewers/AgendaViewer.py src/
silva/app/news/viewers/NewsViewer.py
added:
removed:
log: Changed date generation code for NewsItem and AgendaItem, now the
public display format uses dots and full month name localized
according to the request locale. Added option in the SMI settings
for NewsViewer to hide expired events (Agenda items), it's enabled
by default. Changed AgendaViewer to ignore this new option. Changed
NewsViewer so that it now ignores "number of days" limit when
retrieving Agenda items. Changed xmlimport and xmlexport code to
consider this new option for NewsViewer. Fixed tests and tests data.
diffstat:
src/silva/app/news/AgendaItem/views.py | 67 ++++++++-
src/silva/app/news/AgendaItem/views_templates/agendaitemlistitemview.cpt | 7 +
src/silva/app/news/AgendaItem/views_templates/agendaitemview.cpt | 7 +
src/silva/app/news/NewsItem/views.py | 21 ++-
src/silva/app/news/interfaces.py | 23 ++-
src/silva/app/news/silvaxml/xmlexport.py | 2 +
src/silva/app/news/silvaxml/xmlimport.py | 4 +-
src/silva/app/news/tests/data/test_export_agendafilter.silvaxml | 2 +-
src/silva/app/news/tests/data/test_export_agendaitem.silvaxml | 2 +-
src/silva/app/news/tests/data/test_export_agendaviewer.silvaxml | 2 +-
src/silva/app/news/tests/data/test_export_newsfilter.silvaxml | 2 +-
src/silva/app/news/tests/data/test_export_newsitem.silvaxml | 2 +-
src/silva/app/news/tests/data/test_export_newsviewer.silvaxml | 4 +-
src/silva/app/news/tests/data/test_export_newsviewer_external.silvaxml | 4 +-
src/silva/app/news/tests/data/test_import_newspublication.silvaxml | 2 +-
src/silva/app/news/tests/test_feeds.py | 1 +
src/silva/app/news/tests/test_inline_news_viewer.py | 1 +
src/silva/app/news/viewers/AgendaViewer.py | 8 +-
src/silva/app/news/viewers/NewsViewer.py | 69 ++++++++-
19 files changed, 184 insertions(+), 46 deletions(-)
diffs (674 lines):
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/AgendaItem/views.py
--- a/src/silva/app/news/AgendaItem/views.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/AgendaItem/views.py Tue Nov 12 19:36:40 2013 +0100
@@ -2,12 +2,14 @@
# Copyright (c) 2002-2013 Infrae. All rights reserved.
# See also LICENSE.txt
+import localdatetime
+
from icalendar import Calendar
from icalendar.interfaces import IEvent
# ztk
from five import grok
-from zope.component import getUtility, getMultiAdapter
+from zope.component import getMultiAdapter
from zope.component import queryMultiAdapter
from zope.cachedescriptors.property import Lazy
from zope.publisher.interfaces.browser import IBrowserRequest
@@ -18,9 +20,11 @@
from silva.app.document.interfaces import IDocumentDetails
# SilvaNews
-from ..interfaces import IServiceNews, INewsViewer
+from ..interfaces import INewsViewer
from ..interfaces import IAgendaItem, IAgendaItemContent
-from ..NewsItem.views import NewsItemBaseView, NewsItemView, NewsItemListItemView
+from ..NewsItem.views import (NewsItemBaseView,
+ NewsItemView, NewsItemListItemView)
+from ..datetimeutils import RRuleData
class AgendaItemBaseView(silvaviews.View):
@@ -29,14 +33,55 @@
grok.baseclass()
def occurrences(self):
- format = getUtility(IServiceNews).format_date
+ local_months = localdatetime.get_month_names(self.request)
+
for occurrence in self.content.get_occurrences():
timezone = occurrence.get_timezone()
- yield {'start': format(occurrence.get_start_datetime(timezone),
- occurrence.is_all_day()),
- 'end': format(occurrence.get_end_datetime(timezone),
- occurrence.is_all_day()),
- 'location': occurrence.get_location()}
+ location = occurrence.get_location()
+ display_time = not occurrence.is_all_day()
+
+ start = occurrence.get_start_datetime(timezone)
+ end = occurrence.get_end_datetime(timezone)
+ rec_til = occurrence.get_end_recurrence_datetime()
+
+ start_str = u'%s.%s.%s' % (start.day,
+ local_months[start.month-1],
+ start.year)
+
+ end_str = u'%s.%s.%s' % (end.day,
+ local_months[end.month-1],
+ end.year)
+
+ if display_time:
+ start_str = u'%s, %s:%s' % (start_str,
+ '%02d' % (start.hour),
+ '%02d' % (start.minute))
+ end_str = u'%s, %s:%s' % (end_str,
+ '%02d' % (end.hour),
+ '%02d' % (end.minute))
+
+ odi = {
+ 'start': start_str,
+ 'end': end_str,
+ 'location': location,
+ 'recurrence_until': rec_til,
+ }
+
+ if rec_til:
+ rec_til_str = u'%s.%s.%s' % (rec_til.day,
+ local_months[rec_til.month-1],
+ rec_til.year)
+
+ if display_time:
+ rec_til_str = u'%s, %s:%s' % (rec_til_str,
+ '%02d' % (rec_til.hour),
+ '%02d' % (rec_til.minute))
+
+ odi['recurrence_until'] = rec_til_str
+ recurrence = RRuleData(occurrence.get_recurrence()).get('FREQ')
+ odi['recurrence'] = recurrence
+
+ yield odi
class AgendaItemView(NewsItemView, AgendaItemBaseView):
@@ -45,7 +90,6 @@
grok.context(IAgendaItem)
-
class AgendaItemListItemView(NewsItemListItemView, AgendaItemBaseView):
""" Render as a list items (search results)
"""
@@ -60,7 +104,8 @@
@Lazy
def details(self):
- return queryMultiAdapter((self.content, self.request), IDocumentDetails)
+ return queryMultiAdapter(
+ (self.content, self.request), IDocumentDetails)
def render(self):
if self.details:
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/AgendaItem/views_templates/agendaitemlistitemview.cpt
--- a/src/silva/app/news/AgendaItem/views_templates/agendaitemlistitemview.cpt Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/AgendaItem/views_templates/agendaitemlistitemview.cpt Tue Nov 12 19:36:40 2013 +0100
@@ -21,6 +21,7 @@
<span class="value" tal:content="view.publication_date" />
</div>
<div class="occurrence" tal:repeat="occurrence view.occurrences()">
+ <br />
<div class="location" tal:condition="occurrence.location">
<span class="label" i18n:translate="">Location: </span>
<span class="value" tal:content="occurrence.location" />
@@ -33,6 +34,12 @@
<span class="label" i18n:translate="">End: </span>
<span class="value" tal:content="occurrence.end" />
</div>
+ <div class="recurrence" tal:condition="occurrence.recurrence_until">
+ <span class="label" i18n:translate="">Repeated </span>
+ <span class="value" tal:content="occurrence.recurrence" />
+ <span class="label" i18n:translate="">until </span>
+ <span class="value" tal:content="occurrence.recurrence_until" />
+ </div>
</div>
</div>
<div class="newsintro"
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/AgendaItem/views_templates/agendaitemview.cpt
--- a/src/silva/app/news/AgendaItem/views_templates/agendaitemview.cpt Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/AgendaItem/views_templates/agendaitemview.cpt Tue Nov 12 19:36:40 2013 +0100
@@ -21,6 +21,7 @@
<span class="value" tal:content="view.publication_date" />
</div>
<div class="occurrence" tal:repeat="occurrence view.occurrences()">
+ <br />
<div class="location" tal:condition="occurrence.location">
<span class="label" i18n:translate="">Location: </span>
<span class="value" tal:content="occurrence.location" />
@@ -33,6 +34,12 @@
<span class="label" i18n:translate="">End: </span>
<span class="value" tal:content="occurrence.end" />
</div>
+ <div class="recurrence" tal:condition="occurrence.recurrence_until">
+ <span class="label" i18n:translate="">Repeated </span>
+ <span class="value" tal:content="occurrence.recurrence" />
+ <span class="label" i18n:translate="">until </span>
+ <span class="value" tal:content="occurrence.recurrence_until" />
+ </div>
</div>
</div>
<div class="newsitemcontent" tal:content="structure view.document" />
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/NewsItem/views.py
--- a/src/silva/app/news/NewsItem/views.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/NewsItem/views.py Tue Nov 12 19:36:40 2013 +0100
@@ -2,11 +2,14 @@
# Copyright (c) 2002-2013 Infrae. All rights reserved.
# See also LICENSE.txt
+import localdatetime
+
+from datetime import datetime
from five import grok
from zope.component import getUtility, queryMultiAdapter
from zope.cachedescriptors.property import Lazy
-from ..interfaces import IServiceNews, INewsItem, INewsItemContent
+from ..interfaces import INewsItem, INewsItemContent
from silva.app.document.interfaces import IDocumentDetails
from silva.core.views import views as silvaviews
@@ -27,14 +30,20 @@
def publication_date(self):
date = self.content.get_display_datetime()
if not date:
- date = getUtility(IMetadataService).getMetadataValue(
+ date = getUtility(IMetadataService).getMetadataValue(
self.content, 'silva-extra', 'publicationtime')
if date:
- return getUtility(IServiceNews).format_date(date)
+ if not isinstance(date, datetime):
+ date = date.asdatetime()
+ local_months = localdatetime.get_month_names(self.request)
+ return u'%s.%s.%s, %s:%s' % (date.day,
+ local_months[date.month-1],
+ date.year,
+ '%02d' % (date.hour),
+ '%02d' % (date.minute))
return u''
-
class NewsItemView(NewsItemBaseView):
"""Base view for an agenda item.
"""
@@ -55,5 +64,5 @@
@Lazy
def details(self):
- return queryMultiAdapter((self.content, self.request), IDocumentDetails)
-
+ return queryMultiAdapter(
+ (self.content, self.request), IDocumentDetails)
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/interfaces.py
--- a/src/silva/app/news/interfaces.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/interfaces.py Tue Nov 12 19:36:40 2013 +0100
@@ -251,7 +251,7 @@
# and viewers, so the viewers can pull from both types of filters
def get_items_by_date(
- month, year, timezone=local_timezone, meta_types=None):
+ month, year, timezone=local_timezone, meta_types=None):
"""For looking through the archives
This is different because AgendaFilters search on start/end
datetime, whereas NewsFilters look at display datetime
@@ -292,7 +292,6 @@
"""Returns all items, only to be used on the back-end"""
-
class IAgendaFilter(INewsItemFilter):
"""Filter for agenda items
"""
@@ -350,6 +349,7 @@
(_(u'Sunday'), 6)
]
+
@grok.provider(IContextSourceBinder)
def week_days_source(context):
week_days_terms = []
@@ -359,6 +359,7 @@
SimpleTerm(value=value, token=value, title=title))
return SimpleVocabulary(week_days_terms)
+
@grok.provider(IContextSourceBinder)
def timezone_source(context):
terms = []
@@ -368,6 +369,7 @@
token=zone))
return SimpleVocabulary(terms)
+
def get_default_tz_name(form):
util = getUtility(IServiceNews)
return util.get_timezone_name()
@@ -383,13 +385,14 @@
for filter in get_filters(require):
path = "/".join(filter.getPhysicalPath())
terms.append(SimpleTerm(
- value=filter,
- title="%s (%s)" % (filter.get_title(), path),
- token=str(get_token(filter))))
+ value=filter,
+ title="%s (%s)" % (filter.get_title(), path),
+ token=str(get_token(filter))))
return SimpleVocabulary(terms)
return filters_source
+
@grok.provider(IContextSourceBinder)
def news_source(context):
terms = []
@@ -419,6 +422,10 @@
"""If set to True, the number to show will be by days back, not number.
"""
+ def set_hide_expired_events(onoff):
+ """If set to True, the expired events will not be displayed.
+ """
+
# accessors
def get_number_to_show():
"""Amount of news items to show.
@@ -433,6 +440,10 @@
days back to show instead of number of items.
"""
+ def get_hide_expired_events():
+ """Whether expired events have to be displayed or not.
+ """
+
def get_filters():
"""Returns a list of associated filters.
"""
@@ -463,7 +474,6 @@
"""
-
class IServiceNewsCategorization(ISilvaService):
"""Defines subjects and target audiences.
"""
@@ -522,6 +532,7 @@
"""Return all sources for News Item, global, or below the given item.
"""
+
class INewsItemReference(Interface):
"""Generic abstraction on top of news and agenda items, used
mostly with the code source inline news viewer.
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/silvaxml/xmlexport.py
--- a/src/silva/app/news/silvaxml/xmlexport.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/silvaxml/xmlexport.py Tue Nov 12 19:36:40 2013 +0100
@@ -132,6 +132,8 @@
'number_to_show': str(self.context.get_number_to_show()),
'number_to_show_archive': str(
self.context.get_number_to_show_archive()),
+ 'hide_expired_events': str(
+ self.context.get_hide_expired_events()),
'number_is_days': str(self.context.get_number_is_days())})
self.sax_metadata()
self.startElement('content')
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/silvaxml/xmlimport.py
--- a/src/silva/app/news/silvaxml/xmlimport.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/silvaxml/xmlimport.py Tue Nov 12 19:36:40 2013 +0100
@@ -167,6 +167,7 @@
viewer = self.result()
helpers.set_as_list(viewer, 'target_audiences', attrs)
helpers.set_as_list(viewer, 'subjects', attrs)
+ helpers.set_as_bool(viewer, 'hide_expired_events', attrs)
helpers.set_as_bool(viewer, 'number_is_days', attrs)
helpers.set_as_int(viewer, 'number_to_show', attrs)
helpers.set_as_int(viewer, 'number_to_show_archive', attrs)
@@ -260,7 +261,7 @@
if name == (NS_NEWS_URI, 'rss_aggregator'):
uid = self.generateIdentifier(attrs)
factory = self.parent().manage_addProduct['silva.app.news']
- factory.manage_addRSSAggregator(uid,'')
+ factory.manage_addRSSAggregator(uid, '')
self.setResultId(uid)
self.urls = []
@@ -280,4 +281,3 @@
aggregator = self.result()
aggregator.set_feeds(self.urls)
self.notifyImport()
-
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_agendafilter.silvaxml
--- a/src/silva/app/news/tests/data/test_export_agendafilter.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_agendafilter.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -58,7 +58,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_agendaitem.silvaxml
--- a/src/silva/app/news/tests/data/test_export_agendaitem.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_agendaitem.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -64,7 +64,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_agendaviewer.silvaxml
--- a/src/silva/app/news/tests/data/test_export_agendaviewer.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_agendaviewer.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -94,7 +94,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_newsfilter.silvaxml
--- a/src/silva/app/news/tests/data/test_export_newsfilter.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_newsfilter.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -63,7 +63,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_newsitem.silvaxml
--- a/src/silva/app/news/tests/data/test_export_newsitem.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_newsitem.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -66,7 +66,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_newsviewer.silvaxml
--- a/src/silva/app/news/tests/data/test_export_newsviewer.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_newsviewer.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -62,7 +62,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
@@ -165,7 +165,7 @@
</silva-app-news:news_filter>
</content>
</silva-app-news:news_publication>
- <silva-app-news:news_viewer id="viewer" number_is_days="True" number_to_show="10" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="viewer" number_is_days="True" number_to_show="10" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>News Viewer</silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_export_newsviewer_external.silvaxml
--- a/src/silva/app/news/tests/data/test_export_newsviewer_external.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_export_newsviewer_external.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -62,7 +62,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>
@@ -165,7 +165,7 @@
</silva-app-news:news_filter>
</content>
</silva-app-news:news_publication>
- <silva-app-news:news_viewer id="viewer" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="True" id="viewer" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>News Viewer</silva-content:maintitle>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/data/test_import_newspublication.silvaxml
--- a/src/silva/app/news/tests/data/test_import_newspublication.silvaxml Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/data/test_import_newspublication.silvaxml Tue Nov 12 19:36:40 2013 +0100
@@ -22,7 +22,7 @@
</metadata>
<content>
<default>
- <silva-app-news:news_viewer id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
+ <silva-app-news:news_viewer hide_expired_events="False" id="index" number_is_days="False" number_to_show="25" number_to_show_archive="10">
<metadata>
<set id="silva-content">
<silva-content:maintitle>News</silva-content:maintitle><silva-content:shorttitle/>
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/test_feeds.py
--- a/src/silva/app/news/tests/test_feeds.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/test_feeds.py Tue Nov 12 19:36:40 2013 +0100
@@ -33,6 +33,7 @@
self.root.filter.set_show_agenda_items(True)
self.root.filter.add_source(self.root.source)
self.root.viewer.add_filter(self.root.filter)
+ self.root.viewer.set_hide_expired_events(False)
# Items
self.add_published_news_item(
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/tests/test_inline_news_viewer.py
--- a/src/silva/app/news/tests/test_inline_news_viewer.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/tests/test_inline_news_viewer.py Tue Nov 12 19:36:40 2013 +0100
@@ -37,6 +37,7 @@
factory.manage_addNewsItem('testing', 'Testing of a code source')
factory.manage_addAgendaItem('debugging', 'Debugging of a code source')
self.root.news.filter.set_show_agenda_items(True)
+ self.root.news.index.set_hide_expired_events(False)
timezone = self.root.news.index.default_timezone()
version = self.root.news.debugging.get_editable()
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/viewers/AgendaViewer.py
--- a/src/silva/app/news/viewers/AgendaViewer.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/viewers/AgendaViewer.py Tue Nov 12 19:36:40 2013 +0100
@@ -60,6 +60,7 @@
silvaconf.icon("www/agenda_viewer.png")
silvaconf.priority(3.3)
+ _hide_expired_events=False
_number_is_days = True
_number_to_show = 31
@@ -79,7 +80,7 @@
grok.context(IAgendaViewer)
grok.name(u"Silva Agenda Viewer")
- fields = silvaforms.Fields(ITitledContent, INewsViewerFields)
+ fields = silvaforms.Fields(ITitledContent, INewsViewerFields).omit('hide_expired_events')
fields['number_is_days'].mode = u'radio'
fields['timezone_name'].defaultValue = get_default_tz_name
fields['filters'].valueField.source = make_filters_source(IAgendaFilter)
@@ -90,7 +91,7 @@
"""
grok.context(IAgendaViewer)
- fields = silvaforms.Fields(ITitledContent, INewsViewerFields).omit('id')
+ fields = silvaforms.Fields(ITitledContent, INewsViewerFields).omit('id', 'hide_expired_events')
fields['number_is_days'].mode = u'radio'
fields['timezone_name'].defaultValue = get_default_tz_name
fields['filters'].valueField.source = make_filters_source(IAgendaFilter)
@@ -315,7 +316,7 @@
def render_calendar(self):
return self.calendar.formatmonth(
self.selected_year, self.selected_month)
-
+
def should_display_next_link(self):
inc, month = divmod(self.start.month, 12)
year = self.start.year + inc
@@ -401,4 +402,3 @@
def calendar_url(self):
return "%s/calendar.ics" % absoluteURL(self.context, self.request)
-
diff -r 3dc291ece8eb -r bd8300f53207 src/silva/app/news/viewers/NewsViewer.py
--- a/src/silva/app/news/viewers/NewsViewer.py Fri Nov 08 16:38:46 2013 +0100
+++ b/src/silva/app/news/viewers/NewsViewer.py Tue Nov 12 19:36:40 2013 +0100
@@ -16,6 +16,7 @@
from AccessControl import ClassSecurityInfo
from App.class_init import InitializeClass
from OFS.SimpleItem import SimpleItem
+from DateTime import DateTime
# Silva
from Products.Silva import SilvaPermissions
@@ -30,8 +31,8 @@
# SilvaNews
from silva.app.news.interfaces import get_default_tz_name, timezone_source
-from silva.app.news.interfaces import (INewsViewer, IServiceNews,
- show_source, week_days_source, make_filters_source)
+from silva.app.news.interfaces import (INewsViewer, IServiceNews, show_source,
+ week_days_source, make_filters_source)
from silva.app.news.ServiceNews import TimezoneMixin
@@ -58,6 +59,7 @@
_number_to_show = 25
_number_to_show_archive = 10
_number_is_days = False
+ _hide_expired_events = True
security = ClassSecurityInfo()
@@ -90,7 +92,8 @@
return self._number_to_show
security.declareProtected(
- SilvaPermissions.AccessContentsInformation, 'get_number_to_show_archive')
+ SilvaPermissions.AccessContentsInformation,
+ 'get_number_to_show_archive')
def get_number_to_show_archive(self):
"""returns the number of items to show per page in the archive"""
return self._number_to_show_archive
@@ -104,6 +107,13 @@
"""
return self._number_is_days
+ security.declareProtected(
+ SilvaPermissions.AccessContentsInformation, 'get_hide_expired_events')
+ def get_hide_expired_events(self):
+ """Returns whether expired events have to be displayed or not.
+ """
+ return self._hide_expired_events
+
def _get_filters_reference_set(self):
if hasattr(self, '_v_filter_reference_set'):
refset = getattr(self, '_v_filter_reference_set', None)
@@ -156,12 +166,44 @@
security.declareProtected(
SilvaPermissions.AccessContentsInformation, 'get_items')
- def get_items(self):
+ def get_items(self, days_limit_for_events=True):
"""Gets the items from the filters
"""
+ ## We fetch all the NEWS ITEMS limited by number of items
+ ## or by days limit (filtered on display_datetime).
results = self._get_items(lambda x: x.get_last_items(
- self._number_to_show, self._number_is_days))
+ self._number_to_show, self._number_is_days,
+ 'Silva News Item Version'))
+ now = DateTime()
+ days_delta = 9999 # About 28 years.
+ if not self._hide_expired_events:
+ start = now - days_delta
+ until = now + days_delta
+ ## We fetch all the AGENDA ITEMS expired or not.
+ agenda_items = self._get_items(lambda x: x.get_items_by_date_range(
+ start, until, 'Silva Agenda Item Version'))
+ else:
+ ## We fetch all the AGENDA ITEMS that are NOT expired
+ ## this takes into account end datetime
+ ## and recurrence end datetime.
+ agenda_items = self._get_items(lambda x: x.get_next_items(
+ days_delta, 'Silva Agenda Item Version'))
+
+ if agenda_items:
+ if days_limit_for_events and self._number_is_days:
+ ## If days limit is valid also for the AGENDA ITEMS...
+ past_limit = (now.earliestTime() - self._number_to_show)
+ ## We filter the AGENDA ITEMS on the display_datetime too
+ ## as for the NEWS ITEMS.
+ agenda_items = [item for item in agenda_items
+ if past_limit <= item.display_datetime <= now]
+
+ results = results + agenda_items
+ results.sort(key=operator.attrgetter('sort_index'), reverse=True)
+
+ ## The limit on the number of items is applied for both
+ ## the NEWS ITEMS and the AGENDA ITEMS.
if not self._number_is_days:
return results[:self._number_to_show]
@@ -173,7 +215,7 @@
"""Gets the items from the filters
"""
return self._get_items(lambda x: x.get_items_by_date(
- month,year, timezone=self.get_timezone()))
+ month, year, timezone=self.get_timezone()))
security.declareProtected(
SilvaPermissions.AccessContentsInformation, 'get_items_by_date_range')
@@ -212,6 +254,13 @@
self._number_is_days = bool(onoff)
security.declareProtected(
+ SilvaPermissions.ChangeSilvaContent, 'set_hide_expired_events')
+ def set_hide_expired_events(self, onoff):
+ """Sets whether expired events should be displayed or not.
+ """
+ self._hide_expired_events = bool(onoff)
+
+ security.declareProtected(
SilvaPermissions.ChangeSilvaContent, 'set_filters')
def set_filters(self, filters):
"""update filters
@@ -243,6 +292,12 @@
title=_(u"filters"),
description=_(u"Use predefined filters."))
+ hide_expired_events = schema.Bool(
+ title=_(u"hide expired events"),
+ description=_(u'''Whether expired events (Agenda items)
+ have to be displayed or not.'''),
+ default=1)
+
number_is_days = schema.Choice(
source=show_source,
title=_(u"show"),
@@ -307,7 +362,7 @@
if self.query:
brains = self.context.search_items(self.query)
else:
- brains = self.context.get_items()
+ brains = self.context.get_items(days_limit_for_events=False)
self.items = map(lambda b: b.getObject().get_content(), brains)