Architectural Overview

Design goals

The development of was done with following design goals in mind:

[a] Encapsulation and independence: All event related code should reside in a seperate package (splitted into other packages, where appropriate). Plone should be least dependend on Best would be that one can deinstall this feature completly.

[b] Dexterity support: should provide Dexterity behaviors, which can be used in Dexterity type.

[c] Standards compliancy: the iCalendar / RFC5545 standard is wonderful flexible, so should provide support for it by allowing ical exports. This is also available for the current ATContentType based implementation, but aims to improve it. A future goal is to support CalDAV also.

[d] Recurring events support based on the RFC5545 standard.

[e] A modern dateinput widget.

[f] Features like whole-day-events.

[g] Timezone support.

Encapsulation and independence: provides the Dexterity behaviors. The calendar and event portlets were moved from into, where they belong semantically - thus improving encapsulation and independence and reducing interwoven dependencies. The calendar portlet was completly refactored. The functionality of the CalendarTool (portal_calendar) was reimplenented. Important settings from the calendar-controlpanel are now available in the event configlet. Since the calendar portlet was the only consumer of the CalendarTool, the CalendarTool, the calendar controlpanel and the dependency to Products.CMFCalendar can be dropped. The new package implements z3cform based widgets, so the old datetime widget can be dropped. Python-dateutil provides recurrence calculations based on the RFC5545 standard - plone.formwidget.recurrence provides a awidget for recurrence and Products.DateRecurringIndex an appropriate index as a drop-in replacement for Zope’s DateIndex. The iCalendar package was improved and is now used for to provide icalendar serialization. The timezone support is based on the pytz package. Plone now haves a portal timezone, User timezones and every event can define another timezone, if wished. User timezones are planned. Whole day events get their starttime set to 0:00 and endtime set to 23:59:59 - thats should be feasable in most cases (excluding any scientific events…).



The “dx” submodule provides Dexterity behaviors (some granular ones). Like in the “at” submodule, ical, recurrence and generic event accessor adapters as well as some event subscribers are provided.

Both subpackages are only loaded, if the neccassary features are installed. does not depend on CMFCalendar and the portal_calendar tool any more. Plone core’s only consumer of this package was the calendar portlet anyways, which was completly rewritten. provides some basic event related functionality. Many of them need a context in order to get the correct timezone.

The “browser” submodule provides the new “event” controlpanel (the “calendar” controlpanel can be dropped, since we do not need CMFCalendar any more). The settings are stored in plone.registry. The event view is generic to ATEvent and DX based event types.

The ical submodule provides adapters and views for export and import to and from icalendar resources.

The locales directory which holds locale files.

In the portlets subpackage there are portlet_calendar (a complete rewrite) and portlet_events, both from, where only BBB imports exist, so that existing installations do not break.

The tests are all ported to



Date/time related utilities, recurrence calculations based on python-dateutil.



Recurrence widget based on jquery.recurrenceinput.js. Supports complex recurrence rules with exclusion and inclusion dates, automatically updated occurrences display within the widget and a nicely formatted string which explains the recurrence rule. The recurrence rule is stored as a RFC5545/icalendar compatible recurrence string.



A drop-in replacement for Zope’s DateIndex with support for recurring events. Each recurrence get’s an index entry.



icalendar parser/generator framework.

Other, external packages


A possible alternative to Products.DateRecurringindex, which supports late indexing and which does not have problems with unlimited occurrences. This eventindex is currently not used by


Documentation: Repository:

Useful extensions to the standard Python datetime features. uses it mainly for recurrence calculations.


Documentation: Pypi page:

World timezone definitions, modern and historical. Based on the Olson database.