def by_range(self, start, end):

        if not start and not end:
            return self.index

        if not self.index:
            return []

        first_date = self.identity_date(self.index[0])
        last_date = self.identity_date(self.index[-1])

        if not dates.overlaps(first_date, last_date, start, end):
            return []

        dateindex = self.get_metadata('dateindex')

        # use whatever timezone is given, because a search for a range cannot
        # be normalized, since the day of this search is not really a concept
        # that exists globally, everyone calls a different utc time a day
        start = (start or first_date).date()
        end = (end or last_date).date()

        if start <= first_date.date():
            startrange = 0
        else:
            startrange = dateindex[start]

        if end >= last_date.date():
            endrange = len(self.index)
        else:
            endrange = dateindex[end + timedelta(days=1)]

        return self.index[startrange:endrange]
Exemple #2
0
    def spawn(self, realitems, start=None, end=None):
        if not all((start, end)):
            start, end = self.daterange_dates()

        for item in realitems:
            for occurrence in recurrence.occurrences(item, start, end):
                for split in recurrence.split_days(occurrence):
                    if dates.overlaps(start, end, split.start, split.end):
                        yield split
Exemple #3
0
    def spawn(self, realitems, start=None, end=None):
        if not all((start, end)):
            start, end = self.daterange_dates()

        for item in realitems:
            for occurrence in recurrence.occurrences(item, start, end):
                for split in recurrence.split_days(occurrence):
                    if dates.overlaps(start, end, split.start, split.end):
                        yield split
def occurrences(item, min_date, max_date):
    """ Returns the occurrences for item between min and max date.
    Will return a list with a single item if the given item has no recurrence.

    """

    if not isinstance(item.start, datetime):
        item_start = dates.to_utc(datetime.utcfromtimestamp(item.start))
    else:
        item_start = item.start

    if not isinstance(item.end, datetime):
        item_end = dates.to_utc(datetime.utcfromtimestamp(item.end))
    else:
        item_end = item.end

    if not item.recurrence:

        if not overlaps(min_date, max_date, item_start, item_end):
            return []
        else:
            return [Occurrence(item, item_start, item_end)]

    tz = pytz.timezone(item.timezone)
    local_start = tz.normalize(item_start)

    _occurrences = recurrence_sequence_ical(
        start=local_start,
        recrule=item.recurrence,
        from_=min_date,
        until=max_date
    )

    result = []
    duration = item_end - item_start

    for start in _occurrences:
        start = utcoffset_normalize(start, dstmode=DSTADJUST)
        result.append(Occurrence(item, start, start + duration))

    return result
def occurrences(item, min_date, max_date):
    """ Returns the occurrences for item between min and max date.
    Will return a list with a single item if the given item has no recurrence.

    """

    if not isinstance(item.start, datetime):
        item_start = dates.to_utc(datetime.utcfromtimestamp(item.start))
    else:
        item_start = item.start

    if not isinstance(item.end, datetime):
        item_end = dates.to_utc(datetime.utcfromtimestamp(item.end))
    else:
        item_end = item.end

    if not item.recurrence:

        if not overlaps(min_date, max_date, item_start, item_end):
            return []
        else:
            return [Occurrence(item, item_start, item_end)]

    tz = pytz.timezone(item.timezone)
    local_start = tz.normalize(item_start)

    _occurrences = recurrence_sequence_ical(start=local_start,
                                            recrule=item.recurrence,
                                            from_=min_date,
                                            until=max_date)

    result = []
    duration = item_end - item_start

    for start in _occurrences:
        start = utcoffset_normalize(start, dstmode=DSTADJUST)
        result.append(Occurrence(item, start, start + duration))

    return result
Exemple #6
0
    def by_range(self, start, end):

        if not start and not end:
            return self.index

        if not self.index:
            return []

        first_date = self.identity_date(self.index[0])
        last_date = self.identity_date(self.index[-1])

        last_date = datetime(
            last_date.year, last_date.month, last_date.day,
            tzinfo=end.tzinfo) + timedelta(days=1, microseconds=-1)

        if not dates.overlaps(first_date, last_date, start, end):
            return []

        dateindex = self.get_metadata('dateindex')

        # use whatever timezone is given, because a search for a range cannot
        # be normalized, since the day of this search is not really a concept
        # that exists globally, everyone calls a different utc time a day
        start = (start or first_date).date()
        end = (end or last_date).date()

        if start <= first_date.date():
            startrange = 0
        else:
            startrange = dateindex[start]

        if end >= last_date.date():
            endrange = len(self.index)
        else:
            endrange = dateindex[end + timedelta(days=1)]

        return self.index[startrange:endrange]