[CalendarServer-changes] [13983] CalendarServer/branches/release/CalendarServer-6.0-dev/txdav
source_changes at macosforge.org
source_changes at macosforge.org
Fri Sep 19 14:05:34 PDT 2014
Revision: 13983
http://trac.calendarserver.org//changeset/13983
Author: cdaboo at apple.com
Date: 2014-09-19 14:05:34 -0700 (Fri, 19 Sep 2014)
Log Message:
-----------
Make sure reconciled group attendees receive all split scheduling messages.
Modified Paths:
--------------
CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/caldav/datastore/sql.py
CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/who/test/test_group_attendees.py
Modified: CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/caldav/datastore/sql.py 2014-09-19 21:01:09 UTC (rev 13982)
+++ CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/caldav/datastore/sql.py 2014-09-19 21:05:34 UTC (rev 13983)
@@ -2526,7 +2526,7 @@
break_point = DateTime.getToday() + Duration(seconds=config.GroupAttendees.AutoUpdateSecondsFromNow)
rid = splitter.whereSplit(component, break_point=break_point)
if rid is not None:
- yield self.split(onlyThis=True, rid=rid)
+ yield self.split(onlyThis=False, rid=rid)
# remove group link to ensure update (update to unknown hash would work too)
# FIXME: its possible that more than one group id gets updated during this single work item, so we
Modified: CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/who/test/test_group_attendees.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/who/test/test_group_attendees.py 2014-09-19 21:01:09 UTC (rev 13982)
+++ CalendarServer/branches/release/CalendarServer-6.0-dev/txdav/who/test/test_group_attendees.py 2014-09-19 21:05:34 UTC (rev 13983)
@@ -1099,6 +1099,26 @@
END:VCALENDAR
"""
+ data_get_1_user01 = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:event1 at ninevah.local
+DTSTART:20120101T100000Z
+DURATION:PT1H
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=Group 01;CUTYPE=X-SERVER-GROUP;EMAIL=group01 at example.com:urn:x-uid:group01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:x-uid:group01";PARTSTAT=NEEDS-ACTION;RSVP=TRUE:urn:x-uid:user01
+CREATED:20060101T150000Z
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:user02
+RRULE:FREQ=DAILY;UNTIL=20240101T100000
+SUMMARY:event 1
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+"""
+
data_get_2 = """BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
@@ -1134,6 +1154,45 @@
END:VCALENDAR
"""
+ data_get_2_user01 = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:event1 at ninevah.local
+{start}DURATION:PT1H
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=Group 01;CUTYPE=X-SERVER-GROUP;EMAIL=group01 at example.com:urn:x-uid:group01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:x-uid:group01";PARTSTAT=NEEDS-ACTION;RSVP=TRUE:urn:x-uid:user01
+CREATED:20060101T150000Z
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:user02
+{relatedTo}RRULE:FREQ=DAILY;UNTIL=20240101T100000
+SEQUENCE:2
+STATUS:CANCELLED
+SUMMARY:event 1
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+"""
+ data_get_3_user01 = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+{uid}DTSTART:20120101T100000Z
+DURATION:PT1H
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=Group 01;CUTYPE=X-SERVER-GROUP;EMAIL=group01 at example.com:urn:x-uid:group01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:x-uid:group01";PARTSTAT=NEEDS-ACTION;RSVP=TRUE:urn:x-uid:user01
+CREATED:20060101T150000Z
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:user02
+{relatedTo}{rule}SEQUENCE:1
+SUMMARY:event 1
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+"""
+
@inlineCallbacks
def expandedMembers(self, records=None, seen=None):
yield None
@@ -1150,7 +1209,12 @@
vcalendar = yield cobj.component()
self.assertEqual(normalize_iCalStr(vcalendar), normalize_iCalStr(data_get_1))
- yield self._verifyObjectResourceCount("user01", 1)
+ cal = yield self.calendarUnderTest(name="calendar", home="user01")
+ cobjs = yield cal.objectResources()
+ self.assertEqual(len(cobjs), 1)
+ vcalendar = yield cobjs[0].componentForUser()
+ self.assertEqual(normalize_iCalStr(vcalendar), normalize_iCalStr(data_get_1_user01))
+ user01_cname = cobjs[0].name()
self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)
@@ -1166,43 +1230,51 @@
for component in vcalendar.subcomponents():
if component.name() in ignoredComponents:
continue
- relatedTo = component.getProperty("RELATED-TO")
- start = component.getProperty("DTSTART")
- rule = component.getProperty("RRULE")
- uid = component.getProperty("UID")
+ props = {
+ "relatedTo": component.getProperty("RELATED-TO"),
+ "start": component.getProperty("DTSTART"),
+ "rule": component.getProperty("RRULE"),
+ "uid": component.getProperty("UID"),
+ }
break
if cobj.name() == "data1.ics":
self.assertEqual(
normalize_iCalStr(vcalendar),
normalize_iCalStr(
- data_get_2.format(
- start=start,
- relatedTo=relatedTo,
- )
+ data_get_2.format(**props)
)
)
+ props_orig = props
else:
self.assertEqual(
normalize_iCalStr(vcalendar),
normalize_iCalStr(
- data_get_3.format(
- relatedTo=relatedTo,
- rule=rule,
- uid=uid
- )
+ data_get_3.format(**props)
)
)
+ props_new = props
- # TODO: add some meaningful test
- '''
cal = yield self.calendarUnderTest(name="calendar", home="user01")
cobjs = yield cal.objectResources()
for cobj in cobjs:
- vcalendar = yield cobj.component()
- print("vcalendar = %s" % (vcalendar,))
- '''
+ vcalendar = yield cobj.componentForUser()
+ if cobj.name() == user01_cname:
+ self.assertEqual(
+ normalize_iCalStr(vcalendar),
+ normalize_iCalStr(
+ data_get_2_user01.format(**props_orig)
+ )
+ )
+ else:
+ self.assertEqual(
+ normalize_iCalStr(vcalendar),
+ normalize_iCalStr(
+ data_get_3_user01.format(**props_new)
+ )
+ )
+
@inlineCallbacks
def test_groupChangeLargerSpanningEvent(self):
"""
@@ -1263,6 +1335,7 @@
END:VEVENT
END:VCALENDAR
"""
+
data_get_3 = """BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
@@ -1280,6 +1353,27 @@
END:VCALENDAR
"""
+ data_get_2_user01 = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:event1 at ninevah.local
+{start}DURATION:PT1H
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=Group 01;CUTYPE=X-SERVER-GROUP;EMAIL=group01 at example.com:urn:x-uid:group01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:x-uid:group01";PARTSTAT=NEEDS-ACTION;RSVP=TRUE:urn:x-uid:user01
+CREATED:20060101T150000Z
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:user02
+{relatedTo}RRULE:FREQ=DAILY;UNTIL=20240101T100000
+SEQUENCE:2
+SUMMARY:event 1
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+"""
+
+
@inlineCallbacks
def expandedMembers(self, records=None, seen=None):
yield None
@@ -1315,44 +1409,40 @@
for component in vcalendar.subcomponents():
if component.name() in ignoredComponents:
continue
- relatedTo = component.getProperty("RELATED-TO")
- start = component.getProperty("DTSTART")
- rule = component.getProperty("RRULE")
- uid = component.getProperty("UID")
+ props = {
+ "relatedTo": component.getProperty("RELATED-TO"),
+ "start": component.getProperty("DTSTART"),
+ "rule": component.getProperty("RRULE"),
+ "uid": component.getProperty("UID"),
+ }
break
if cobj.name() == "data1.ics":
self.assertEqual(
normalize_iCalStr(vcalendar),
normalize_iCalStr(
- data_get_2.format(
- start=start,
- relatedTo=relatedTo,
- )
+ data_get_2.format(**props)
)
)
+ props_orig = props
else:
self.assertEqual(
normalize_iCalStr(vcalendar),
normalize_iCalStr(
- data_get_3.format(
- relatedTo=relatedTo,
- rule=rule,
- uid=uid
- )
+ data_get_3.format(**props)
)
)
- yield self._verifyObjectResourceCount("user01", 1)
- # TODO: add some meaningful test
- '''
cal = yield self.calendarUnderTest(name="calendar", home="user01")
cobjs = yield cal.objectResources()
- for cobj in cobjs:
- vcalendar = yield cobj.component()
- print("vcalendar = %s" % (vcalendar,))
- '''
+ self.assertEqual(len(cobjs), 1)
+ vcalendar = yield cobjs[0].componentForUser()
+ self.assertEqual(
+ normalize_iCalStr(vcalendar),
+ normalize_iCalStr(data_get_2_user01.format(**props_orig))
+ )
+
@inlineCallbacks
def test_groupRemovalFromDirectory(self):
"""
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140919/09ff3533/attachment-0001.html>
More information about the calendarserver-changes
mailing list