This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.agenda/tabellio/agenda/event.py

128 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
import datetime
from five import grok
from zope import schema
from zope.interface import implements
from Products.Five.browser import BrowserView
from Products.CMFCore.utils import getToolByName
from zope.i18n.locales import locales
from plone.directives import form, dexterity
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'))
description = schema.Text(title=_(u'Description'), required=False)
place = schema.TextLine(title=_(u'Place'))
start = schema.Datetime(title=_(u'Start'))
end = schema.Datetime(title=_(u'End'))
class IEvent(IBaseEvent):
pass
class BaseEvent(Item):
def longdatetime(self):
# unfortunately this forces the locale
formatter = locales.getLocale('fr').dates.getFormatter('dateTime', 'medium')
formatter.setPattern(u'EEEE d MMMM yyyy à HH:mm')
return formatter.format(self.start)
longdatetime = property(longdatetime)
def shortdatetime(self):
# unfortunately this forces the locale
formatter = locales.getLocale('fr').dates.getFormatter('dateTime', 'medium')
formatter.setPattern(u'd MMMM yyyy')
return formatter.format(self.start)
shortdatetime = property(shortdatetime)
def start_month(self):
formatter = locales.getLocale('fr').dates.getFormatter('dateTime', 'medium')
formatter.setPattern(u'MMMM')
return formatter.format(self.start)
def start_hour(self):
if self.start.hour == 0 and self.start.minute == 0:
return ''
return '%dh%02d' % (self.start.hour, self.start.minute)
def end_hour(self):
return '%dh%02d' % (self.end.hour, self.end.minute)
def listen_url(self):
return '#'
class Event(BaseEvent):
implements(IEvent)
def klass(self):
return 'generic-event'
class EventBaseView:
def next_event_url(self, portal_type=None):
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
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):
return EventBaseView.next_event_url(self)
def previous_event_url(self):
return EventBaseView.previous_event_url(self)