import peak.events.trellis as trellis from datetime import timedelta, datetime, time, date one_day = timedelta(1) one_hour = timedelta(hours=1) class Event(trellis.Component): trellis.values( start = None, end = None, globaltz = None ) def busyHoursForDay(self, day): """Return the number of busy hours the event takes up on day.""" if None in (self.start, self.end): return 0 range_start = datetime.combine(day, time(0, tzinfo=self.globaltz)) range_end = range_start + one_day if range_end >= self.start and range_start <= self.end: return 1 class Day(trellis.Component): trellis.values( date = None, events = trellis.Set(), busy = 0 ) @trellis.rule def busy(self): return sum(event.busyHoursForDay(self.date) for event in self.events)