def getEventsByMonth(self, month_events_limit=0): """ Return the events grouped by start_date per month (sorted by start_date) @param month_events_limit: if not 0 limits the results per one month """ ret = {} catalog = self.unrestrictedTraverse(self.catalog) visited_paths = set() for meta_type, (interval_idx, predicate) in self.cal_meta_types.items(): catalog_index = catalog._catalog.getIndex(interval_idx) for brain in catalog({'meta_type': meta_type, 'approved': 1}): path = brain.getPath() if path in visited_paths: continue visited_paths.add(path) rid = brain.getRID() start_minutes, end_minutes = \ catalog_index.getEntryForObject(rid) start_date = self.getDateFromMinutes(start_minutes) end_date = self.getDateFromMinutes(end_minutes) if start_date is None: continue key = start_date.month, start_date.year if key not in ret: ret[key] = [] if (len(ret[key]) >= month_events_limit and month_events_limit != 0): continue event = brain.getObject() if not evalPredicate(predicate, event): continue ret[key].append((event, start_date, end_date)) for key in ret: ret[key].sort(key=lambda x: x[1]) return ret
def hasEventsByDay(self, year, month): """Returns if there are any events for each date in this month """ brains_by_day = {} catalog = self.unrestrictedTraverse(self.catalog) for day in range(1, calendar.monthrange(year, month)[1] + 1): date = DateTime(year, month, day) brains_by_day[day] = [] for meta_type, (interval_idx, predicate) in self.cal_meta_types.items(): brains_by_day[day].extend(catalog({'meta_type': meta_type, interval_idx: date, 'approved': 1})) # cache getObject + evalPredicate results for each path positive_paths = set() negative_paths = set() ret = {} for day in range(1, calendar.monthrange(year, month)[1] + 1): for brain in brains_by_day[day]: path = brain.getPath() if path in positive_paths: ret[day] = True break elif path in negative_paths: continue # optimization if predicate is missing if not predicate: positive_paths.add(path) ret[day] = True break event = brain.getObject() predicate = self.cal_meta_types[event.meta_type][1] if evalPredicate(predicate, event): positive_paths.add(path) ret[day] = True break else: negative_paths.add(path) else: ret[day] = False return ret
def getEvents(self, year, month, day=None): """Return the events for the specified date or the whole month if day is not specified. """ if day: dates = [DateTime(year, month, day)] else: dates = [DateTime(year, month, day) for day in range(1, calendar.monthrange(year, month)[1] + 1)] events = [] catalog = self.unrestrictedTraverse(self.catalog) items = {} for meta_type, (interval_idx, predicate) in self.cal_meta_types.items(): catalog_index = catalog._catalog.getIndex(interval_idx) for date in dates: for brain in catalog({'meta_type': meta_type, interval_idx: date, 'approved': 1}): path = brain.getPath() if path in items: continue items[path] = None event = brain.getObject() if evalPredicate(predicate, event): # get start_date/end_date from cat. index, not from obj rid = brain.getRID() # dates are stored in index as minutes since 1st jan 70 (start_minutes, end_minutes) = \ catalog_index.getEntryForObject(rid) start_date = self.getDateFromMinutes(start_minutes) end_date = self.getDateFromMinutes(end_minutes) events.append((event, self.getDate(start_date), self.getDate(end_date))) return events