[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