[CalendarServer-changes] [8046] CalendarServer/trunk/twistedcaldav/sharing.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Sep 2 11:44:56 PDT 2011


Revision: 8046
          http://trac.macosforge.org/projects/calendarserver/changeset/8046
Author:   cdaboo at apple.com
Date:     2011-09-02 11:44:56 -0700 (Fri, 02 Sep 2011)
Log Message:
-----------
Partial failures when removing invalid sharees now supported.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/sharing.py

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2011-09-02 18:39:37 UTC (rev 8045)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2011-09-02 18:44:56 UTC (rev 8046)
@@ -441,15 +441,8 @@
         if type(cn) is not list:
             cn = [cn]
             
-        def _defer(resultset):
-            results = [result if success else False for success, result in resultset]
-            if resultIsList:
-                return results
-            else:
-                return results[0]
-
         dl = [self.inviteSingleUserToShare(user, cn, ace, summary, request) for user, cn in zip(userid, cn)]
-        return DeferredList(dl).addCallback(_defer)
+        return self._processShareActionList(dl, resultIsList)
 
     def uninviteUserToShare(self, userid, ace, request):
         """ Send out in uninvite first, and then remove this user from the share list."""
@@ -459,10 +452,14 @@
         # anything known to be invalid.
 
         # TODO: Check if this collection is shared, and error out if it isn't
+        resultIsList = True
         if type(userid) is not list:
             userid = [userid]
-        return DeferredList([self.uninviteSingleUserFromShare(user, ace, request) for user in userid]).addCallback(lambda _:True)
+            resultIsList = False
 
+        dl = [self.uninviteSingleUserFromShare(user, ace, request) for user in userid]
+        return self._processShareActionList(dl, resultIsList)
+
     def inviteUserUpdateToShare(self, userid, cn, aceOLD, aceNEW, summary, request):
 
         resultIsList = True
@@ -472,17 +469,15 @@
         if type(cn) is not list:
             cn = [cn]
             
+        dl = [self.inviteSingleUserUpdateToShare(user, cn, aceOLD, aceNEW, summary, request) for user, cn in zip(userid, cn)]
+        return self._processShareActionList(dl, resultIsList)
+
+    def _processShareActionList(self, dl, resultIsList):
         def _defer(resultset):
             results = [result if success else False for success, result in resultset]
-            if resultIsList:
-                return results
-            else:
-                return results[0]
-
-        dl = [self.inviteSingleUserUpdateToShare(user, cn, aceOLD, aceNEW, summary, request) for user, cn in zip(userid, cn)]
+            return results if resultIsList else results[0]
         return DeferredList(dl).addCallback(_defer)
-
-
+        
     @inlineCallbacks
     def inviteSingleUserToShare(self, userid, cn, ace, summary, request):
         
@@ -519,7 +514,7 @@
         if record:
             result = (yield self.uninviteRecordFromShare(record, request))
         else:
-            result = True
+            result = False
         returnValue(result)
 
 
@@ -701,6 +696,8 @@
 
             # Only make changes if all OK
             if len(badusers) == 0:
+                okusers = set()
+                badusers = set()
                 # Special case removing and adding the same user and treat that as an add
                 sameUseridInRemoveAndSet = [u for u in removeDict.keys() if u in setDict]
                 for u in sameUseridInRemoveAndSet:
@@ -719,6 +716,12 @@
                     result = (yield self.inviteUserUpdateToShare(userid, cn, removeACL, newACL, summary, request))
                     (okusers if result else badusers).add(userid)
 
+                # In this case bad items do not prevent ok items from being processed
+                ok_code = responsecode.OK
+            else:
+                # In this case a bad item causes all ok items not to be processed so failed dependency is returned
+                ok_code = responsecode.FAILED_DEPENDENCY
+
             # Do a final validation of the entire set of invites
             yield self.validateInvites()
             
@@ -726,7 +729,7 @@
             if badusers:
                 xml_responses = []
                 xml_responses.extend([
-                    davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
+                    davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(ok_code))
                     for userid in sorted(okusers)
                 ])
                 xml_responses.extend([
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110902/2b91596c/attachment-0001.html>


More information about the calendarserver-changes mailing list