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]
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
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]