diff --git a/gen/calendar.py b/gen/calendar.py
index 348060e..08c1e50 100644
--- a/gen/calendar.py
+++ b/gen/calendar.py
@@ -17,7 +17,8 @@ class Calendar(Type):
specificWritePermission=False, width=None, height=300,
colspan=1, master=None, masterValue=None, focus=False,
mapping=None, label=None, maxEventLength=50,
- otherCalendars=None):
+ otherCalendars=None, startDate=None, endDate=None,
+ defaultDate=None):
Type.__init__(self, validator, (0,1), None, default, False, False,
show, page, group, layouts, move, False, False,
specificReadPermission, specificWritePermission,
@@ -51,6 +52,19 @@ class Calendar(Type):
# leading "#" when relevant) into which events of the calendar must
# appear.
self.otherCalendars = otherCalendars
+ # One may limit event encoding and viewing to a limited period of time,
+ # via p_startDate and p_endDate. Those parameters, if given, must hold
+ # methods accepting no arg and returning a Zope DateTime instance.
+ self.startDate = startDate
+ # Beware: specify an end date with an hour like
+ # DateTime('2012/10/13 23:59:59') to avoid surprises.
+ self.endDate = endDate
+ # If a default date is specified, it must be a method accepting no arg
+ # and returning a DateTime instance. As soon as the calendar is shown,
+ # the month where this date is included will be shown. If not default
+ # date is specified, it will be 'now' at the moment the calendar is
+ # shown.
+ self.defaultDate = defaultDate
def getSiblingMonth(self, month, prevNext):
'''Gets the next or previous month (depending of p_prevNext) relative
@@ -171,6 +185,22 @@ class Calendar(Type):
else:
return obj.translate('%s_event_%s' % (self.labelId, eventType))
+ def getStartDate(self, obj):
+ '''Get the start date for this calendar if defined.'''
+ if self.startDate: return self.startDate(obj.appy())
+
+ def getEndDate(self, obj):
+ '''Get the end date for this calendar if defined.'''
+ if self.endDate: return self.endDate(obj.appy())
+
+ def getDefaultDate(self, obj):
+ '''Get the default date that must appear as soon as the calendar is
+ shown.'''
+ if self.defaultDate:
+ return self.defaultDate(obj.appy())
+ else:
+ return DateTime() # Now
+
def createEvent(self, obj, date, handleEventSpan=True):
'''Create a new event in the calendar, at some p_date (day). If
p_handleEventSpan is True, we will use rq["eventSpan"] and also
diff --git a/gen/ui/widgets/calendar.pt b/gen/ui/widgets/calendar.pt
index 2138803..4935bf2 100644
--- a/gen/ui/widgets/calendar.pt
+++ b/gen/ui/widgets/calendar.pt
@@ -5,13 +5,16 @@
month request/month;
monthDayOne python: DateTime('%s/01' % month);
today python: DateTime('00:00');
- todayMonth python: today.strftime('%Y/%m');
+ defaultDate python: contextObj.callField(fieldName, 'getDefaultDate', contextObj);
+ defaultDateMonth python: defaultDate.strftime('%Y/%m');
grid python: contextObj.callField(fieldName, 'getMonthGrid', month);
previousMonth python: contextObj.callField(fieldName, 'getSiblingMonth', month, 'previous');
nextMonth python: contextObj.callField(fieldName, 'getSiblingMonth', month, 'next');
widget python: contextObj.getAppyType(fieldName, asDict=True);
mayEdit python: contextObj.allows(widget['writePermission']);
objUrl contextObj/absolute_url;
+ startDate python: contextObj.callField(fieldName, 'getStartDate', contextObj);
+ endDate python: contextObj.callField(fieldName, 'getEndDate', contextObj);
otherCalendars python: contextObj.callField(fieldName, 'getOtherCalendars', contextObj);"
tal:attributes="id ajaxHookId">
@@ -19,15 +22,25 @@
tal:content="python: 'var %s_maxEventLength = %d;' % (fieldName, widget['maxEventLength'])">