[Checkins] SVN: Products.CMFCalendar/branches/2.1/Products/CMFCalendar/ Long events miss the last day of each month in the calendar, thanks to silviot

Tarek Ziade ziade.tarek at gmail.com
Thu Oct 2 20:24:56 EDT 2008


Log message for revision 91683:
  Long events miss the last day of each month in the calendar, thanks to silviot

Changed:
  U   Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CHANGES.txt
  U   Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CalendarTool.py
  U   Products.CMFCalendar/branches/2.1/Products/CMFCalendar/tests/test_Calendar.py

-=-
Modified: Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CHANGES.txt
===================================================================
--- Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CHANGES.txt	2008-10-03 00:04:58 UTC (rev 91682)
+++ Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CHANGES.txt	2008-10-03 00:24:55 UTC (rev 91683)
@@ -4,6 +4,8 @@
 2.1.3-beta (unreleased)
 -----------------------
 
+- Fixed a bug were the last day of each month was missed.
+  (see https://dev.plone.org/plone/ticket/7238)
 
 2.1.2 (2008-09-13)
 ------------------

Modified: Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CalendarTool.py
===================================================================
--- Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CalendarTool.py	2008-10-03 00:04:58 UTC (rev 91682)
+++ Products.CMFCalendar/branches/2.1/Products/CMFCalendar/CalendarTool.py	2008-10-03 00:24:55 UTC (rev 91683)
@@ -209,16 +209,17 @@
                 includedevents.append(result.getRID())
             event={}
             # we need to deal with events that end next month
-            if  result.end.month() != month:
-                # doesn't work for events that last ~12 months
-                # fix it if it's a problem, otherwise ignore
+            if  result.end.greaterThan(last_date): 
                 eventEndDay = last_day
                 event['end'] = None
             else:
                 eventEndDay = result.end.day()
-                event['end'] = result.end.Time()
+                if result.end == result.end.earliestTime(): 
+                    event['end'] = (result.end - 1).latestTime().Time() 
+                else:
+                    event['end'] = result.end.Time() 
             # and events that started last month
-            if result.start.month() != month:  # same as above (12 month thing)
+            if result.start.lessThan(first_date): 
                 eventStartDay = 1
                 event['start'] = None
             else:
@@ -242,14 +243,17 @@
                          'title': event['title']} )
                     eventDays[eventday]['event'] = 1
 
-                if result.end == result.end.earliestTime():
+                if (result.end == result.end.earliestTime() and
+                    event['end'] is not None):
+                    # ends some day this month at midnight 
                     last_day_data = eventDays[allEventDays[-2]]
                     last_days_event = last_day_data['eventslist'][-1]
                     last_days_event['end'] = (result.end-1).latestTime().Time()
                 else:
-                    eventDays[eventEndDay]['eventslist'].append( 
-                        { 'end': result.end.Time()
-                        , 'start': None, 'title': event['title']} )
+                    eventDays[eventEndDay]['eventslist'].append(
+                        { 'end': event['end'],
+                          'start': None,
+                          'title': event['title']} )   
                     eventDays[eventEndDay]['event'] = 1
             else:
                 eventDays[eventStartDay]['eventslist'].append(event)

Modified: Products.CMFCalendar/branches/2.1/Products/CMFCalendar/tests/test_Calendar.py
===================================================================
--- Products.CMFCalendar/branches/2.1/Products/CMFCalendar/tests/test_Calendar.py	2008-10-03 00:04:58 UTC (rev 91682)
+++ Products.CMFCalendar/branches/2.1/Products/CMFCalendar/tests/test_Calendar.py	2008-10-03 00:24:55 UTC (rev 91683)
@@ -580,6 +580,40 @@
         events = caltool.getEventsForThisDay(thisDay=DateTime('2002/5/31'))
         self.assertEqual( len(events), 3 )
 
+    def test_veryLongEvent(self):
+        # Proper handling of events that last more than 1 year
+        # and end in the same month
+        site = self.app.site
+        site.invokeFactory('Event', id='long', title='A long event',
+                           start_date='2007/10/12 00:00:00',
+                           end_date='2008/10/12 00:00:00')
+        site.portal_workflow.doActionFor(site.long, 'publish')
+        expected = {'eventslist': [{'start': None, 'end': None, 
+                                    'title': 'A long event'}], 
+                                    'event': 1, 'day': 13}
+        events = site.portal_calendar.catalog_getevents(2007, 10)
+        self.assertEqual(events[13], expected)
+        
+    def test_lastDayRenderingOfLongEvent(self):
+        # Bug in catalog_getevents doesn't include events
+        # that spawn over months in the last day of each month
+        site = self.app.site
+        site.invokeFactory('Event', id='long', title='A long event',
+                           start_date='2007/10/12 23:50:00',
+                           end_date='2008/03/20 00:00:00')
+
+        site.portal_workflow.doActionFor(site.long, 'publish')
+        expected = {'eventslist': [{'start': None, 'end': None, 
+                                    'title': 'A long event'}], 
+                                    'event': 1}
+        # some dates to try: (day,month,year)
+        dates = ( (30,10,2007), (31,10,2007), (29,11,2007), (30,11,2007),
+                  (30,12,2007), (31,12,2007), (28,2,2008), (28,2,2008) )
+        for (day,month,year) in dates:
+            events = site.portal_calendar.catalog_getevents(year, month)
+            expected['day'] = day
+            self.assertEqual(events[day], expected)
+
     def test_lastDayRendering(self):
         # Bug in catalog_getevents included events starting at 00:00:00
         # on the next day



More information about the Checkins mailing list