Title: [commits] (stearns) [16113] Fix bug 7894 (Events should be marked as DONE when end-date/times roll by, but not 'Purged' to DONE section), r=grant
Revision
16113
Author
stearns
Date
2007-12-12 09:42:12 -0800 (Wed, 12 Dec 2007)

Log Message

Fix bug 7894 (Events should be marked as DONE when end-date/times roll by, but not 'Purged' to DONE section), r=grant

Modified Paths

Diff

Modified: trunk/chandler/parcels/osaf/pim/calendar/Calendar.py (16112 => 16113)

--- trunk/chandler/parcels/osaf/pim/calendar/Calendar.py	2007-12-12 01:06:09 UTC (rev 16112)
+++ trunk/chandler/parcels/osaf/pim/calendar/Calendar.py	2007-12-12 17:42:12 UTC (rev 16113)
@@ -2994,22 +2994,22 @@
     def itemChanged(self, item):
         if self.nextPoll is not None:
             event = EventStamp(item)
-            possibleNewNextPoll = None
+            possibleNewNextEvent = None
             if event.rruleset is None:
                 # an ordinary event ... see if we need to reschedule
-                possibleNewNextPoll = event.effectiveStartTime
+                possibleNewNextEvent = event
             elif event.occurrenceFor is None:
                 # a master
                 occurrence = event.getNextOccurrence(after=self.prevPoll)
                 if occurrence is not None:
-                    possibleNewNextPoll = occurrence.effectiveStartTime
+                    possibleNewNextEvent = occurrence
                 
-            if (possibleNewNextPoll is not None and
-                possibleNewNextPoll >= self.prevPoll and
-                possibleNewNextPoll < self.nextPoll):
-                
-                self.nextPoll = possibleNewNextPoll
-                
+            if possibleNewNextEvent is not None:
+                for attr in ('effectiveStartTime', 'effectiveEndTime'):
+                    time = getattr(possibleNewNextEvent, attr)
+                    if self.prevPoll < time < self.nextPoll:
+                        self.nextPoll = time
+                        break
 
     
     def updatePending(self, when=None):
@@ -3018,16 +3018,13 @@
         if when is None:
             when = datetime.now(view.tzinfo.default)
             
-        # getKeysInRange() isn't quite what we want, because
-        # it cares about events overlapping range, whereas we
-        # only want events whose effectiveStartTime lies within
-        # range
-
         def yieldEvents(start, end):
+            # Yield events overlapping this range, both regular and occurrences.
             pimNs = schema.ns("osaf.pim", view)
             useTZ = pimNs.TimezonePrefs.showUI
             
             startIndex = 'effectiveStart'
+            endIndex = 'effectiveEnd'
             recurEndIndex ='recurrenceEnd'
 
             allEvents = EventStamp.getCollection(view)
@@ -3038,19 +3035,21 @@
                 start = start.replace(tzinfo=None)
                 end = end.replace(tzinfo=None)
             
-            def cmpStart(key):
-                testVal = EventStamp._getEffectiveStartTime(key, view)
+            # Find the first event that ends at or after the start of our range
+            def cmpEnd(key):
+                testVal = EventStamp._getEffectiveEndTime(key, view)
                 if testVal is None:
                     return -1 # interpret None as negative infinity
                 # note that we're NOT using >=, if we did, we'd include all day
                 # events starting at the beginning of the next week
                 return cmp(testVal, searchStart)
 
-            firstKey = allEvents.findInIndex(startIndex, 'first', cmpStart)
-            for key, item in allEvents.iterindexitems(startIndex, firstKey):
+            firstKey = allEvents.findInIndex(endIndex, 'first', cmpEnd)
+            for key, item in allEvents.iterindexitems(endIndex, firstKey):
                 event = EventStamp(item)
                 if event.rruleset is None:
-                    if useTZ or start <= event.effectiveStartTime.replace(tzinfo=None) <= end:
+                    if useTZ or (start <= event.effectiveEndTime.replace(tzinfo=None) and 
+                                 event.effectiveStartTime.replace(tzinfo=None) <= end):
                         yield event
 
             masterEvents = pimNs.masterEvents
@@ -3062,7 +3061,8 @@
                 
                 for event in master._generateRule(after=searchStart,
                                                   before=searchEnd):
-                    if useTZ or start <= event.effectiveStartTime.replace(tzinfo=None) <= end:
+                    if useTZ or (start <= event.effectiveEndTime.replace(tzinfo=None) and 
+                                 event.effectiveStartTime.replace(tzinfo=None) <= end):
                         yield event
 
         if self.nextPoll is not None:
@@ -3074,17 +3074,34 @@
          + self.QUERY_INTERVAL
         nextPoll = oneHourHence
         
+        # We'll autotriage to 'now' any events that already started.
+        # Bug 7894: We'll autotriage to 'done' any events as they pass, if:
+        # - the event is not also a task, or anytime, or attime, and
+        # - the user hasn't manually triaged it.
+        # If we do autotriage to 'done', we pin the item in place.
+        from osaf.pim import TaskStamp
         for event in yieldEvents(start, oneHourHence):
-            effectiveStart = event.effectiveStartTime
-            
-            if effectiveStart <= when:
-                if self.prevPoll is not None and effectiveStart >= self.prevPoll:
-                    event.changeThis()
-                    event.itsItem.setTriageStatus(TriageEnum.now,
-                                                  when=effectiveStart)
-                    event.getFirstFutureLater()
-            elif effectiveStart < nextPoll:
-                nextPoll = effectiveStart
+            if ((not event.itsItem.doAutoTriageOnDateChange) or
+                event.anyTime or (event.duration == 0)
+                 or has_stamp(event.itsItem, TaskStamp)):
+                # just do 'now' based on start
+                statesToDo = (('effectiveStartTime', TriageEnum.now, False),)
+            else:
+                # Do both (but do end first so that we only triage
+                # an old event once)
+                statesToDo = (('effectiveEndTime', TriageEnum.done, True), 
+                              ('effectiveStartTime', TriageEnum.now, False))
+            for attr, newStatus, pin in statesToDo:
+                effectiveTime = getattr(event, attr)
+                if effectiveTime <= when:
+                    if self.prevPoll is not None and effectiveTime >= self.prevPoll:
+                        event.changeThis()
+                        event.itsItem.setTriageStatus(newStatus, pin=pin,
+                                                      when=effectiveTime)
+                        event.getFirstFutureLater()
+                        break                    
+                elif effectiveTime < nextPoll:
+                    nextPoll = effectiveTime
                 
         self.nextPoll = nextPoll
         self.prevPoll = when

Modified: trunk/chandler/parcels/osaf/pim/calendar/tests/TestReminders.py (16112 => 16113)

--- trunk/chandler/parcels/osaf/pim/calendar/tests/TestReminders.py	2007-12-12 01:06:09 UTC (rev 16112)
+++ trunk/chandler/parcels/osaf/pim/calendar/tests/TestReminders.py	2007-12-12 17:42:12 UTC (rev 16113)
@@ -20,7 +20,10 @@
 import osaf.pim.tests.TestDomainModel as TestDomainModel
 import repository.item
 from datetime import datetime, timedelta, time
+import logging
 
+logger = logging.getLogger(__name__)
+
 class AbsoluteReminderTestCase(TestDomainModel.DomainModelTestCase):
     def setUp(self):
         super(AbsoluteReminderTestCase, self).setUp()
@@ -643,10 +646,10 @@
         # Expire all the pending entries ...
         self.tsReminder.updatePending(fifthStart + timedelta(days=7))
         
-        # ... make sure the triage status got set to now
+        # ... make sure the triage status got set to done
         event = fifth
         while event is not None:
-            self.failUnlessEqual(event.itsItem.triageStatus, TriageEnum.now)
+            self.failUnlessEqual(event.itsItem.triageStatus, TriageEnum.done)
             event = event.getNextOccurrence()
 
         # ... and make sure the reminder got deleted




_______________________________________________
Commits mailing list
[email protected]
http://lists.osafoundation.org/mailman/listinfo/commits

Reply via email to