From dc61db21a270750a51be9cd8c75dd1182c42810f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 21 Nov 2011 14:43:31 +0100 Subject: [PATCH] get all list of events to get next/prev event in the right order (#968) --- tabellio/agenda/event.py | 79 ++++++++++++++++++++++-------------- tabellio/agenda/parlevent.py | 36 ++++------------ tabellio/agenda/utils.py | 6 ++- 3 files changed, 62 insertions(+), 59 deletions(-) diff --git a/tabellio/agenda/event.py b/tabellio/agenda/event.py index f5d6bc8..e801a14 100644 --- a/tabellio/agenda/event.py +++ b/tabellio/agenda/event.py @@ -14,6 +14,8 @@ from plone.dexterity.content import Item from tabellio.agenda.interfaces import MessageFactory as _ +from utils import MonthlyView + class IBaseEvent(form.Schema): title = schema.TextLine(title=_(u'Title')) @@ -69,40 +71,57 @@ class Event(BaseEvent): def klass(self): return 'generic-event' +class EventBaseView: + def next_event_url(self, portal_type=None): + catalog = getToolByName(self.context, 'portal_catalog') -class View(grok.View): + # do not go more than 100 days in the future + end = self.context.start + datetime.timedelta(100) + start = self.context.start + + if portal_type is None: + portal_type = ('tabellio.agenda.parlevent', 'tabellio.agenda.comevent') + + monthly_view = MonthlyView(self.context, init_calendar=True) + serie_of_events = monthly_view.get_events_from_catalog( + start, end, portal_type=portal_type) + for i, event in enumerate(serie_of_events): + event_id = ((type(event.getId) is str) and event.getId or event.getId()) + if event_id == self.context.id: + try: + return serie_of_events[i+1].getURL() + except IndexError: + return None + return None + + def previous_event_url(self, portal_type=None): + catalog = getToolByName(self.context, 'portal_catalog') + + end = self.context.start + # do not go back more than 100 days in the past + start = self.context.start - datetime.timedelta(100) + + if portal_type is None: + portal_type = ('tabellio.agenda.event', 'tabellio.agenda.parlevent', 'tabellio.agenda.comevent') + + monthly_view = MonthlyView(self.context, init_calendar=True) + serie_of_events = monthly_view.get_events_from_catalog( + start, end, portal_type=portal_type) + for i, event in enumerate(serie_of_events): + event_id = ((type(event.getId) is str) and event.getId or event.getId()) + if event_id == self.context.id: + if i == 0: + return None + return serie_of_events[i-1].getURL() + return None + + +class View(grok.View, EventBaseView): grok.context(IEvent) grok.require('zope2.View') def next_event_url(self): - catalog = getToolByName(self.context, 'portal_catalog') - # do not go more than 100 days in the future - end = self.context.start + datetime.timedelta(100) - start = self.context.start - r = catalog( - portal_type=['tabellio.agenda.parlevent', - 'tabellio.agenda.comevent', - 'tabellio.agenda.event'], - start={'query': start, 'range': 'min'}, - end={'query': end, 'range': 'max'}, - sort_on='start') - if len(r) < 2: # r[0] will be the current event - return '' - return r[1].getURL() + return EventBaseView.next_event_url(self) def previous_event_url(self): - catalog = getToolByName(self.context, 'portal_catalog') - end = self.context.start - # do not go back more than 100 days in the past - start = self.context.start - datetime.timedelta(100) - r = catalog( - portal_type=['tabellio.agenda.parlevent', - 'tabellio.agenda.comevent', - 'tabellio.agenda.event'], - start={'query': start, 'range': 'min'}, - end={'query': end, 'range': 'max'}, - sort_on='start') - if len(r) == 0: - return '' - return r[-1].getURL() - + return EventBaseView.previous_event_url(self) diff --git a/tabellio/agenda/parlevent.py b/tabellio/agenda/parlevent.py index 99a67cb..e2be48a 100644 --- a/tabellio/agenda/parlevent.py +++ b/tabellio/agenda/parlevent.py @@ -13,7 +13,7 @@ from plone.app.textfield import RichText from themis.datatypes.commission import ICommission from tabellio.agenda.interfaces import MessageFactory as _ -from event import IBaseEvent, BaseEvent +from event import IBaseEvent, BaseEvent, EventBaseView class IParlEvent(IBaseEvent): @@ -31,36 +31,16 @@ class ParlEvent(BaseEvent): return 'parlementary-event' -class ParlEventBaseView: +class ParlEventBaseView(EventBaseView): def next_event_url(self): - catalog = getToolByName(self.context, 'portal_catalog') - # do not go more than 100 days in the future - end = self.context.start + datetime.timedelta(100) - start = self.context.start - r = catalog( - portal_type=['tabellio.agenda.parlevent', - 'tabellio.agenda.comevent'], - start={'query': start, 'range': 'min'}, - end={'query': end, 'range': 'max'}, - sort_on='start') - if len(r) < 2: # r[0] will be the current event - return '' - return r[1].getURL() + return EventBaseView.next_event_url(self, + portal_type=('tabellio.agenda.parlevent', + 'tabellio.agenda.comevent')) def previous_event_url(self): - catalog = getToolByName(self.context, 'portal_catalog') - end = self.context.start - # do not go back more than 100 days in the past - start = self.context.start - datetime.timedelta(100) - r = catalog( - portal_type=['tabellio.agenda.parlevent', - 'tabellio.agenda.comevent'], - start={'query': start, 'range': 'min'}, - end={'query': end, 'range': 'max'}, - sort_on='start') - if len(r) == 0: - return '' - return r[-1].getURL() + return EventBaseView.previous_event_url(self, + portal_type=('tabellio.agenda.parlevent', + 'tabellio.agenda.comevent')) def has_stream(self): # XXX diff --git a/tabellio/agenda/utils.py b/tabellio/agenda/utils.py index e986687..1eba90d 100644 --- a/tabellio/agenda/utils.py +++ b/tabellio/agenda/utils.py @@ -13,9 +13,11 @@ PLMF = MessageFactory('plonelocales') class MonthlyView: updated = False - def __init__(self, context): + def __init__(self, context, init_calendar=False): self.context = context self.updated = False + if init_calendar: + self.calendar = getToolByName(context, 'portal_calendar') def update(self): if self.updated: @@ -49,6 +51,8 @@ class MonthlyView: catalog = getToolByName(self.context, 'portal_catalog') def cmp_event(x, y): + if x.start == y.start: + return cmp(x.id, y.id) return cmp(x.start, y.start) rs = []