[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