Title: [commits] (jeffrey) [11216] - Fix for bug 6174, all sorts of sadness when merging changed
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

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

Reply via email to