[CalendarServer-changes] [13756] CalendarServer/branches/users/gaya/groupsharee2/txdav

source_changes at macosforge.org source_changes at macosforge.org
Mon Jul 14 15:12:05 PDT 2014


Revision: 13756
          http://trac.calendarserver.org//changeset/13756
Author:   gaya at apple.com
Date:     2014-07-14 15:12:05 -0700 (Mon, 14 Jul 2014)
Log Message:
-----------
Checkpoint changes

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/sql.py
    CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/test/test_sql_sharing.py
    CalendarServer/branches/users/gaya/groupsharee2/txdav/common/datastore/sql.py
    CalendarServer/branches/users/gaya/groupsharee2/txdav/who/augment.py
    CalendarServer/branches/users/gaya/groupsharee2/txdav/who/groups.py

Modified: CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/sql.py	2014-07-12 01:30:42 UTC (rev 13755)
+++ CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/sql.py	2014-07-14 22:12:05 UTC (rev 13756)
@@ -1815,13 +1815,24 @@
         """
         return group mode after removing one group sharee or None
         """
-        # if more than one group
+        # count group sharees that self is member of
         gs = schema.GROUP_SHAREE
+        gm = schema.GROUP_MEMBERSHIP
         rows = yield Select(
             [Count(gs.GROUP_ID)],
             From=gs,
-            Where=gs.CALENDAR_ID == self._resourceID
-        ).on(self._txn)
+             Where=(
+                gs.GROUP_ID.In(
+                    Select(
+                        [gm.GROUP_ID],
+                        From=gm,
+                        Where=(
+                            gm.MEMBER_UID == Parameter("uid")
+                        )
+                    )
+                )
+            )
+        ).on(self._txn, uid=self.viewerHome().uid())
         if rows[0][0] > 0:
             # no mode change for group shares
             returnValue(
@@ -1946,20 +1957,24 @@
         yield self.updateShareeGroupLink(shareeUID, mode=mode)
 
         # invite every member of group
-        shareeViews = set()
+        shareeViews = []
         groupID = (yield self._txn.groupByUID(shareeUID))[0]
         memberUIDs = yield self._txn.groupMemberUIDs(groupID)
         for memberUID in memberUIDs:
-            shareeView = yield self.shareeView(memberUID)
-            newMode = _BIND_MODE_GROUP if shareeView is None else shareeView.groupModeAfterAddingOneGroupSharee()
-            if newMode is not None:
-                # everything but direct share
-                shareeView = yield super(Calendar, self).inviteUIDToShare(memberUID, newMode, summary)
-                shareeViews.add(shareeView)
+            if memberUID != self._home.uid():
+                shareeView = yield self.shareeView(memberUID)
+                newMode = _BIND_MODE_GROUP if shareeView is None else shareeView.groupModeAfterAddingOneGroupSharee()
+                if newMode is not None:
+                    # everything but direct
+                    shareeView = yield super(Calendar, self).inviteUIDToShare(memberUID, newMode, summary)
+                    shareeViews.append(shareeView)
 
-        returnValue(shareeViews)
+        # shared even if no sharees
+        yield self.setShared(True)
 
+        returnValue(tuple(shareeViews))
 
+
     @inlineCallbacks
     def directShareWithUser(self, shareeUID, shareName=None):
         """
@@ -2013,17 +2028,17 @@
                 # uninvite each member of group
                 memberUIDs = yield self._txn.groupMemberUIDs(groupID)
                 for memberUID in memberUIDs:
-                    shareeView = yield self.shareeView(memberUID)
-                    if shareeView is not None:
+                    if memberUID != self._home.uid():
+                        shareeView = yield self.shareeView(memberUID)
+                        if shareeView is not None:
+                            newMode = yield shareeView._groupModeAfterRemovingOneGroupSharee()
+                            if newMode is None:
+                                # only group was shared, do delete share
+                                yield super(Calendar, self).uninviteUIDFromShare(memberUID)
+                            else:
+                                # multiple groups or group and individual was shared, update to new mode
+                                yield super(Calendar, self).inviteUIDToShare(memberUID, newMode)
 
-                        newMode = yield shareeView._groupModeAfterRemovingOneGroupSharee()
-                        if newMode is None:
-                            # only group was shared, do delete share
-                            yield super(Calendar, self).uninviteUIDFromShare(memberUID)
-                        else:
-                            # multiple groups or group and individual was shared, update to new mode
-                            yield super(Calendar, self).inviteUIDToShare(memberUID, newMode)
-
                 returnValue(None)
 
         returnValue(

Modified: CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/test/test_sql_sharing.py
===================================================================
--- CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/test/test_sql_sharing.py	2014-07-12 01:30:42 UTC (rev 13755)
+++ CalendarServer/branches/users/gaya/groupsharee2/txdav/caldav/datastore/test/test_sql_sharing.py	2014-07-14 22:12:05 UTC (rev 13756)
@@ -634,24 +634,64 @@
 
 
     @inlineCallbacks
-    def test_invite_sharee(self):
+    def test_invite_empty_group(self):
         """
         Test invite/uninvite creates/removes shares and notifications.
         """
 
+        yield self._check_notifications("user01", [])
+
         # Invite
         calendar = yield self.calendarUnderTest(home="user01", name="calendar")
         invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 0)
         self.assertFalse(calendar.isShared())
 
+        yield self._check_notifications("user01", [])
+        shareeViews = yield calendar.inviteUIDToShare("group01", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViews), 0)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Uninvite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        yield calendar.uninviteUIDFromShare("group01")
+        noinvites = yield calendar.sharingInvites()
+        self.assertEqual(len(noinvites), 0)
+
+        yield self.commit()
+
+        yield self._check_notifications("user01", [])
+
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
+        yield calendar.setShared(False)
+        self.assertFalse(calendar.isShared())
+
+
+    @inlineCallbacks
+    def test_invite_group(self):
+        """
+        Test invite/uninvite creates/removes shares and notifications.
+        """
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
         shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
         self.assertEqual(len(shareeViews), 3)
         invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 3)
         shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
         invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
-        for i in range(3):
+        for i in range(len(invites)):
             self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
             self.assertEqual(invites[i].ownerUID, "user01")
             self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
@@ -676,7 +716,7 @@
         self.assertEqual(len(uninvites), 0)
         self.assertTrue(calendar.isShared())
 
-        for i in range(3):
+        for i in range(len(invites)):
             yield self._check_notifications(invites[i].shareeUID, [])
 
         yield self.commit()
@@ -705,7 +745,7 @@
         self.assertEqual(len(invites), 3)
         shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
         invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
-        for i in range(3):
+        for i in range(len(invites)):
             self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
             self.assertEqual(invites[i].ownerUID, "user01")
             self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
@@ -741,7 +781,7 @@
         calendar = yield self.calendarUnderTest(home="user01", name="calendar")
         self.assertTrue(calendar.isShared())
 
-    '''
+
     @inlineCallbacks
     def test_decline_share(self):
         """
@@ -749,52 +789,54 @@
         """
 
         # Invite
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        invites = yield group.sharingInvites()
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 0)
-        self.assertFalse(group.isShared())
+        self.assertFalse(calendar.isShared())
 
-        shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
-        invites = yield group.sharingInvites()
-        self.assertEqual(len(invites), 1)
-        inviteUID = shareeView.shareUID()
+        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViews), 3)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 3)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
+            self.assertEqual(invites[i].ownerUID, "user01")
+            self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
+            self.assertEqual(invites[i].mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeViews[i].effectiveShareMode()), _BIND_MODE_READ)
+            self.assertEqual(invites[i].status, _BIND_STATUS_INVITED)
+            self.assertEqual(invites[i].summary, "summary")
+            yield self._check_notifications(invites[i].shareeUID, [invites[i].uid, ])
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        self.assertTrue(calendar.isShared())
 
-        yield self._check_notifications("user02", [inviteUID, ])
-
-        self.assertTrue(group.isShared())
-
         yield self.commit()
 
         # Decline
-        shareeHome = yield self.homeUnderTest(name="user02")
-        yield shareeHome.declineShare(inviteUID)
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.declineShare(invite.uid)
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        self.assertTrue(group.isShared())
-
         yield self.commit()
 
         # Re-decline
-        shareeHome = yield self.homeUnderTest(name="user02")
-        yield shareeHome.declineShare(inviteUID)
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.declineShare(invite.uid)
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        self.assertTrue(group.isShared())
 
-
     @inlineCallbacks
     def test_accept_decline_share(self):
         """
@@ -803,49 +845,53 @@
         """
 
         # Invite
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        invites = yield group.sharingInvites()
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 0)
-        self.assertFalse(group.isShared())
+        self.assertFalse(calendar.isShared())
 
-        shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
-        invites = yield group.sharingInvites()
-        self.assertEqual(len(invites), 1)
-        inviteUID = shareeView.shareUID()
+        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViews), 3)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 3)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
+            self.assertEqual(invites[i].ownerUID, "user01")
+            self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
+            self.assertEqual(invites[i].mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeViews[i].effectiveShareMode()), _BIND_MODE_READ)
+            self.assertEqual(invites[i].status, _BIND_STATUS_INVITED)
+            self.assertEqual(invites[i].summary, "summary")
+            yield self._check_notifications(invites[i].shareeUID, [invites[i].uid, ])
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        self.assertTrue(calendar.isShared())
 
-        yield self._check_notifications("user02", [inviteUID, ])
-
-        self.assertTrue(group.isShared())
-
         yield self.commit()
 
         # Accept
-        shareeHome = yield self.homeUnderTest(name="user02")
-        yield shareeHome.acceptShare(inviteUID)
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.acceptShare(invite.uid)
 
-        yield self._check_calendar("user02", "user01", self.group1_children)
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        self.assertTrue(group.isShared())
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
         yield self.commit()
 
         # Decline
-        shareeHome = yield self.homeUnderTest(name="user02")
-        yield shareeHome.declineShare(inviteUID)
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.declineShare(invite.uid)
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        self.assertTrue(group.isShared())
-    '''
 
     @inlineCallbacks
     def test_accept_remove_share(self):
@@ -855,95 +901,238 @@
         """
 
         # Invite
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        invites = yield group.sharingInvites()
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
 
-        shareeView = yield group.inviteUIDToShare("user02", _BIND_MODE_READ, "summary")
-        invites = yield group.sharingInvites()
-        self.assertEqual(len(invites), 1)
-        inviteUID = shareeView.shareUID()
+        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViews), 3)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 3)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
+            self.assertEqual(invites[i].ownerUID, "user01")
+            self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
+            self.assertEqual(invites[i].mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeViews[i].effectiveShareMode()), _BIND_MODE_READ)
+            self.assertEqual(invites[i].status, _BIND_STATUS_INVITED)
+            self.assertEqual(invites[i].summary, "summary")
+            yield self._check_notifications(invites[i].shareeUID, [invites[i].uid, ])
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        self.assertTrue(calendar.isShared())
 
-        yield self._check_notifications("user02", [inviteUID, ])
-
         yield self.commit()
 
         # Accept
-        shareeHome = yield self.homeUnderTest(name="user02")
-        yield shareeHome.acceptShare(inviteUID)
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.acceptShare(invite.uid)
 
-        yield self._check_calendar("user02", "user01", self.group1_children)
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
+
         yield self.commit()
 
         # Delete
-        group = yield self.calendarObjectUnderTest(home="user02", calendar_name="user01", name="group1.vcf")
-        yield group.deleteShare()
+        for invite in invites:
+            shareeCalendar = yield self.calendarUnderTest(home=invite.shareeUID, name=invite.uid)
+            yield shareeCalendar.deleteShare()
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        yield self._check_notifications("user01", [inviteUID + "-reply", ])
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
 
     @inlineCallbacks
+    def test_accept_uninvite_group(self):
+        """
+        Test that invite+accept/decline creates/removes shares and notifications.
+        Decline via the shared collection (removal).
+        """
+
+        # Invite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
+
+        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViews), 3)
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 3)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            self.assertEqual(invites[i].uid, shareeViews[i].shareUID())
+            self.assertEqual(invites[i].ownerUID, "user01")
+            self.assertEqual(invites[i].shareeUID, shareeViews[i].viewerHome().uid())
+            self.assertEqual(invites[i].mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeViews[i].effectiveShareMode()), _BIND_MODE_READ)
+            self.assertEqual(invites[i].status, _BIND_STATUS_INVITED)
+            self.assertEqual(invites[i].summary, "summary")
+            yield self._check_notifications(invites[i].shareeUID, [invites[i].uid, ])
+
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Accept
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.acceptShare(invite.uid)
+
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
+
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+        # Uninvite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        yield calendar.uninviteUIDFromShare("group02")
+        noinvites = yield calendar.sharingInvites()
+        self.assertEqual(len(noinvites), 0)
+
+        yield self.commit()
+
+        # no extra notifications
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
+
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
+
+
+    @inlineCallbacks
     def test_accept_two_groups(self):
         """
         Test that accept of two groups works.
         """
 
-        # Two shares
-        inviteUID1 = yield self._createGroupShare(groupname="group1.vcf")
-        inviteUID2 = yield self._createGroupShare(groupname="group2.vcf")
+        # Invite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
 
-        yield self._check_calendar("user02", "user01", self.all_children)
-        yield self._check_notifications("user01", [inviteUID1 + "-reply", inviteUID2 + "-reply", ])
+        shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_WRITE, "summary")
+        self.assertEqual(len(shareeViewsGroup02), 3)
+        shareeViewsGroup03 = yield calendar.inviteUIDToShare("group03", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViewsGroup03), 3)
+        shareeViews = dict([(shareeView.shareUID(), shareeView) for shareeView in shareeViewsGroup02 + shareeViewsGroup03]).values()
+        self.assertEqual(len(shareeViews), 4)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 4)
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            shareeView = shareeViews[i]
+            invite = invites[i]
+            self.assertEqual(invite.uid, shareeView.shareUID())
+            self.assertEqual(invite.ownerUID, "user01")
+            self.assertEqual(invite.shareeUID, shareeView.viewerHome().uid())
+            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_WRITE if shareeView in shareeViewsGroup02 else _BIND_MODE_READ)
+            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
+            self.assertEqual(invite.summary, "summary")
+            yield self._check_notifications(invite.shareeUID, [invite.uid, ])
 
+        yield self.commit()
 
+        # accept
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.acceptShare(invite.uid)
+
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
+
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
+
+        yield self.commit()
+
+
     @inlineCallbacks
     def test_accept_uninvite_two_groups(self):
         """
         Test that accept of two groups works, then uninvite each one.
         """
 
-        # Two shares
-        inviteUID1 = yield self._createGroupShare(groupname="group1.vcf")
-        inviteUID2 = yield self._createGroupShare(groupname="group2.vcf")
+        # Invite
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 0)
+        self.assertFalse(calendar.isShared())
 
-        yield self._check_calendar("user02", "user01", self.all_children)
-        yield self._check_notifications("user01", [inviteUID1 + "-reply", inviteUID2 + "-reply", ])
+        shareeViewsGroup02 = yield calendar.inviteUIDToShare("group02", _BIND_MODE_WRITE, "summary")
+        self.assertEqual(len(shareeViewsGroup02), 3)
+        shareeViewsGroup03 = yield calendar.inviteUIDToShare("group03", _BIND_MODE_READ, "summary")
+        self.assertEqual(len(shareeViewsGroup03), 3)
+        shareeViews = dict([(shareeView.shareUID(), shareeView) for shareeView in shareeViewsGroup02 + shareeViewsGroup03]).values()
+        self.assertEqual(len(shareeViews), 4)
+        shareeViews = sorted(shareeViews, key=lambda shareeView: shareeView.viewerHome().uid())
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 4)
+        invites = sorted(invites, key=lambda invitee: invitee.shareeUID)
+        for i in range(len(invites)):
+            shareeView = shareeViews[i]
+            invite = invites[i]
+            self.assertEqual(invite.uid, shareeView.shareUID())
+            self.assertEqual(invite.ownerUID, "user01")
+            self.assertEqual(invite.shareeUID, shareeView.viewerHome().uid())
+            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_WRITE if shareeView in shareeViewsGroup02 else _BIND_MODE_READ)
+            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
+            self.assertEqual(invite.summary, "summary")
+            yield self._check_notifications(invite.shareeUID, [invite.uid, ])
 
         yield self.commit()
 
-        # Uninvite one
-        group = yield self.calendarObjectUnderTest(home="user01", calendar_name="calendar", name="group1.vcf")
-        yield group.uninviteUIDFromShare("user02")
-        invites = yield group.sharingInvites()
-        self.assertEqual(len(invites), 0)
+        # accept
+        for invite in invites:
+            shareeHome = yield self.homeUnderTest(name=invite.shareeUID)
+            yield shareeHome.acceptShare(invite.uid)
 
-        yield self._check_calendar("user02", "user01", self.group2_children)
+        yield self._check_notifications("user01", [invite.uid + "-reply" for invite in invites])
 
-        shared = yield self.calendarObjectUnderTest(home="user02", calendar_name="user01", name="group1.vcf")
-        self.assertTrue(shared is None)
-        shared = yield self.calendarObjectUnderTest(home="user02", calendar_name="user01", name="card2.vcf")
-        self.assertTrue(shared is None)
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        self.assertTrue(calendar.isShared())
 
         yield self.commit()
 
+        # Uninvite one
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        yield calendar.uninviteUIDFromShare("group02")
+        invites = yield calendar.sharingInvites()
+        self.assertEqual(len(invites), 3)
+
+        for invite in invites:
+            shareeView = yield self.calendarUnderTest(home=invite.shareeUID, name=invite.uid)
+            self.assertNotEqual(shareeView, None)
+            self.assertEqual(invite.ownerUID, "user01")
+            self.assertEqual(invite.shareeUID, shareeView.viewerHome().uid())
+            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
+            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
+            self.assertEqual(invite.status, _BIND_STATUS_ACCEPTED)
+            self.assertEqual(invite.summary, "summary")
+            yield self._check_notifications(invite.shareeUID, [invite.uid, ])
+
+        yield self.commit()
+
         # Uninvite other
-        group = yield self.calendarObjectUnderTest(home="user02", calendar_name="user01", name="group2.vcf")
-        yield group.uninviteUIDFromShare("user02")
-        invites = yield group.sharingInvites()
+        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
+        yield calendar.uninviteUIDFromShare("group03")
+        invites = yield calendar.sharingInvites()
         self.assertEqual(len(invites), 0)
 
-        sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
-        self.assertTrue(sharedParent is None)
 
-
+    '''
     @inlineCallbacks
     def test_accept_decline_two_groups(self):
         """
@@ -1020,9 +1209,9 @@
 
         sharedParent = yield self.calendarUnderTest(home="user02", name="user01")
         self.assertTrue(sharedParent is None)
+        '''
 
-
-
+'''
 class MixedSharing(BaseSharingTests):
     """
     Test store-based combined address book and group book sharing.
@@ -1184,3 +1373,4 @@
             self.assertEqual(len(changed), 0)
             self.assertEqual(len(deleted), 0)
             self.assertEqual(len(invalid), 0)
+'''

Modified: CalendarServer/branches/users/gaya/groupsharee2/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/groupsharee2/txdav/common/datastore/sql.py	2014-07-12 01:30:42 UTC (rev 13755)
+++ CalendarServer/branches/users/gaya/groupsharee2/txdav/common/datastore/sql.py	2014-07-14 22:12:05 UTC (rev 13756)
@@ -1422,7 +1422,7 @@
 
 
     @inlineCallbacks
-    def groupsFor(self, uid):
+    def groupUIDsFor(self, uid):
         """
         Returns the cached set of UIDs for the groups this given uid is
         a member of.

Modified: CalendarServer/branches/users/gaya/groupsharee2/txdav/who/augment.py
===================================================================
--- CalendarServer/branches/users/gaya/groupsharee2/txdav/who/augment.py	2014-07-12 01:30:42 UTC (rev 13755)
+++ CalendarServer/branches/users/gaya/groupsharee2/txdav/who/augment.py	2014-07-14 22:12:05 UTC (rev 13756)
@@ -461,12 +461,12 @@
     def groups(self):
         augmented = []
 
-        def _groupsFor(txn):
-            return txn.groupsFor(self.uid)
+        def _groupUIDsFor(txn):
+            return txn.groupUIDsFor(self.uid)
 
         groupUIDs = yield self.service._store.inTransaction(
             "AugmentedDirectoryRecord.groups",
-            _groupsFor
+            _groupUIDsFor
         )
 
         for groupUID in groupUIDs:

Modified: CalendarServer/branches/users/gaya/groupsharee2/txdav/who/groups.py
===================================================================
--- CalendarServer/branches/users/gaya/groupsharee2/txdav/who/groups.py	2014-07-12 01:30:42 UTC (rev 13755)
+++ CalendarServer/branches/users/gaya/groupsharee2/txdav/who/groups.py	2014-07-14 22:12:05 UTC (rev 13756)
@@ -406,7 +406,7 @@
         """
         The UIDs of the groups the uid is a member of
         """
-        return txn.groupsFor(uid)
+        return txn.groupUIDsFor(uid)
 
 
     @inlineCallbacks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140714/86205d70/attachment-0001.html>


More information about the calendarserver-changes mailing list