[CalendarServer-changes] [4051] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Apr 21 08:35:30 PDT 2009


Revision: 4051
          http://trac.macosforge.org/projects/calendarserver/changeset/4051
Author:   cdaboo at apple.com
Date:     2009-04-21 08:35:30 -0700 (Tue, 21 Apr 2009)
Log Message:
-----------
Fixes and tests for all-day event handling of auto-accept locations and attendee overrides.

Modified Paths:
--------------
    CalendarServer/trunk/run
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
    CalendarServer/trunk/twistedcaldav/scheduling/processing.py
    CalendarServer/trunk/twistedcaldav/test/test_icalendar.py

Modified: CalendarServer/trunk/run
===================================================================
--- CalendarServer/trunk/run	2009-04-21 15:33:09 UTC (rev 4050)
+++ CalendarServer/trunk/run	2009-04-21 15:35:30 UTC (rev 4051)
@@ -724,7 +724,7 @@
 
 caldavtester="${top}/CalDAVTester";
 
-svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 4009;
+svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 4050;
 
 #
 # PyFlakes

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2009-04-21 15:33:09 UTC (rev 4050)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2009-04-21 15:35:30 UTC (rev 4051)
@@ -36,7 +36,7 @@
 from twisted.web2.stream import IStream
 
 from twistedcaldav.dateops import compareDateTime, normalizeToUTC, timeRangesOverlap,\
-    normalizeStartEndDuration, toString
+    normalizeStartEndDuration, toString, normalizeForIndex
 from twistedcaldav.instance import InstanceList
 from twistedcaldav.log import Logger
 from twistedcaldav.scheduling.cuaddress import normalizeCUAddr
@@ -1030,7 +1030,8 @@
                 limit += datetime.timedelta(days=365)
                 instances = self.cacheExpandedTimeRanges(limit)
                 rids = set([instances[key].rid for key in instances])
-                if rid not in rids:
+                instance_rid = normalizeForIndex(rid)
+                if instance_rid not in rids:
                     # No match to a valid RRULE instance
                     return None
             else:
@@ -1052,10 +1053,14 @@
             dtend = newcomp.getProperty("DTEND")
             oldduration = dtend.value() - dtstart.value()
             
-        newdtstartValue = rid
-        if isinstance(newdtstartValue, datetime.datetime):
+        if isinstance(dtstart.value(), datetime.datetime):
             if dtstart.value().tzinfo:
-                newdtstartValue = newdtstartValue.astimezone(dtstart.value().tzinfo)
+                newdtstartValue = rid.astimezone(dtstart.value().tzinfo)
+            else:
+                newdtstartValue = rid
+        else:
+            newdtstartValue = datetime.date.fromordinal(rid.toordinal())
+            
         dtstart.setValue(newdtstartValue)
         if newcomp.hasProperty("DTEND"):
             dtend.setValue(newdtstartValue + oldduration)
@@ -1265,6 +1270,12 @@
         """
         if self.name() == "VTIMEZONE":
             return self._vobject.gettzinfo()
+        elif self.name() == "VCALENDAR":
+            for component in self.subcomponents():
+                if component.name() == "VTIMEZONE":
+                    return component.gettzinfo()
+            else:
+                return None
         else:
             return None
 

Modified: CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-04-21 15:33:09 UTC (rev 4050)
+++ CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-04-21 15:35:30 UTC (rev 4051)
@@ -548,7 +548,7 @@
 
     def _attendeeDecline(self, component):
         """
-        Marke attendee as DECLINED in the component.
+        Mark attendee as DECLINED in the component.
 
         @param component:
         @type component:

Modified: CalendarServer/trunk/twistedcaldav/scheduling/processing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/processing.py	2009-04-21 15:33:09 UTC (rev 4050)
+++ CalendarServer/trunk/twistedcaldav/scheduling/processing.py	2009-04-21 15:35:30 UTC (rev 4051)
@@ -24,8 +24,9 @@
 from twistedcaldav.ical import Property
 from twistedcaldav.log import Logger
 from twistedcaldav.method import report_common
+from twistedcaldav.scheduling.cuaddress import normalizeCUAddr
 from twistedcaldav.scheduling.itip import iTipProcessing, iTIPRequestStatus
-from twistedcaldav.scheduling.cuaddress import normalizeCUAddr
+from vobject.icalendar import utc
 import datetime
 import time
 
@@ -442,7 +443,16 @@
     
         for calURL in calendars:
             testcal = (yield self.request.locateResource(calURL))
-            
+
+            # Get the timezone property from the collection, and store in the query filter
+            # for use during the query itself.
+            has_prop = (yield testcal.hasProperty((caldav_namespace, "calendar-timezone"), self.request))
+            if has_prop:
+                tz = (yield testcal.readProperty((caldav_namespace, "calendar-timezone"), self.request))
+                tzinfo = tz.gettzinfo()
+            else:
+                tzinfo = utc
+
             # Now do search for overlapping time-range
             for instance in instances.instances.itervalues():
                 if instance_states[instance]:
@@ -450,9 +460,17 @@
                         # First list is BUSY, second BUSY-TENTATIVE, third BUSY-UNAVAILABLE
                         fbinfo = ([], [], [])
                         
+                        def makeTimedUTC(dt):
+                            if isinstance(dt, datetime.date) and not isinstance(dt, datetime.datetime):
+                                dt = datetime.datetime.fromordinal(dt.toordinal())
+                            if dt.tzinfo is None:
+                                dt = dt.replace(tzinfo=tzinfo).astimezone(utc)
+                            return dt
+                        
                         tr = caldavxml.TimeRange(start="20000101", end="20000101")
-                        tr.start = instance.start
-                        tr.end = instance.end
+                        tr.start = makeTimedUTC(instance.start)
+                        tr.end = makeTimedUTC(instance.end)
+
                         yield report_common.generateFreeBusyInfo(self.request, testcal, fbinfo, tr, 0, uid)
                         
                         # If any fbinfo entries exist we have an overlap

Modified: CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2009-04-21 15:33:09 UTC (rev 4050)
+++ CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2009-04-21 15:35:30 UTC (rev 4051)
@@ -2360,9 +2360,131 @@
                 datetime.datetime(2009, 1, 3, 19, 0, 0, tzinfo=tzutc()),
                 None,
             ),
+            (
+                "3.1 - simple all-day",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.date(2009, 1, 8),
+                """BEGIN:VEVENT
+UID:12345-67890-1
+RECURRENCE-ID;VALUE=DATE:20090108
+DTSTART;VALUE=DATE:20090108
+DTEND;VALUE=DATE:20090109
+END:VEVENT
+""",
+            ),
+            (
+                "3.2 - simple all-day rdate",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=DATE:20090103
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.date(2009, 1, 3),
+                """BEGIN:VEVENT
+UID:12345-67890-1
+RECURRENCE-ID;VALUE=DATE:20090103
+DTSTART;VALUE=DATE:20090103
+DTEND;VALUE=DATE:20090104
+END:VEVENT
+""",
+            ),
+            (
+                "3.3 - multiple all-day rdate",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=DATE:20090103,20090110
+RDATE;VALUE=DATE:20090118
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.date(2009, 1, 10),
+                """BEGIN:VEVENT
+UID:12345-67890-1
+RECURRENCE-ID;VALUE=DATE:20090110
+DTSTART;VALUE=DATE:20090110
+DTEND;VALUE=DATE:20090111
+END:VEVENT
+""",
+            ),
+            (
+                "4.1 - invalid all-day simple",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.date(2009, 1, 3),
+                None,
+            ),
+            (
+                "4.2 - invalid all-day simple rdate",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=DATE:20090104
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.date(2009, 1, 5),
+                None,
+            ),
+            (
+                "4.3 - invalid all-day multiple rdate",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+RRULE:FREQ=WEEKLY
+RDATE;VALUE=DATE:20090104,20090111
+RDATE;VALUE=DATE:20090118
+END:VEVENT
+END:VCALENDAR
+""",
+                datetime.datetime(2009, 1, 19),
+                None,
+            ),
         )
         
         for title, calendar, rid, result in data:
+            if not title.startswith("3"):
+                continue
             ical = Component.fromString(calendar)
             derived = ical.deriveInstance(rid)
             derived = str(derived).replace("\r", "") if derived else None
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090421/0c2ebf88/attachment.html>


More information about the calendarserver-changes mailing list