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/folder.py

163 lines
5.7 KiB
Python

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.schema.interfaces import IVocabularyFactory
from zope.schema.vocabulary import SimpleVocabulary
from plone.directives import form, dexterity
from plone.dexterity.content import Container
from tabellio.agenda.interfaces import MessageFactory as _
import tabellio.config.utils
import utils
class AgendaModeVocabulary(object):
grok.implements(IVocabularyFactory)
def __call__(self, context):
values = [('month', _(u'Month')), ('list', _(u'List')), ('seances', _(u'Seances'))]
terms = []
for key, value in values:
terms.append(SimpleVocabulary.createTerm(key, key, value))
return SimpleVocabulary(terms)
grok.global_utility(AgendaModeVocabulary, name=u'tabellio.agenda.agendaModes')
class AgendaSelectorVocabulary(object):
grok.implements(IVocabularyFactory)
def __call__(self, context):
values = [('all', _(u'All events')),
('parlevent', _(u'Parlementary Events')),
('comevent', _(u'Commission Events')),
('parlcomevent', _(u'Parlmentary and Commission Events')),
('genevent', _(u'General Events'))]
terms = []
for key, value in values:
terms.append(SimpleVocabulary.createTerm(key, key, value))
return SimpleVocabulary(terms)
grok.global_utility(AgendaSelectorVocabulary, name=u'tabellio.agenda.agendaSelector')
class IAgendaFolder(form.Schema):
title = schema.TextLine(title=_(u'Title'))
mode = schema.Choice(title=_(u'Mode'),
vocabulary='tabellio.agenda.agendaModes')
selector = schema.Choice(title=_(u'Event Selector'), default=u'all',
vocabulary='tabellio.agenda.agendaSelector')
view_switcher = schema.Bool(title=_(u'Show view switcher'), default=False)
class AgendaFolder(Container):
implements(IAgendaFolder)
class View(grok.View, utils.MonthlyView):
grok.context(IAgendaFolder)
grok.require('zope2.View')
viewname = ''
def has_view_switcher(self):
return self.context.view_switcher == True
def as_list(self):
return self.context.mode == 'list'
def as_month(self):
return self.context.mode == 'month'
def as_seances(self):
return self.context.mode == 'seances'
def update(self):
utils.MonthlyView.update(self)
return self.updated
def getYearAndMonthToDisplay(self):
year = self.request.form.get('navyear') or self.now[0]
month = self.request.form.get('navmonth') or self.now[1]
year, month = int(year), int(month)
return year, month
def shown_events(self):
if self.context.selector == 'parlevent':
return ['parl']
elif self.context.selector == 'comevent':
return ['com']
elif self.context.selector == 'genevent':
return ['gen']
elif self.context.selector == 'parlcomevent':
return ['parl', 'com']
else:
return ['parl', 'com', 'gen']
def get_events_from_catalog(self, start, end, **keywords):
if self.context.selector == 'parlevent':
portal_type = ['tabellio.agenda.parlevent']
elif self.context.selector == 'comevent':
portal_type = ['tabellio.agenda.comevent']
elif self.context.selector == 'genevent':
portal_type = ['tabellio.agenda.event']
elif self.context.selector == 'parlcomevent':
portal_type = ['tabellio.agenda.parlevent', 'tabellio.agenda.comevent']
else:
portal_type = ['tabellio.agenda.event', 'tabellio.agenda.parlevent',
'tabellio.agenda.comevent']
return utils.MonthlyView.get_events_from_catalog(self, start, end,
portal_type=portal_type, **keywords)
def getMonthEvents(self):
year, month = self.getYearAndMonthToDisplay()
last_day = self.calendar._getCalendar().monthrange(year, month)[1]
first_date = self.calendar.getBeginAndEndTimes(1, month, year)[0]
last_date = self.calendar.getBeginAndEndTimes(last_day, month, year)[1]
brains = self.get_events_from_catalog(last_date, first_date, sort_on='start')
return [x.getObject() for x in brains]
def getMonthEventsWithRepetition(self):
events = self.getMonthEvents()
for event in events[:]:
if not event.multidays():
continue
repeated = event.end.toordinal()-event.start.toordinal()
for i in range(repeated):
# duplicate event with minimal infos
new_event = event.__class__()
new_event.id = event.id
new_event.title = event.title
new_event.place = event.place
new_event.description = event.description
new_event.start = event.start+datetime.timedelta(i+1)
new_event.end = event.end
# it's kind of ugly but this is definitely the easiest way to
# get the item pointing to the right URL
new_event.absolute_url = event.absolute_url()
events.append(new_event)
events.sort(lambda x,y: cmp(x.start, y.start))
return events
def todayanchor(self):
return 'd%d-%d-%d' % datetime.datetime.today().timetuple()[:3]
class List(View):
grok.context(IAgendaFolder)
grok.require('zope2.View')
grok.template('view')
viewname = 'list'
def as_list(self):
return True
def as_month(self):
return False
def as_seances(self):
return False