- 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
