[CalendarServer-changes] [10080] CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/ datastore/sql.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Nov 16 21:27:37 PST 2012


Revision: 10080
          http://trac.calendarserver.org//changeset/10080
Author:   gaya at apple.com
Date:     2012-11-16 21:27:37 -0800 (Fri, 16 Nov 2012)
Log Message:
-----------
fix so that txdav.carddav.datastore.test.test_sql.AddressBookSQLStorageTests.test_addressbookObjectMembers works.

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2012-11-17 04:03:40 UTC (rev 10079)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2012-11-17 05:27:37 UTC (rev 10080)
@@ -398,16 +398,11 @@
                 assert memberAddress in groupComponent.resourceMemberAddresses(), "remove: member %s not in %s" % (self.component(), groupComponent)
                 groupComponent.removeProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
                 #groupComponent.replaceProperty(Property("PRODID", vCardProductID))
-                yield groupObject.updateDatabase(groupComponent)
+                yield groupObject.updateDatabase(groupComponent, removingObject=None if ownerGroup else self)
 
         if ownerGroup:
             pass  # convert delete in shared group to remove of member only part 2
         else:
-
-            #the object to be deleted still exists so updateDatabase could have left it around on a
-
-
-
             yield super(AddressBookObject, self).remove()
             self._kind = None
             self._ownerAddressBookResourceID = None
@@ -626,7 +621,7 @@
 
     @inlineCallbacks
     def updateDatabase(self, component, expand_until=None, reCreate=False,
-                       inserting=False):
+                       inserting=False, removingObject=None):
         """
         Update the database tables for the new data being written.
 
@@ -716,7 +711,7 @@
             memberAddress = "urn:uuid:" + self._uid
             for group in groups:
                 groupComponent = yield group.component()
-                assert memberAddress not in groupComponent.resourceMemberAddresses(), "insert: member %s already in %s" % (component, groupComponent)
+                assert memberAddress not in groupComponent.resourceMemberAddresses(), "updateDatabase(): member %s already in %s" % (component, groupComponent)
                 groupComponent.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
                 #groupComponent.replaceProperty(Property("PRODID", vCardProductID))
                 yield group.updateDatabase(groupComponent)
@@ -757,6 +752,10 @@
             memberIDsToDelete = set(currentMemberIDs) - set(memberIDs)
             memberIDsToAdd = set(memberIDs) - set(currentMemberIDs)
 
+            #correct for object that is about to be removed
+            if removingObject:
+                memberIDsToDelete |= set([removingObject._resourceID])
+
             for memberIDToDelete in memberIDsToDelete:
                 yield Delete(
                     aboMembers,
@@ -771,30 +770,37 @@
                      aboMembers.MEMBER_ID: memberIDToAdd, }
                 ).on(self._txn)
 
-            #get current foreign members 
-            currentForeignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
-                                                 From=aboForeignMembers,
-                                                 Where=aboForeignMembers.GROUP_ID == self._resourceID,).on(self._txn)
-            currentForeignMemberAddrs = [currentForeignMemberRow[0] for currentForeignMemberRow in currentForeignMemberRows]
+            # don't bother with aboForeignMembers on address books
+            if self._resourceID != self._ownerAddressBookResourceID:
 
-            foreignMemberAddrsToDelete = set(currentForeignMemberAddrs) - set(foreignMemberAddrs)
-            foreignMemberAddrsToAdd = set(foreignMemberAddrs) - set(currentForeignMemberAddrs)
+                #get current foreign members 
+                currentForeignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
+                                                     From=aboForeignMembers,
+                                                     Where=aboForeignMembers.GROUP_ID == self._resourceID,).on(self._txn)
+                currentForeignMemberAddrs = [currentForeignMemberRow[0] for currentForeignMemberRow in currentForeignMemberRows]
 
-            for foreignMemberAddrToDelete in foreignMemberAddrsToDelete:
-                yield Delete(
-                    aboForeignMembers,
-                    Where=((aboForeignMembers.GROUP_ID == self._resourceID).And(
-                            aboForeignMembers.MEMBER_ADDRESS == foreignMemberAddrToDelete))
-                ).on(self._txn)
+                foreignMemberAddrsToDelete = set(currentForeignMemberAddrs) - set(foreignMemberAddrs)
+                foreignMemberAddrsToAdd = set(foreignMemberAddrs) - set(currentForeignMemberAddrs)
 
-            for foreignMemberAddrToAdd in foreignMemberAddrsToAdd:
-                yield Insert(
-                    {aboForeignMembers.GROUP_ID: self._resourceID,
-                     aboForeignMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
-                     aboForeignMembers.MEMBER_ADDRESS: foreignMemberAddrToAdd, }
-                ).on(self._txn)
+                for foreignMemberAddrToDelete in foreignMemberAddrsToDelete:
+                    yield Delete(
+                        aboForeignMembers,
+                        Where=((aboForeignMembers.GROUP_ID == self._resourceID).And(
+                                aboForeignMembers.MEMBER_ADDRESS == foreignMemberAddrToDelete))
+                    ).on(self._txn)
 
+                #correct for object that is about to be removed
+                if removingObject:
+                    foreignMemberAddrsToAdd |= set(["urn:uuid:" + removingObject.uid()])
 
+                for foreignMemberAddrToAdd in foreignMemberAddrsToAdd:
+                    yield Insert(
+                        {aboForeignMembers.GROUP_ID: self._resourceID,
+                         aboForeignMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
+                         aboForeignMembers.MEMBER_ADDRESS: foreignMemberAddrToAdd, }
+                    ).on(self._txn)
+
+
     @inlineCallbacks
     def component(self):
         """
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121116/ceb9d736/attachment.html>


More information about the calendarserver-changes mailing list