[gen] Calendar: added a method for retrieving events from a calendar.
This commit is contained in:
parent
0dd870c042
commit
6cf29778b6
|
@ -238,6 +238,86 @@ class Calendar(Type):
|
||||||
if not events: return
|
if not events: return
|
||||||
return events[0].eventType
|
return events[0].eventType
|
||||||
|
|
||||||
|
def getEventsByType(self, obj, eventType, minDate=None, maxDate=None,
|
||||||
|
sorted=True, groupSpanned=False):
|
||||||
|
'''Returns all the events of a given p_eventType. If p_eventType is
|
||||||
|
None, it returns events of all types. The return value is a list of
|
||||||
|
2-tuples whose 1st elem is a DateTime instance and whose 2nd elem is
|
||||||
|
the event.
|
||||||
|
If p_sorted is True, the list is sorted in chronological order. Else,
|
||||||
|
the order is random, but the result is computed faster.
|
||||||
|
If p_minDate and/or p_maxDate is/are specified, it restricts the
|
||||||
|
search interval accordingly.
|
||||||
|
If p_groupSpanned is True, events spanned on several days are
|
||||||
|
grouped into a single event. In this case, tuples in the result
|
||||||
|
are 3-tuples: (DateTime_startDate, DateTime_endDate, event).
|
||||||
|
'''
|
||||||
|
# Prevent wrong combinations of parameters
|
||||||
|
if groupSpanned and not sorted:
|
||||||
|
raise Exception('Events must be sorted if you want to get ' \
|
||||||
|
'spanned events to be grouped.')
|
||||||
|
obj = obj.o # Ensure p_obj is not a wrapper.
|
||||||
|
res = []
|
||||||
|
if not hasattr(obj, self.name): return res
|
||||||
|
# Compute "min" and "max" tuples
|
||||||
|
if minDate:
|
||||||
|
minYear = minDate.year()
|
||||||
|
minMonth = (minYear, minDate.month())
|
||||||
|
minDay = (minYear, minDate.month(), minDate.day())
|
||||||
|
if maxDate:
|
||||||
|
maxYear = maxDate.year()
|
||||||
|
maxMonth = (maxYear, maxDate.month())
|
||||||
|
maxDay = (maxYear, maxDate.month(), maxDate.day())
|
||||||
|
# Browse years
|
||||||
|
years = getattr(obj, self.name)
|
||||||
|
for year in years.keys():
|
||||||
|
# Don't take this year into account if outside interval
|
||||||
|
if minDate and (year < minYear): continue
|
||||||
|
if maxDate and (year > maxYear): continue
|
||||||
|
months = years[year]
|
||||||
|
# Browse this year's months
|
||||||
|
for month in months.keys():
|
||||||
|
# Don't take this month into account if outside interval
|
||||||
|
thisMonth = (year, month)
|
||||||
|
if minDate and (thisMonth < minMonth): continue
|
||||||
|
if maxDate and (thisMonth > maxMonth): continue
|
||||||
|
days = months[month]
|
||||||
|
# Browse this month's days
|
||||||
|
for day in days.keys():
|
||||||
|
# Don't take this day into account if outside interval
|
||||||
|
thisDay = (year, month, day)
|
||||||
|
if minDate and (thisDay < minDay): continue
|
||||||
|
if maxDate and (thisDay > maxDay): continue
|
||||||
|
events = days[day]
|
||||||
|
# Browse this day's events
|
||||||
|
for event in events:
|
||||||
|
# Filter unwanted events
|
||||||
|
if eventType and (event.eventType != eventType):
|
||||||
|
continue
|
||||||
|
# We have found a event.
|
||||||
|
date = DateTime('%d/%d/%d 12:00' % (year,month,day))
|
||||||
|
if groupSpanned:
|
||||||
|
singleRes = [date, None, event]
|
||||||
|
else:
|
||||||
|
singleRes = (date, event)
|
||||||
|
res.append(singleRes)
|
||||||
|
# Sort the result if required
|
||||||
|
if sorted: res.sort(lambda x,y: cmp(x[0], y[0]))
|
||||||
|
# Group events spanned on several days if required
|
||||||
|
if groupSpanned:
|
||||||
|
# Browse events in reverse order and merge them when appropriate
|
||||||
|
i = len(res) - 1
|
||||||
|
while i > 0:
|
||||||
|
currentDate = res[i][0]
|
||||||
|
lastDate = res[i][1]
|
||||||
|
previousDate = res[i-1][0]
|
||||||
|
if previousDate == (currentDate-1):
|
||||||
|
# A merge is needed
|
||||||
|
del res[i]
|
||||||
|
res[i-1][1] = lastDate or currentDate
|
||||||
|
i -= 1
|
||||||
|
return res
|
||||||
|
|
||||||
def hasEventsAt(self, obj, date, otherEvents):
|
def hasEventsAt(self, obj, date, otherEvents):
|
||||||
'''Returns True if, at p_date, an event is found of the same type as
|
'''Returns True if, at p_date, an event is found of the same type as
|
||||||
p_otherEvents.'''
|
p_otherEvents.'''
|
||||||
|
|
|
@ -65,8 +65,9 @@ img { border: 0; vertical-align: middle}
|
||||||
width: 600px; border: 1px #F0C36D solid; padding: 6px;
|
width: 600px; border: 1px #F0C36D solid; padding: 6px;
|
||||||
background-color: #F9EDBE; text-align: center;
|
background-color: #F9EDBE; text-align: center;
|
||||||
border-radius: 2px 2px 2px 2px; box-shadow: 0 2px 4px #A9A9A9;}
|
border-radius: 2px 2px 2px 2px; box-shadow: 0 2px 4px #A9A9A9;}
|
||||||
.focus { font-size: 90%; margin: 7px; padding: 7px; background-color: #d7dee4;
|
.focus { font-size: 90%; margin: 7px 0 7px 0; padding: 7px;
|
||||||
border-radius: 2px 2px 2px 2px; box-shadow: 0 2px 4px #A9A9A9;}
|
background-color: #d7dee4; border-radius: 2px 2px 2px 2px;
|
||||||
|
box-shadow: 0 2px 4px #A9A9A9 }
|
||||||
.focus td { padding: 4px 0px 4px 4px }
|
.focus td { padding: 4px 0px 4px 4px }
|
||||||
.discreet { font-size: 90%; }
|
.discreet { font-size: 90%; }
|
||||||
.lostPassword a { font-size: 90%; color: white; padding-left: 1em;}
|
.lostPassword a { font-size: 90%; color: white; padding-left: 1em;}
|
||||||
|
@ -137,3 +138,4 @@ img { border: 0; vertical-align: middle}
|
||||||
padding: 10px; margin: 10px 0 10px 0}
|
padding: 10px; margin: 10px 0 10px 0}
|
||||||
.homeTable { background-color: #E3E3E3; border-top: 1px solid grey}
|
.homeTable { background-color: #E3E3E3; border-top: 1px solid grey}
|
||||||
.homeTable td { padding: 10px 5px 10px 10px}
|
.homeTable td { padding: 10px 5px 10px 10px}
|
||||||
|
.homeTable th { padding-top: 5px; font-size: 105% }
|
||||||
|
|
Loading…
Reference in a new issue