[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