Example #1
0
    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
Example #2
0
    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
Example #3
0
    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