def occurrence_groups(self): dr = dates.DateRanges() start, end = dr.this_year[0], dr.next_year[1] result = grouped_occurrences( occurrences(self.context, start, end), self.request ) return result
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 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 test_cornercases(self, default_now, default_timezone): default_timezone.return_value = 'Europe/Zurich' # create an event that repeats every sunday at 7 in the morning # over a period within which daylight savings time changes item = Item( datetime(2012, 10, 21, 7), datetime(2012, 11, 4, 7), "RRULE:FREQ=WEEKLY", timezone='Europe/Zurich' ) occurrences = recurrence.occurrences( item, min_date=item.local_start, max_date=item.local_end ) self.assertEqual(len(occurrences), 3) self.assertEqual([o.local_start.hour for o in occurrences], [7] * 3) self.assertEqual( [o.local_start.weekday() for o in occurrences], [6] * 3 ) # create an event that starts at 0:00 in a timezone other than # utc and ensure that the resulting human date shows the # correct weekday in the given timezone # to make it tricky, cross over daylight savings time default_now.return_value = datetime( 2012, 10, 17, tzinfo=pytz.timezone('Europe/Zurich') ) start = datetime(2012, 10, 30) item = Item( start, start + timedelta(seconds=60 * 60 * 2), timezone='Europe/Zurich' ) # behold, the Swiss German language request = TestRequest() request.locale.dates.calendars['gregorian'].getDayNames = mock.Mock( return_value=[ u'Mäntig', u'Zischtig', u'Mittwuch', u'Dunschtig', u'Fritig', u'Samschtig', u'Sunntig' ] ) human = item.as_occurrence().human_date(request) self.assertTrue(u'Zischtig' in human) # while we're at it human = item.as_occurrence().human_daterange(request) self.assertEqual(human, '00:00 - 02:00')
def test_cornercases(self, default_now, default_timezone): default_timezone.return_value = 'Europe/Zurich' # create an event that repeats every sunday at 7 in the morning # over a period within which daylight savings time changes item = Item(datetime(2012, 10, 21, 7), datetime(2012, 11, 4, 7), "RRULE:FREQ=WEEKLY", timezone='Europe/Zurich') occurrences = recurrence.occurrences(item, min_date=item.local_start, max_date=item.local_end) self.assertEqual(len(occurrences), 3) self.assertEqual([o.local_start.hour for o in occurrences], [7] * 3) self.assertEqual([o.local_start.weekday() for o in occurrences], [6] * 3) # create an event that starts at 0:00 in a timezone other than # utc and ensure that the resulting human date shows the # correct weekday in the given timezone # to make it tricky, cross over daylight savings time default_now.return_value = datetime( 2012, 10, 17, tzinfo=pytz.timezone('Europe/Zurich')) start = datetime(2012, 10, 30) item = Item(start, start + timedelta(seconds=60 * 60 * 2), timezone='Europe/Zurich') # behold, the Swiss German language request = TestRequest() request.locale.dates.calendars['gregorian'].getDayNames = mock.Mock( return_value=[ u'Mäntig', u'Zischtig', u'Mittwuch', u'Dunschtig', u'Fritig', u'Samschtig', u'Sunntig' ]) human = item.as_occurrence().human_date(request) self.assertTrue(u'Zischtig' in human) # while we're at it human = item.as_occurrence().human_daterange(request) self.assertEqual(human, '00:00 - 02:00')
def occurrences(self): min_date, max_date = dates.eventrange() return recurrence.occurrences(self.context, min_date, max_date)
def test_occurrences(self): item = Item(datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0), "RRULE:FREQ=DAILY;COUNT=4") occurrences = recurrence.occurrences(item, min_date=datetime(2012, 1, 1, 0, 0, tzinfo=item.tz), max_date=datetime(2012, 12, 31, 0, 0, tzinfo=item.tz)) self.assertEqual(len(occurrences), 4) for occurrence in occurrences: self.assertEqual(occurrence.recurrence, item.recurrence) days = [o.start.day for o in occurrences] self.assertEqual([1, 2, 3, 4], days) # test occurrences item = Item(datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0), "RRULE:FREQ=DAILY;COUNT=4") occurrences = recurrence.occurrences(item, min_date=item.start, max_date=item.end) self.assertEqual(len(occurrences), 1) # see if the picking works correctly for i in range(1, 5): picked = recurrence.pick_occurrence(item, start=date(2012, 1, i)) self.assertEqual(picked.start.day, i) self.assertEqual(picked.start.month, 1) self.assertEqual(picked.start.year, 2012) picked = recurrence.pick_occurrence(item, start=date(2011, 12, 31)) self.assertEqual(picked, None) picked = recurrence.pick_occurrence(item, start=date(2012, 1, 5)) self.assertEqual(picked, None) # occurrences should return an empty list in these cases occurrences = recurrence.occurrences(item, min_date=datetime(2011, 1, 1, tzinfo=item.tz), max_date=datetime(2011, 1, 1, tzinfo=item.tz)) self.assertEqual(occurrences, []) non_recurrant = Item(datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0)) occurrences = recurrence.occurrences(non_recurrant, min_date=datetime(2011, 1, 1, tzinfo=item.tz), max_date=datetime(2011, 1, 1, tzinfo=item.tz)) self.assertEqual(occurrences, []) # non-recurring items are packed into a list occurrences = recurrence.occurrences( non_recurrant, datetime(2012, 1, 1, 10, 0, tzinfo=item.tz), datetime(2012, 1, 1, 12, 0, tzinfo=item.tz)) self.assertEqual(occurrences, [non_recurrant])
def occurrences(self): min_date, max_date = dates.eventrange() return recurrence.occurrences(self.context, min_date, max_date)
def occurrence_groups(self): dr = dates.DateRanges() start, end = dr.this_year[0], dr.next_year[1] result = grouped_occurrences(occurrences(self.context, start, end), self.request) return result
def test_occurrences(self): item = Item( datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0), "RRULE:FREQ=DAILY;COUNT=4" ) occurrences = recurrence.occurrences( item, min_date=datetime(2012, 1, 1, 0, 0, tzinfo=item.tz), max_date=datetime(2012, 12, 31, 0, 0, tzinfo=item.tz) ) self.assertEqual(len(occurrences), 4) for occurrence in occurrences: self.assertEqual(occurrence.recurrence, item.recurrence) days = [o.start.day for o in occurrences] self.assertEqual([1, 2, 3, 4], days) # test occurrences item = Item( datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0), "RRULE:FREQ=DAILY;COUNT=4" ) occurrences = recurrence.occurrences( item, min_date=item.start, max_date=item.end ) self.assertEqual(len(occurrences), 1) # see if the picking works correctly for i in range(1, 5): picked = recurrence.pick_occurrence(item, start=date(2012, 1, i)) self.assertEqual(picked.start.day, i) self.assertEqual(picked.start.month, 1) self.assertEqual(picked.start.year, 2012) picked = recurrence.pick_occurrence(item, start=date(2011, 12, 31)) self.assertEqual(picked, None) picked = recurrence.pick_occurrence(item, start=date(2012, 1, 5)) self.assertEqual(picked, None) # occurrences should return an empty list in these cases occurrences = recurrence.occurrences( item, min_date=datetime(2011, 1, 1, tzinfo=item.tz), max_date=datetime(2011, 1, 1, tzinfo=item.tz) ) self.assertEqual(occurrences, []) non_recurrant = Item( datetime(2012, 1, 1, 10, 0), datetime(2012, 1, 1, 12, 0) ) occurrences = recurrence.occurrences( non_recurrant, min_date=datetime(2011, 1, 1, tzinfo=item.tz), max_date=datetime(2011, 1, 1, tzinfo=item.tz) ) self.assertEqual(occurrences, []) # non-recurring items are packed into a list occurrences = recurrence.occurrences( non_recurrant, datetime(2012, 1, 1, 10, 0, tzinfo=item.tz), datetime(2012, 1, 1, 12, 0, tzinfo=item.tz) ) self.assertEqual(occurrences, [non_recurrant])