- Revision
- 11216
- Author
- jeffrey
- Date
- 2006-07-20 20:12:15 -0700 (Thu, 20 Jul 2006)
Log Message
- Fix for bug 6174, all sorts of sadness when merging changed
recurring events. Fix for asserts in the calendar view,
changeThisAndFuture logic when handling allDay/anyTime changes,
logic in the deleting of items that handles deferred deletes better.
Fix recurrence specific merge logic to delete generated occurrences.
r=grant
recurring events. Fix for asserts in the calendar view,
changeThisAndFuture logic when handling allDay/anyTime changes,
logic in the deleting of items that handles deferred deletes better.
Fix recurrence specific merge logic to delete generated occurrences.
r=grant
Modified Paths
Diff
Modified: branches/0.7alpha3/chandler/parcels/osaf/framework/blocks/calendar/TimedCanvas.py (11215 => 11216)
--- branches/0.7alpha3/chandler/parcels/osaf/framework/blocks/calendar/TimedCanvas.py 2006-07-21 02:14:39 UTC (rev 11215) +++ branches/0.7alpha3/chandler/parcels/osaf/framework/blocks/calendar/TimedCanvas.py 2006-07-21 03:12:15 UTC (rev 11216) @@ -568,7 +568,9 @@ self.drawOrderedCanvasItems = ordered def CheckConflicts(self): - assert sorted(self.visibleItems, self.sortByStartTime) == self.visibleItems + assert (sorted([i for i in self.visibleItems if not i.isStale()], + self.sortByStartTime) == + [i for i in self.visibleItems if not i.isStale()]) for itemIndex, canvasItem in enumerate(self.canvasItemList): if self.coercedCanvasItem is not canvasItem \ and not canvasItem.item.isStale():
Modified: branches/0.7alpha3/chandler/parcels/osaf/pim/calendar/Calendar.py (11215 => 11216)
--- branches/0.7alpha3/chandler/parcels/osaf/pim/calendar/Calendar.py 2006-07-21 02:14:39 UTC (rev 11215) +++ branches/0.7alpha3/chandler/parcels/osaf/pim/calendar/Calendar.py 2006-07-21 03:12:15 UTC (rev 11216) @@ -1143,25 +1143,40 @@ """Modify this and all future events.""" master = self.getMaster() first = master # Changed for no-THISANDFUTURE-style + if self.recurrenceID is None: + self.recurrenceID = self.startTime recurrenceID = self.recurrenceID - isFirst = (recurrenceID == master.startTime) + # we can't use master.effectiveStartTime because the event timezone and + # the current timezone may not match + isFirst = (((master.allDay or master.anyTime) and + recurrenceID.date() == master.startTime.date()) or + (recurrenceID == master.startTime)) self._ignoreValueChanges = True # all day events' startTime is at midnight startMidnight = datetime.combine(self.startTime.date(), time(0, tzinfo=self.startTime.tzinfo)) - if attr in ('startTime', 'allDay'): + if attr in ('startTime', 'allDay', 'anyTime'): + # if startTime changes (and an allDay/anyTime change changes + # effective startTime), all future occurrences need to be shifted + # appropriately startTimeDelta = zero_delta if attr == 'startTime': startTimeDelta = (value - self.startTime) - # the recurrence dialog often gets extra changes buffered, don't - # process allDay unless it's actually changed - elif self.allDay != value: - if value == False: - startTimeDelta = self.startTime - startMidnight + # don't move future occurrences unless allDayness (anyTime or + # allDay) changes + else: + if attr == 'allDay': + otherAllDayness = self.anyTime else: - startTimeDelta = startMidnight - self.startTime + otherAllDayness = self.allDay + if (value or otherAllDayness) != (getattr(self, attr) or + otherAllDayness): + if value == False: + startTimeDelta = self.startTime - startMidnight + else: + startTimeDelta = startMidnight - self.startTime if startTimeDelta != zero_delta: self.rruleset.moveDatesAfter(recurrenceID, startTimeDelta) @@ -1505,6 +1520,7 @@ master.changeNoModification('recurrenceID', master.startTime) rruleset = master.rruleset if rruleset is not None: + rruleset._ignoreValueChanges = True masterHadModification = False for event in master.occurrences: @@ -1513,7 +1529,10 @@ # in the background sharing mode) let's remove the events # from occurrences: master.occurrences.remove(event) - + # now that we've disconnected this event from the master, + # event.delete() will erroneously dispatch to deleteAll() if + # event.rruleset exists, so disconnect from the rruleset + del event.rruleset event.delete() elif event != master:
Modified: branches/0.7alpha3/chandler/parcels/osaf/sharing/Sharing.py (11215 => 11216)
--- branches/0.7alpha3/chandler/parcels/osaf/sharing/Sharing.py 2006-07-21 02:14:39 UTC (rev 11215) +++ branches/0.7alpha3/chandler/parcels/osaf/sharing/Sharing.py 2006-07-21 03:12:15 UTC (rev 11216) @@ -280,13 +280,13 @@ # become a modification, which means we should # call getMaster() here and not earlier when # calculating modifiedRecurringEvents. - event = event.getMaster() - occurrences = getattr(event, 'occurrences', None) + masterOccurrences = event.getMaster().occurrences - if occurrences is not None: - event.occurrences = [x for x in occurrences - if x.rruleset is not None and - not x.rruleset.isDeferred()] + if masterOccurrences is not None: + for occurrence in masterOccurrences: + if (occurrence.rruleset is None or + occurrence.rruleset.isDeferred()): + occurrence.delete(recursive=True)
_______________________________________________ Commits mailing list [email protected] http://lists.osafoundation.org/mailman/listinfo/commits
