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'])"> Month chooser -
- + Go to the previous month + - - Go back to the default date + + + + Go to the next month + @@ -46,44 +59,55 @@ The calendar in itself - - - - - Icon for adding an event - + Dump an empty cell if we are out of the supported date range + + + Dump a normal cell if we are in range + + + + + + Icon for adding an event + - Icon for deleting an event - Icon for deleting an event + - + A single event is allowed for the moment
-
- Events from other calendars - - -
-
-
-
- + + Events from other calendars + + +
+
+
+
+ + +
@@ -157,9 +181,9 @@ View macro + dummy python: request.set('month', defaultDate.strftime('%Y/%m'))">