[CalendarServer-changes] [15558] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Wed Apr 27 13:55:08 PDT 2016
Revision: 15558
http://trac.calendarserver.org//changeset/15558
Author: cdaboo at apple.com
Date: 2016-04-27 13:55:07 -0700 (Wed, 27 Apr 2016)
Log Message:
-----------
Make sure push notifications can propagate from pod-to-pod to ensure sharees are notified properly.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/resource.py
CalendarServer/trunk/twistedcaldav/sharing.py
CalendarServer/trunk/twistedcaldav/storebridge.py
CalendarServer/trunk/twistedcaldav/test/test_sharing.py
CalendarServer/trunk/txdav/caldav/datastore/sql.py
CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py
CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_external.py
CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py
CalendarServer/trunk/txdav/carddav/datastore/sql.py
CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py
CalendarServer/trunk/txdav/common/datastore/podding/sharing_invites.py
CalendarServer/trunk/txdav/common/datastore/podding/test/util.py
CalendarServer/trunk/txdav/common/datastore/sql.py
CalendarServer/trunk/txdav/common/datastore/sql_external.py
CalendarServer/trunk/txdav/common/datastore/sql_sharing.py
CalendarServer/trunk/txdav/common/datastore/test/test_sql.py
CalendarServer/trunk/txdav/common/datastore/test/util.py
CalendarServer/trunk/txdav/who/test/test_group_sharees.py
Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/twistedcaldav/resource.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -546,7 +546,7 @@
customxml.AllowedSharingModes.qname(),
customxml.SharedURL.qname(),
)
- if self.isShared() or self.isShareeResource():
+ if self.isSharedByOwner() or self.isShareeResource():
baseProperties += (
customxml.Invite.qname(),
)
Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/twistedcaldav/sharing.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -79,7 +79,7 @@
))
# See if this property is on the shared calendar
- if self.isShared():
+ if self.isSharedByOwner():
invitations = yield self.validateInvites(request)
returnValue(customxml.Invite(
*[(yield invitePropertyElement(invitation)) for invitation in invitations]
@@ -220,12 +220,12 @@
))
- def isShared(self):
+ def isSharedByOwner(self):
"""
Return True if this is an owner shared calendar collection.
"""
try:
- return self._newStoreObject.isShared() if self._newStoreObject else False
+ return self._newStoreObject.isSharedByOwner() if self._newStoreObject else False
except AttributeError:
return False
@@ -731,7 +731,7 @@
numRecords = len(invites)
# Set the sharing state on the collection
- shared = self.isShared()
+ shared = self.isSharedByOwner()
if shared and numRecords == 0:
yield self.downgradeFromShare(request)
elif not shared and numRecords != 0:
Modified: CalendarServer/trunk/twistedcaldav/storebridge.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/storebridge.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/twistedcaldav/storebridge.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -1195,7 +1195,7 @@
def resourceType(self):
- if self.isShared():
+ if self.isSharedByOwner():
return customxml.ResourceType.sharedownercalendar
elif self.isShareeResource():
return customxml.ResourceType.sharedcalendar
@@ -3315,7 +3315,7 @@
def resourceType(self):
- if self.isShared():
+ if self.isSharedByOwner():
return customxml.ResourceType.sharedowneraddressbook
elif self.isShareeResource():
return customxml.ResourceType.sharedaddressbook
@@ -3585,7 +3585,7 @@
def resourceType(self):
- if self.isShared():
+ if self.isSharedByOwner():
return customxml.ResourceType.sharedownergroup
elif self.isShareeResource():
return customxml.ResourceType.sharedgroup
@@ -3610,7 +3610,7 @@
abCollectionResource = (yield request.locateResource(parentForURL(request.uri)))
returnValue((yield abCollectionResource.storeRemove(request)))
- elif self.isShared():
+ elif self.isSharedByOwner():
yield self.downgradeFromShare(request)
response = (
Modified: CalendarServer/trunk/twistedcaldav/test/test_sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_sharing.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/twistedcaldav/test/test_sharing.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -239,7 +239,7 @@
rtype = self.resource.resourceType()
self.assertEquals(rtype, regularCalendarType)
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
isShareeResource = self.resource.isShareeResource()
self.assertFalse(isShareeResource)
@@ -248,7 +248,7 @@
rtype = self.resource.resourceType()
self.assertEquals(rtype, sharedOwnerType)
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
isShareeResource = self.resource.isShareeResource()
self.assertFalse(isShareeResource)
@@ -261,7 +261,7 @@
rtype = self.resource.resourceType()
self.assertEquals(rtype, sharedOwnerType)
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
isShareeResource = self.resource.isShareeResource()
self.assertFalse(isShareeResource)
@@ -270,7 +270,7 @@
rtype = self.resource.resourceType()
self.assertEquals(rtype, regularCalendarType)
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
isShareeResource = self.resource.isShareeResource()
self.assertFalse(isShareeResource)
@@ -302,7 +302,7 @@
)
))
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
isShareeResource = self.resource.isShareeResource()
self.assertFalse(isShareeResource)
@@ -332,7 +332,7 @@
)
))
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
isShareeResource = (yield self.resource.isShareeResource())
self.assertFalse(isShareeResource)
@@ -341,7 +341,7 @@
@inlineCallbacks
def test_POSTupdateInvitee(self):
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
yield self._doPOST("""<?xml version="1.0" encoding="utf-8" ?>
@@ -354,7 +354,7 @@
</CS:share>
""")
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
yield self._doPOST("""<?xml version="1.0" encoding="utf-8" ?>
@@ -367,7 +367,7 @@
</CS:share>
""")
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
propInvite = (yield self.resource.readProperty(customxml.Invite, None))
@@ -385,7 +385,7 @@
@inlineCallbacks
def test_POSTremoveInvitee(self):
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
yield self._doPOST("""<?xml version="1.0" encoding="utf-8" ?>
@@ -398,7 +398,7 @@
</CS:share>
""")
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertTrue(isShared)
yield self._doPOST("""<?xml version="1.0" encoding="utf-8" ?>
@@ -409,7 +409,7 @@
</CS:share>
""")
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
propInvite = (yield self.resource.readProperty(customxml.Invite, None))
@@ -868,7 +868,7 @@
</CS:share>
""")
- isShared = self.resource.isShared()
+ isShared = self.resource.isSharedByOwner()
self.assertFalse(isShared)
propInvite = (yield self.resource.readProperty(customxml.Invite, None))
Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -88,7 +88,8 @@
_ATTACHMENTS_MODE_READ, _ATTACHMENTS_MODE_WRITE, _BIND_MODE_DIRECT, \
_BIND_MODE_GROUP, _BIND_MODE_GROUP_READ, _BIND_MODE_GROUP_WRITE, \
_BIND_MODE_OWN, _BIND_MODE_READ, _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED, \
- _TRANSP_OPAQUE, _TRANSP_TRANSPARENT, schema, _CHILD_TYPE_TRASH
+ _TRANSP_OPAQUE, _TRANSP_TRANSPARENT, schema, _CHILD_TYPE_TRASH, \
+ _HOME_STATUS_NORMAL
from txdav.common.datastore.sql_sharing import SharingInvitation
from txdav.common.icommondatastore import IndexedSearchException, \
InternalDataStoreError, HomeChildNameAlreadyExistsError, \
@@ -2588,6 +2589,7 @@
self.ownerHome().id(),
guid,
0,
+ _HOME_STATUS_NORMAL,
gmode,
_BIND_STATUS_ACCEPTED,
"",
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -223,7 +223,7 @@
"""
calendar_collection = (yield self.calendarUnderTest(home="user01"))
- calendar_collection.setSupportedComponents("VTODO")
+ yield calendar_collection.setSupportedComponents("VTODO")
calendar = Component.fromString(data1)
yield self.failUnlessFailure(calendar_collection.createCalendarObjectWithName("test.ics", calendar), InvalidComponentTypeError)
yield self.commit()
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_external.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_external.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_external.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -25,6 +25,8 @@
from txdav.common.datastore.podding.test.util import MultiStoreConduitTest
from txdav.common.datastore.podding.base import FailedCrossPodRequestError
from txdav.common.icommondatastore import ExternalShareFailed
+from twistedcaldav.ical import Component
+from operator import methodcaller, itemgetter
class BaseSharingTests(MultiStoreConduitTest):
@@ -59,6 +61,21 @@
END:VCALENDAR
"""
+ cal2 = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:uid2
+DTSTART:20131123T140000
+DURATION:PT1H
+CREATED:20060102T190000Z
+DTSTAMP:20051222T210507Z
+SUMMARY:event 2
+END:VEVENT
+END:VCALENDAR
+"""
+
@classproperty(cache=False)
def requirements(cls): #@NoSelf
return {
@@ -104,7 +121,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -117,7 +134,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("puser02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -132,7 +149,7 @@
inviteUID = shareeView.shareUID()
sharedName = shareeView.name()
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -153,7 +170,7 @@
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -163,9 +180,9 @@
yield self.commitTransaction(1)
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield calendar.setShared(False)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -178,7 +195,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("puser02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -187,7 +204,7 @@
inviteUID = shareeView.shareUID()
sharedName = shareeView.name()
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -213,7 +230,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -231,7 +248,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -244,7 +261,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("puser02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -253,7 +270,7 @@
inviteUID = shareeView.shareUID()
sharedName = shareeView.name()
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -280,7 +297,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -298,7 +315,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -312,7 +329,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("puser02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -321,7 +338,7 @@
sharedName = shareeView.name()
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -348,7 +365,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commitTransaction(0)
@@ -366,7 +383,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -505,7 +522,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.directShareWithUser("puser02")
invites = yield calendar.sharingInvites()
@@ -591,7 +608,7 @@
calendar = yield self.calendarUnderTest(txn=self.theTransactionUnderTest(0), home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self.assertFailure(calendar.inviteUIDToShare("puser02", _BIND_MODE_READ, "summary"), FailedCrossPodRequestError)
@@ -738,7 +755,51 @@
yield self.commitTransaction(1)
+ @inlineCallbacks
+ def test_shared_notifications(self):
+ shared_name_puser02 = yield self.createShare()
+ shared_name_user02 = yield self.createShare(shareeGUID="user02", pod=0)
+ map(methodcaller("reset"), self.theNotifiers)
+
+ # Change by owner
+ home = yield self.homeUnderTest(txn=self.theTransactionUnderTest(0), name="user01")
+ self.assertEquals(home.notifierID(), ("CalDAV", "user01",))
+ calendar = yield home.calendarWithName("calendar")
+ yield calendar.createObjectResourceWithName("2.ics", Component.fromString(self.cal2))
+ yield self.commitTransaction(0)
+
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[0].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[1].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ map(methodcaller("reset"), self.theNotifiers)
+
+ # Change by sharee on other pod
+ txn2 = self.theTransactionUnderTest(1)
+ home = yield self.homeUnderTest(txn=txn2, name="puser02")
+ self.assertEquals(home.notifierID(), ("CalDAV", "puser02",))
+ calendar = yield home.calendarWithName(shared_name_puser02)
+ cobj = yield calendar.calendarObjectWithName("2.ics")
+ yield cobj.remove()
+ yield self.commitTransaction(1)
+
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[0].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[1].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ map(methodcaller("reset"), self.theNotifiers)
+
+ # Change by sharee on same pod
+ txn2 = self.theTransactionUnderTest(0)
+ home = yield self.homeUnderTest(txn=txn2, name="user02")
+ self.assertEquals(home.notifierID(), ("CalDAV", "user02",))
+ calendar = yield home.calendarWithName(shared_name_user02)
+ yield calendar.createObjectResourceWithName("2_1.ics", Component.fromString(self.cal2))
+ yield self.commitTransaction(0)
+
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[0].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ self.assertEqual(set(map(itemgetter(0), self.theNotifiers[1].history)), set(["/CalDAV/example.com/user01/", "/CalDAV/example.com/user01/calendar/"]))
+ map(methodcaller("reset"), self.theNotifiers)
+
+
+
class SharingRevisions(BaseSharingTests):
"""
Test store-based sharing and interaction with revision table.
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -132,7 +132,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -145,7 +145,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -166,7 +166,7 @@
notifications = yield notifyHome.listNotificationObjects()
self.assertEqual(notifications, [inviteUID + ".xml", ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -183,14 +183,14 @@
notifications = yield notifyHome.listNotificationObjects()
self.assertEqual(notifications, [])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield calendar.setShared(False)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -203,7 +203,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -218,7 +218,7 @@
notifications = yield notifyHome.listNotificationObjects()
self.assertEqual(notifications, [inviteUID + ".xml", ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -234,7 +234,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -250,7 +250,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -263,7 +263,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -278,7 +278,7 @@
notifications = yield notifyHome.listNotificationObjects()
self.assertEqual(notifications, [inviteUID + ".xml", ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -294,7 +294,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -310,7 +310,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -324,7 +324,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield calendar.sharingInvites()
@@ -339,7 +339,7 @@
notifications = yield notifyHome.listNotificationObjects()
self.assertEqual(notifications, [inviteUID + ".xml", ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -355,7 +355,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -371,7 +371,7 @@
self.assertEqual(notifications, [inviteUID + "-reply.xml", ])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -450,7 +450,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.directShareWithUser("user02")
invites = yield calendar.sharingInvites()
@@ -498,7 +498,7 @@
)
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.directShareWithUser("user02")
invites = yield calendar.sharingInvites()
@@ -735,7 +735,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group01", _BIND_MODE_READ, "summary")
@@ -743,7 +743,7 @@
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -758,9 +758,9 @@
yield self._check_notifications("user01", [])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield calendar.setShared(False)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -773,7 +773,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -790,7 +790,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -798,12 +798,12 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 3)
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield calendar.uninviteUIDFromShare("group02")
uninvites = yield calendar.sharingInvites()
self.assertEqual(len(uninvites), 0)
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
for invite in invites:
yield self._check_notifications(invite.shareeUID, [])
@@ -811,9 +811,9 @@
yield self.commit()
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield calendar.setShared(False)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
@inlineCallbacks
@@ -826,7 +826,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -843,7 +843,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -855,7 +855,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -867,7 +867,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -880,7 +880,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -897,7 +897,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -909,7 +909,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -921,7 +921,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -934,7 +934,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -951,7 +951,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -963,7 +963,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -975,7 +975,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -988,7 +988,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -1005,7 +1005,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1017,7 +1017,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1029,7 +1029,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -1042,7 +1042,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViews), 3)
@@ -1059,7 +1059,7 @@
self.assertEqual(invite.summary, "summary")
yield self._check_notifications(invite.shareeUID, [invite.uid, ])
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1071,7 +1071,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1090,7 +1090,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
@inlineCallbacks
@@ -1103,7 +1103,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_WRITE, "summary")
self.assertEqual(len(shareeViewsGroup02), 3)
@@ -1133,7 +1133,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1148,7 +1148,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViewsGroup02), 3)
@@ -1178,7 +1178,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1221,7 +1221,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_WRITE, "summary")
self.assertEqual(len(shareeViewsGroup02), 3)
@@ -1251,7 +1251,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1300,7 +1300,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewUser07 = yield calendar.inviteUIDToShare("user07", _BIND_MODE_READ, "summary")
self.assertNotEqual(shareeViewUser07, None)
@@ -1331,7 +1331,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1372,7 +1372,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewUser07 = yield calendar.directShareWithUser("user07")
self.assertNotEqual(shareeViewUser07, None)
@@ -1412,7 +1412,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites if invite.shareeUID != "user07"])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1452,7 +1452,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
self.assertEqual(len(shareeViewsGroup02), 3)
@@ -1484,7 +1484,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1527,7 +1527,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
self.assertEqual(len(shareeViewsGroup02), 3)
@@ -1559,7 +1559,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites if invite.shareeUID != "user07"])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1603,7 +1603,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewUser07 = yield calendar.inviteUIDToShare("user07", _BIND_MODE_READ, "summary")
self.assertNotEqual(shareeViewUser07, None)
@@ -1637,7 +1637,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
@@ -1696,7 +1696,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViewUser07 = yield calendar.inviteUIDToShare("user07", _BIND_MODE_WRITE)
self.assertNotEqual(shareeViewUser07, None)
@@ -1730,7 +1730,7 @@
yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
- self.assertTrue(calendar.isShared())
+ self.assertTrue(calendar.isSharedByOwner())
yield self.commit()
Modified: CalendarServer/trunk/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/sql.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/carddav/datastore/sql.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -1831,13 +1831,14 @@
)
result = []
- for homeUID, homeRID, resourceID, resourceName, bindMode, bindStatus, bindMessage in acceptedRows: #@UnusedVariable
+ for homeUID, homeRID, homeStatus, resourceID, resourceName, bindMode, bindStatus, bindMessage in acceptedRows: #@UnusedVariable
invite = SharingInvitation(
resourceName,
self.addressbook()._home.name(),
self.addressbook()._home.id(),
homeUID,
homeRID,
+ homeStatus,
bindMode,
bindStatus,
bindMessage,
Modified: CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -249,7 +249,7 @@
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
invites = yield addressbook.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(addressbook.isShared())
+ self.assertFalse(addressbook.isSharedByOwner())
@inlineCallbacks
@@ -262,7 +262,7 @@
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
invites = yield addressbook.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(addressbook.isShared())
+ self.assertFalse(addressbook.isSharedByOwner())
shareeView = yield addressbook.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield addressbook.sharingInvites()
@@ -281,7 +281,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
@@ -289,7 +289,7 @@
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
invites = yield addressbook.sharingInvites()
self.assertEqual(len(invites), 1)
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield addressbook.uninviteUIDFromShare("user02")
invites = yield addressbook.sharingInvites()
@@ -297,12 +297,12 @@
yield self._check_notifications("user02", [])
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
- self.assertFalse(addressbook.isShared())
+ self.assertFalse(addressbook.isSharedByOwner())
@inlineCallbacks
@@ -315,7 +315,7 @@
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
invites = yield addressbook.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(addressbook.isShared())
+ self.assertFalse(addressbook.isSharedByOwner())
shareeView = yield addressbook.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield addressbook.sharingInvites()
@@ -328,7 +328,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
@@ -343,7 +343,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
@@ -358,7 +358,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
@inlineCallbacks
@@ -371,7 +371,7 @@
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
invites = yield addressbook.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(addressbook.isShared())
+ self.assertFalse(addressbook.isSharedByOwner())
shareeView = yield addressbook.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield addressbook.sharingInvites()
@@ -384,7 +384,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
@@ -398,7 +398,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
yield self.commit()
@@ -412,7 +412,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
addressbook = yield self.addressbookUnderTest(home="user01", name="addressbook")
- self.assertTrue(addressbook.isShared())
+ self.assertTrue(addressbook.isSharedByOwner())
@inlineCallbacks
@@ -593,7 +593,7 @@
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(group.isShared())
+ self.assertFalse(group.isSharedByOwner())
shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield group.sharingInvites()
@@ -606,7 +606,7 @@
self.assertEqual(invites[0].summary, "summary")
inviteUID = shareeView.shareUID()
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -616,7 +616,7 @@
yield self._check_notifications("user02", [inviteUID, ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -624,19 +624,19 @@
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 1)
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield group.uninviteUIDFromShare("user02")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self._check_notifications("user02", [])
yield self.commit()
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertFalse(group.isShared())
+ self.assertFalse(group.isSharedByOwner())
@inlineCallbacks
@@ -649,7 +649,7 @@
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(group.isShared())
+ self.assertFalse(group.isSharedByOwner())
shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield group.sharingInvites()
@@ -661,7 +661,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -673,7 +673,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -685,7 +685,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
@inlineCallbacks
@@ -698,7 +698,7 @@
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(group.isShared())
+ self.assertFalse(group.isSharedByOwner())
shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield group.sharingInvites()
@@ -710,7 +710,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -724,7 +724,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -738,7 +738,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
@inlineCallbacks
@@ -752,7 +752,7 @@
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
invites = yield group.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(group.isShared())
+ self.assertFalse(group.isSharedByOwner())
shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
invites = yield group.sharingInvites()
@@ -764,7 +764,7 @@
yield self._check_notifications("user02", [inviteUID, ])
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -776,7 +776,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
yield self.commit()
@@ -790,7 +790,7 @@
yield self._check_notifications("user01", [inviteUID + "-reply", ])
group = yield self.addressbookObjectUnderTest(home="user01", addressbook_name="addressbook", name="group1.vcf")
- self.assertTrue(group.isShared())
+ self.assertTrue(group.isSharedByOwner())
@inlineCallbacks
Modified: CalendarServer/trunk/txdav/common/datastore/podding/sharing_invites.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/podding/sharing_invites.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/podding/sharing_invites.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -14,10 +14,13 @@
# limitations under the License.
##
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.defer import inlineCallbacks, returnValue, DeferredList
from txdav.common.datastore.podding.base import FailedCrossPodRequestError
+from txdav.common.datastore.sql_tables import _HOME_STATUS_EXTERNAL
+from twext.python.log import Logger
+log = Logger()
class SharingInvitesConduitMixin(object):
"""
@@ -239,3 +242,76 @@
request["status"],
summary=request.get("summary")
)
+
+
+ @inlineCallbacks
+ def send_sharenotification(
+ self, txn, homeType, ownerUID,
+ bindUID, shareeUIDs,
+ ):
+ """
+ Send a sharing notification cross-pod message for the specified sharees. Note that we
+ will aggregate sharees by their pod and send only one message to each pod. Will do this
+ using a DeferredList that ignores any errors.
+
+ @param homeType: Type of home being shared.
+ @type homeType: C{int}
+
+ @param ownerUID: UID of the sharer.
+ @type ownerUID: C{str}
+ @param bindUID: bind UID of the sharer calendar
+ @type bindUID: C{str}
+
+ @param shareeUIDs: UIDs of the sharees
+ @type shareeUIDs: C{str}
+ """
+
+ recipients = {}
+ for shareeUID in shareeUIDs:
+ _ignore_sender, recipient = yield self.validRequest(
+ ownerUID, shareeUID
+ )
+ recipients[recipient.server().id] = recipient.server()
+
+ request = {
+ "action": "sharenotification",
+ "type": homeType,
+ "ownerUID": ownerUID,
+ "bindUID": bindUID,
+ }
+
+ deferreds = []
+ for server in recipients.values():
+ deferreds.append(self.sendRequestToServer(txn, server, request))
+
+ # Always trap errors and ignore them as we want share notifications to be
+ # "fire and forget"
+ try:
+ yield DeferredList(deferreds, consumeErrors=True)
+ except Exception as ex:
+ log.error("Failed to send sharenotification: {exc}", exc=ex)
+
+
+ @inlineCallbacks
+ def recv_sharenotification(self, txn, request):
+ """
+ Process a sharing notification cross-pod request.
+ Request arguments as per L{send_sharenotification}.
+
+ @param request: request arguments
+ @type request: C{dict}
+ """
+
+ # Sharer home/calendar on this pod must already exist - however, we are going to ignore these
+ # failures as we want notifications to be "fire and forget". Plus we do get a notification
+ # when a share is removed, but AFTER the uninvite has been processed and the bind entries removed.
+ # We definitely do not want to treat that as a failure.
+ ownerHome = yield txn.homeWithUID(request["type"], request["ownerUID"], status=_HOME_STATUS_EXTERNAL)
+ if ownerHome is None:
+ returnValue(None)
+ ownerCalendar = yield ownerHome.childWithBindUID(request["bindUID"])
+ if ownerCalendar is None:
+ returnValue(None)
+
+ # Send the notification
+ yield ownerCalendar.notifyChanged()
Modified: CalendarServer/trunk/txdav/common/datastore/podding/test/util.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/podding/test/util.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/podding/test/util.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -24,9 +24,7 @@
from txdav.common.datastore.podding.conduit import PoddingConduit
from txdav.common.datastore.podding.request import ConduitRequest
from txdav.common.datastore.sql_tables import _BIND_MODE_WRITE
-from txdav.common.datastore.test.util import (
- CommonCommonTests, SQLStoreBuilder, buildTestDirectory
-)
+from txdav.common.datastore.test.util import CommonCommonTests, SQLStoreBuilder, buildTestDirectory, StubNotifierFactory
import txweb2.dav.test.util
from txweb2 import responsecode
@@ -150,6 +148,7 @@
theStoreBuilders = []
theStores = []
+ theNotifiers = []
activeTransactions = []
accounts = None
augments = None
@@ -161,6 +160,7 @@
SQLStoreBuilder(count=len(self.theStoreBuilders))
)
self.theStores = [None] * self.numberOfStores
+ self.theNotifiers = [None] * self.numberOfStores
self.activeTransactions = [None] * self.numberOfStores
@@ -187,9 +187,12 @@
augments=self.augments,
)
self.theStores[i] = self.store
+ self.theNotifiers[i] = self.notifierFactory
else:
+ self.theNotifiers[i] = StubNotifierFactory()
self.theStores[i] = yield self.buildStore(
- self.theStoreBuilders[i]
+ self.theStoreBuilders[i],
+ notifierFactory=self.theNotifiers[i],
)
directory = buildTestDirectory(
self.theStores[i],
@@ -272,7 +275,7 @@
@inlineCallbacks
def createShare(
- self, ownerGUID="user01", shareeGUID="puser02", name="calendar"
+ self, ownerGUID="user01", shareeGUID="puser02", name="calendar", pod=1
):
home = yield self.homeUnderTest(
@@ -286,10 +289,10 @@
# ACK: home2 is None
home2 = yield self.homeUnderTest(
- txn=self.theTransactionUnderTest(1), name=shareeGUID
+ txn=self.theTransactionUnderTest(pod), name=shareeGUID
)
yield home2.acceptShare("shared-calendar")
- yield self.commitTransaction(1)
+ yield self.commitTransaction(pod)
returnValue("shared-calendar")
Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -3690,7 +3690,7 @@
@return: a L{Deferred} which fires when the modification is complete.
"""
- if self.isShared() or self.external():
+ if not self.owned() or self.external():
raise ShareNotAllowed("Cannot rename a shared collection")
oldName = self._name
@@ -4507,7 +4507,10 @@
if notifier:
yield notifier.notify(self._txn, priority=category.value)
+ if not self.external():
+ yield self.notifyExternalShare()
+
@classproperty
def _lockLastModifiedQuery(cls):
schema = cls._homeChildMetaDataSchema
Modified: CalendarServer/trunk/txdav/common/datastore/sql_external.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_external.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/sql_external.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -70,8 +70,13 @@
def initFromStore(self):
"""
- NoOp for an external share as there is no metadata or properties.
+ External share does not have metadata or properties so we skip those by by-passing
+ the super method, but we do need to add notifiers.
"""
+
+ for factory_type, factory in self._txn._notifierFactories.items():
+ self.addNotifier(factory_type, factory.newNotifier(self))
+
return succeed(self)
Modified: CalendarServer/trunk/txdav/common/datastore/sql_sharing.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_sharing.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/sql_sharing.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -274,7 +274,7 @@
SharingInvitation = namedtuple(
"SharingInvitation",
- ["uid", "ownerUID", "ownerHomeID", "shareeUID", "shareeHomeID", "mode", "status", "summary"]
+ ["uid", "ownerUID", "ownerHomeID", "shareeUID", "shareeHomeID", "shareeHomeStatus", "mode", "status", "summary"]
)
@@ -341,6 +341,7 @@
[
home.OWNER_UID,
bind.HOME_RESOURCE_ID,
+ home.STATUS,
bind.RESOURCE_ID,
bind.RESOURCE_NAME,
bind.BIND_MODE,
@@ -579,6 +580,38 @@
@inlineCallbacks
+ def notifyExternalShare(self):
+ """
+ Send a cross-pod message to all external shares to ensure change notifications are sent
+ to external sharees' clients subscribed to notifications on the other pods.
+ """
+
+ # We need to resolve the ownerView which may be this object, or if this is
+ # a shared object, may be something else. The ownerView is the one that
+ # knows about all the sharing invites and the bindUID (which is the identifier
+ # used to identify it on another pod).
+ if not self.owned():
+ ownerView = yield self.ownerView()
+ else:
+ ownerView = self
+
+ # Get all invites and figure out if any are external
+ externalUIDs = set()
+ for invitation in (yield ownerView.sharingInvites()):
+ if invitation.shareeHomeStatus == _HOME_STATUS_EXTERNAL:
+ externalUIDs.add(invitation.shareeUID)
+
+ if externalUIDs and ownerView.bindUID() is not None:
+ yield self._txn.store().conduit.send_sharenotification(
+ self._txn,
+ self.ownerHome()._homeType,
+ self.ownerHome().uid(),
+ ownerView.bindUID(),
+ externalUIDs,
+ )
+
+
+ @inlineCallbacks
def allInvitations(self):
"""
Get list of all invitations (non-direct) to this object.
@@ -1033,13 +1066,14 @@
)
result = []
- for homeUID, homeRID, _ignore_resourceID, resourceName, bindMode, bindStatus, bindMessage in invitedRows:
+ for homeUID, homeRID, homeStatus, _ignore_resourceID, resourceName, bindMode, bindStatus, bindMessage in invitedRows:
invite = SharingInvitation(
resourceName,
self.ownerHome().name(),
self.ownerHome().id(),
homeUID,
homeRID,
+ homeStatus,
bindMode,
bindStatus,
bindMessage,
@@ -1216,7 +1250,7 @@
return self._bindMode == _BIND_MODE_OWN
- def isShared(self):
+ def isSharedByOwner(self):
"""
For an owned collection indicate whether it is shared.
Modified: CalendarServer/trunk/txdav/common/datastore/test/test_sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/test/test_sql.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/test/test_sql.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -310,6 +310,7 @@
pass
class TestCommonHomeChild(CommonHomeChild):
+ _homeSchema = schema.CALENDAR_HOME
_homeChildSchema = schema.CALENDAR
_homeChildMetaDataSchema = schema.CALENDAR_METADATA
_bindSchema = schema.CALENDAR_BIND
Modified: CalendarServer/trunk/txdav/common/datastore/test/util.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/test/util.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/common/datastore/test/util.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -856,14 +856,14 @@
self.config = config
- def buildStore(self, storeBuilder=theStoreBuilder):
+ def buildStore(self, storeBuilder=theStoreBuilder, notifierFactory=None):
"""
Builds and returns a store
"""
# Build the store before the directory; the directory will be assigned
# to the store via setDirectoryService()
- return storeBuilder.buildStore(self, self.notifierFactory, None)
+ return storeBuilder.buildStore(self, notifierFactory if notifierFactory is not None else self.notifierFactory, None)
def transactionUnderTest(self, txn=None):
Modified: CalendarServer/trunk/txdav/who/test/test_group_sharees.py
===================================================================
--- CalendarServer/trunk/txdav/who/test/test_group_sharees.py 2016-04-27 18:23:41 UTC (rev 15557)
+++ CalendarServer/trunk/txdav/who/test/test_group_sharees.py 2016-04-27 20:55:07 UTC (rev 15558)
@@ -133,7 +133,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group04", _BIND_MODE_READ)
@@ -217,7 +217,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group04", _BIND_MODE_READ)
@@ -301,7 +301,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
@@ -384,7 +384,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group05", _BIND_MODE_READ)
@@ -465,7 +465,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group06", _BIND_MODE_READ)
@@ -549,7 +549,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="shared")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
@@ -630,7 +630,7 @@
calendar = yield self.calendarUnderTest(home="user01", name="shared")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
yield self._check_notifications("user01", [])
shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
@@ -704,7 +704,7 @@
calendar = yield self.calendarUnderTest(home="user03", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeViews = yield calendar.inviteUIDToShare("group05", _BIND_MODE_WRITE)
self.assertEqual(len(shareeViews), 2)
@@ -787,7 +787,7 @@
calendar = yield self.calendarUnderTest(home="user03", name="calendar")
invites = yield calendar.sharingInvites()
self.assertEqual(len(invites), 0)
- self.assertFalse(calendar.isShared())
+ self.assertFalse(calendar.isSharedByOwner())
shareeView = yield calendar.inviteUIDToShare("user01", _BIND_MODE_READ)
self.assertTrue(shareeView is not None)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20160427/0fc1dae1/attachment-0001.html>
More information about the calendarserver-changes
mailing list