def test_get_occurrences(self): result = get_occurrences(self.portal, get_portal_events(self.portal)) self.assertTrue(len(result) == 9) result = get_occurrences(self.portal, get_portal_events(self.portal), limit=5) self.assertTrue(len(result) == 5) self.assertTrue(IEventAccessor.providedBy(result[0]))
def test_get_occurrences(self): res = get_events(self.portal, ret_mode=3, expand=True) self.assertTrue(len(res) == 9) res = get_events(self.portal, start=self.now, ret_mode=3, expand=True) self.assertTrue(len(res) == 9) res = get_events(self.portal, ret_mode=3, expand=True, limit=5) self.assertTrue(len(res) == 5) self.assertTrue(IEventAccessor.providedBy(res[0]))
def test_get_occurrences(self): res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True) self.assertEqual(len(res), 9) res = get_events(self.portal, start=self.now, ret_mode=RET_MODE_ACCESSORS, expand=True) self.assertEqual(len(res), 8) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True, limit=5) self.assertEqual(len(res), 5) self.assertTrue(IEventAccessor.providedBy(res[0]))
def test_get_occurrences(self): brains = get_portal_events(self.portal) result = get_occurrences_from_brains(self.portal, brains) self.assertTrue(len(result) == 9) result = get_occurrences_from_brains(self.portal, brains, range_start=self.now) self.assertTrue(len(result) == 9) result = get_occurrences_from_brains(self.portal, brains, limit=5) self.assertTrue(len(result) == 5) self.assertTrue(IEventAccessor.providedBy(result[0]))
def get_location(accessor): """Return the location. This method can be overwritten by external packages, for example to provide a reference to a Location object as done by collective.venue. :param accessor: Event, Occurrence or IEventAccessor object. :type accessor: IEvent, IOccurrence or IEventAccessor :returns: A location string. Possibly a HTML structure to link to another object, representing the location. :rtype: string """ if not IEventAccessor.providedBy(accessor): accessor = IEventAccessor(accessor) return accessor.location
def test_get_events(self): # whole range res = get_events(self.portal) self.assertEqual(len(res), 4) res = get_events(self.portal, start=self.past, end=self.future) self.assertEqual(len(res), 4) res = get_events(self.portal, end=self.future) self.assertEqual(len(res), 4) res = get_events(self.portal, start=self.past) self.assertEqual(len(res), 4) # Limit res = get_events(self.portal, limit=2) self.assertEqual(len(res), 2) # Return objects res = get_events(self.portal, ret_mode=RET_MODE_OBJECTS) self.assertTrue(IEvent.providedBy(res[0])) # Return IEventAccessor res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS) self.assertTrue(IEventAccessor.providedBy(res[0])) # Test sorting self.assertTrue(res[0].start < res[-1].start) # Test reversed sorting res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort_reverse=True) self.assertTrue(res[0].start > res[-1].start) # Test sort_on res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort="start") self.assertEqual( [it.title for it in res][2:], [u'Now Event', u'Future Event'] ) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort="end") self.assertEqual( [it.title for it in res], [u'Past Event', u'Now Event', u'Future Event', u'Long Event'] ) # Test expansion res = get_events(self.portal, ret_mode=RET_MODE_OBJECTS, expand=True) self.assertEqual(len(res), 8) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True) self.assertEqual(len(res), 8) # Test sorting self.assertTrue(res[0].start < res[-1].start) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True, sort_reverse=True) # Test sorting self.assertTrue(res[0].start > res[-1].start) # only on now-date res = get_events(self.portal, start=self.now, end=self.now) self.assertEqual(len(res), 2) # only on now-date as date # NOTE: converting self.now to python datetime to allow testing also # with dates as Zope DateTime objects. res = get_events(self.portal, start=pydt(self.now).date(), end=pydt(self.now).date()) self.assertEqual(len(res), 2) # only on past date res = get_events(self.portal, start=self.past, end=self.past) self.assertEqual(len(res), 2) # one recurrence occurrence in far future res = get_events(self.portal, start=self.far, end=self.far) self.assertEqual(len(res), 1) # from now on res = get_events(self.portal, start=self.now) self.assertEqual(len(res), 3) # until now res = get_events(self.portal, end=self.now) self.assertEqual(len(res), 3) # in subfolder path = '/'.join(self.portal.sub.getPhysicalPath()) res = get_events(self.portal, path=path) self.assertEqual(len(res), 1)
def dates_for_display(occurrence): """ Return a dictionary containing pre-calculated information for building <start>-<end> date strings. Keys are: 'start_date' - date string of the start date 'start_time' - time string of the start date 'end_date' - date string of the end date 'end_time' - time string of the end date 'start_iso' - start date in iso format 'end_iso' - end date in iso format 'same_day' - event ends on the same day 'same_time' - event ends at same time 'whole_day' - whole day events 'open_end' - events without end time :param occurrence: Event or occurrence object. :type occurrence: IEvent, IOccurrence or IEventAccessor based object. :returns: Dictionary with date strings. :rtype: dict The behavior os ulocalized_time() with time_only is odd. Setting time_only=False should return the date part only and *not* the time NOTE: these tests are not run, but serve as documentation. TODO: remove. >>> from DateTime import DateTime >>> start = DateTime(2010,3,16,14,40) >>> from zope.component.hooks import getSite >>> site = getSite() >>> ulocalized_time(start, False, time_only=True, context=site) u'14:40' >>> ulocalized_time(start, False, time_only=False, context=site) u'14:40' >>> ulocalized_time(start, False, time_only=None, context=site) u'16.03.2010' """ if IEventAccessor.providedBy(occurrence): acc = occurrence occurrence = occurrence.context else: acc = IEventAccessor(occurrence) # this needs to separate date and time as ulocalized_time does DT_start = DT(acc.start) DT_end = DT(acc.end) start_date = ulocalized_time( DT_start, long_format=False, time_only=None, context=occurrence ) start_time = ulocalized_time( DT_start, long_format=False, time_only=True, context=occurrence ) end_date = ulocalized_time( DT_end, long_format=False, time_only=None, context=occurrence ) end_time = ulocalized_time( DT_end, long_format=False, time_only=True, context=occurrence ) same_day = is_same_day(acc.start, acc.end) same_time = is_same_time(acc.start, acc.end) # set time fields to None for whole day events if acc.whole_day: start_time = end_time = None if acc.open_end: end_time = None start_iso = acc.whole_day and acc.start.date().isoformat()\ or acc.start.isoformat() end_iso = acc.whole_day and acc.end.date().isoformat()\ or acc.end.isoformat() return dict( # Start start_date=start_date, start_time=start_time, start_iso=start_iso, # End end_date=end_date, end_time=end_time, end_iso=end_iso, # Meta same_day=same_day, same_time=same_time, whole_day=acc.whole_day, open_end=acc.open_end, )
def dates_for_display(occurrence): """ Return a dictionary containing pre-calculated information for building <start>-<end> date strings. Keys are: 'start_date' - date string of the start date 'start_time' - time string of the start date 'end_date' - date string of the end date 'end_time' - time string of the end date 'start_iso' - start date in iso format 'end_iso' - end date in iso format 'same_day' - event ends on the same day 'same_time' - event ends at same time 'whole_day' - whole day events 'open_end' - events without end time :param occurrence: Event or occurrence object. :type occurrence: IEvent, IOccurrence or IEventAccessor based object. :returns: Dictionary with date strings. :rtype: dict The behavior os ulocalized_time() with time_only is odd. Setting time_only=False should return the date part only and *not* the time NOTE: these tests are not run, but serve as documentation. TODO: remove. >>> from DateTime import DateTime >>> start = DateTime(2010,3,16,14,40) >>> from zope.component.hooks import getSite >>> site = getSite() >>> ulocalized_time(start, False, time_only=True, context=site) u'14:40' >>> ulocalized_time(start, False, time_only=False, context=site) u'14:40' >>> ulocalized_time(start, False, time_only=None, context=site) u'16.03.2010' """ if IEventAccessor.providedBy(occurrence): acc = occurrence occurrence = occurrence.context else: acc = IEventAccessor(occurrence) if acc.start is None or acc.end is None: # Eventually optional start/end dates from a potentially Event. return None # this needs to separate date and time as ulocalized_time does DT_start = DT(acc.start) DT_end = DT(acc.end) start_date = ulocalized_time(DT_start, long_format=False, time_only=None, context=occurrence) start_time = ulocalized_time(DT_start, long_format=False, time_only=True, context=occurrence) end_date = ulocalized_time(DT_end, long_format=False, time_only=None, context=occurrence) end_time = ulocalized_time(DT_end, long_format=False, time_only=True, context=occurrence) same_day = is_same_day(acc.start, acc.end) same_time = is_same_time(acc.start, acc.end) # set time fields to None for whole day events if acc.whole_day: start_time = end_time = None if acc.open_end: end_time = None start_iso = acc.whole_day and acc.start.date().isoformat()\ or acc.start.isoformat() end_iso = acc.whole_day and acc.end.date().isoformat()\ or acc.end.isoformat() return dict( # Start start_date=start_date, start_time=start_time, start_iso=start_iso, # End end_date=end_date, end_time=end_time, end_iso=end_iso, # Meta same_day=same_day, same_time=same_time, whole_day=acc.whole_day, open_end=acc.open_end, )
def test_get_events(self): # whole range res = get_events(self.portal) self.assertEqual(len(res), 4) res = get_events(self.portal, start=self.past, end=self.future) self.assertEqual(len(res), 4) res = get_events(self.portal, end=self.future) self.assertEqual(len(res), 4) res = get_events(self.portal, start=self.past) self.assertEqual(len(res), 4) # Limit res = get_events(self.portal, limit=2) self.assertEqual(len(res), 2) # Return objects res = get_events(self.portal, ret_mode=RET_MODE_OBJECTS) self.assertTrue(IEvent.providedBy(res[0])) # Return IEventAccessor res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS) self.assertTrue(IEventAccessor.providedBy(res[0])) # Test sorting self.assertTrue(res[0].start < res[-1].start) # Test reversed sorting res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort_reverse=True) self.assertTrue(res[0].start > res[-1].start) # Test sort_on res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort="start") self.assertEqual( [it.title for it in res][2:], [u'Now Event', u'Future Event'] ) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, sort="end") self.assertEqual( [it.title for it in res], [u'Past Event', u'Now Event', u'Future Event', u'Long Event'] ) # Test expansion res = get_events(self.portal, ret_mode=RET_MODE_OBJECTS, expand=True) self.assertEqual(len(res), 8) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True) self.assertEqual(len(res), 8) # Test sorting self.assertTrue(res[0].start < res[-1].start) res = get_events(self.portal, ret_mode=RET_MODE_ACCESSORS, expand=True, sort_reverse=True) # Test sorting self.assertTrue(res[0].start > res[-1].start) # only on now-date res = get_events(self.portal, start=self.now, end=self.now) self.assertEqual(len(res), 2) # only on now-date as date # NOTE: converting self.now to python datetime to allow testing also # with dates as Zope DateTime objects. res = get_events(self.portal, start=pydt(self.now).date(), end=pydt(self.now).date()) self.assertEqual(len(res), 2) # only on past date res = get_events(self.portal, start=self.past, end=self.past) self.assertEqual(len(res), 2) # one recurrence occurrence in far future res = get_events(self.portal, start=self.far, end=self.far) self.assertEqual(len(res), 1) # from now on res = get_events(self.portal, start=self.now) self.assertEqual(len(res), 3) # until now res = get_events(self.portal, end=self.now) self.assertEqual(len(res), 3) # in subfolder path = '/'.join(self.portal.sub.getPhysicalPath()) res = get_events(self.portal, path=path) self.assertEqual(len(res), 1)