[CalendarServer-changes] [10637] CalendarServer/branches/users/gaya/sharedgroups/txdav

source_changes at macosforge.org source_changes at macosforge.org
Fri Feb 1 18:33:15 PST 2013


Revision: 10637
          http://trac.calendarserver.org//changeset/10637
Author:   gaya at apple.com
Date:     2013-02-01 18:33:15 -0800 (Fri, 01 Feb 2013)
Log Message:
-----------
checkpoint

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

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2013-02-01 23:57:42 UTC (rev 10636)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2013-02-02 02:33:15 UTC (rev 10637)
@@ -56,7 +56,7 @@
     ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE, \
     _ABO_KIND_PERSON, _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, \
     _ABO_KIND_LOCATION, schema, \
-    _BIND_MODE_OWN, _BIND_MODE_DIRECT, _BIND_STATUS_ACCEPTED
+    _BIND_MODE_OWN, _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED
 from txdav.xml.rfc2518 import ResourceType
 
 from zope.interface.declarations import implements
@@ -465,23 +465,25 @@
 
         # TODO: Simplify.  Try to do one pass only.
         # get sharedHomeIDs
-        sharedABHomeIDs = set()
-        sharedGroupHomeIDs = set()
+        sharedHomeIDToDataRowMap = {}
         for dataRow in dataRows:
             bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = dataRow[:6] #@UnusedVariable
             if bindStatus != _BIND_MODE_OWN:
                 ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
-                sharedABHomeIDs |= set([ownerHomeID])
+                sharedHomeIDToDataRowMap[ownerHomeID] = dataRow
 
         # now get group rows:
-        sharedGroupRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
-        for sharedGroupRow in sharedGroupRows:
-            bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = sharedGroupRow[:6] #@UnusedVariable
+        groupBindRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
+        for groupBindRow in groupBindRows:
+            bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow[:6] #@UnusedVariable
             ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
-            if ownerHomeID not in sharedABHomeIDs:
-                if ownerHomeID not in sharedGroupHomeIDs:
-                    sharedGroupHomeIDs |= set([ownerHomeID])
-                    dataRows.append(sharedGroupRow)
+            if ownerHomeID in sharedHomeIDToDataRowMap:
+                if bindMode == _BIND_MODE_WRITE:
+                    sharedHomeIDToDataRowMap[ownerHomeID][0] |= _BIND_MODE_WRITE # or together bind modes
+            else:
+                groupBindRow[3] = None # resourceName or bindName
+                groupBindRow[5] = None # bindMessage
+                sharedHomeIDToDataRowMap[ownerHomeID] = groupBindRow
 
         if dataRows:
 
@@ -512,22 +514,13 @@
                 ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
                 ownerAddressBook = yield ownerHome.addressbook()
 
-                resourceName = ownerAddressBook.shareeABName()
-                if ownerHome in sharedGroupHomeIDs:
-                    child = cls(
-                        home=home,
-                        name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
-                        mode=_BIND_MODE_DIRECT, status=_BIND_STATUS_ACCEPTED,
-                        message=bindMessage,
-                    )
-                else:
-                    child = cls(
-                        home=home,
-                        name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
-                        mode=bindMode, status=_BIND_STATUS_ACCEPTED,
-                        message=bindMessage,
-                        bindName=resourceName
-                    )
+                child = cls(
+                    home=home,
+                    name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
+                    mode=bindMode, status=bindStatus,
+                    message=bindMessage, ownerHome=ownerHome,
+                    bindName=resourceName
+                )
 
             for attr, value in zip(cls.metadataAttributes(), metadata):
                 setattr(child, attr, value)
@@ -581,6 +574,8 @@
         if name == home.addressbookName():
             returnValue((yield super(AddressBook, cls).objectWithName(home, name)))
 
+        #all shared address books now
+
         rows = None
         queryCacher = home._txn._queryCacher
         ownerHome = None
@@ -598,20 +593,31 @@
                 # see if address book resource id in bind table
                 ownerAddressBook = yield ownerHome.addressbook()
 
-                rows = yield cls._bindForResourceIDAndHomeID.on(
+                sharedABBindRows = yield cls._bindForResourceIDAndHomeID.on(
                     home._txn, resourceID=ownerAddressBook._resourceID, homeID=home._resourceID)
+                if sharedABBindRows:
+                    bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = sharedABBindRows[0] #@UnusedVariable
+                    if bindStatus == _BIND_STATUS_ACCEPTED:
+                        sharedABBindRows[0].append(ownerHome._resourceID)
+                        rows = [sharedABBindRows[0]]
 
-                if rows:
-                    rows[0].extend([ownerHome._resourceID, False, ]) # 
-                else:
-                    # no whole address book binds, so check for group binds
-                    #FIXME:  make into join that returns a boolean
-                    ownerABObjectIDs = yield cls._resourceIDsWithParent(ownerAddressBook)
-                    if ownerABObjectIDs:
-                        sharedRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
-                        if sharedRows:
-                            sharedRows[0].extend([ownerHome._resourceID, True, ]) # 
-                            rows = [sharedRows[0]]
+                # get group binds
+                #FIXME:  use join
+                ownerABObjectIDRows = yield cls._resourceIDsWithParent(ownerAddressBook)
+                if ownerABObjectIDRows:
+                    ownerABObjectIDs = [ownerABObjectIDRow[0] for ownerABObjectIDRow in ownerABObjectIDRows]
+                    groupBindRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
+                    for groupBindRow in groupBindRows:
+                        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
+                        if bindStatus == _BIND_STATUS_ACCEPTED:
+                            if rows:
+                                if bindMode == _BIND_MODE_WRITE:
+                                    rows[0][0] |= _BIND_MODE_WRITE
+                            else:
+                                groupBindRow[3] = None # resourceName or bindName
+                                groupBindRow[5] = None # bindMessage
+                                groupBindRow.append(ownerHome._resourceID)
+                                rows = [groupBindRow]
 
             if rows and queryCacher:
                 # Cache the result
@@ -620,20 +626,12 @@
         if not rows:
             returnValue(None)
 
-        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID, sharedGroupParent = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
         ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
         ownerAddressBook = yield ownerHome.addressbook()
-        if sharedGroupParent:
-            child = cls(
+        child = cls(
                 home=home,
                 name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
-                mode=_BIND_MODE_DIRECT, status=_BIND_STATUS_ACCEPTED,
-                message=None, ownerHome=ownerHome,
-            )
-        else:
-            child = cls(
-                home=home,
-                name=resourceName, resourceID=ownerAddressBook._resourceID,
                 mode=bindMode, status=bindStatus,
                 message=bindMessage, ownerHome=ownerHome,
                 bindName=resourceName,
@@ -659,9 +657,9 @@
         if bindName == home.addressbookName():
             returnValue((yield cls.objectWithName(home, bindName)))
         else:
-            rows = yield cls._childForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
+            rows = yield cls._childBindForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
             if not rows:
-                rows = yield AddressBookObject._childForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
+                rows = yield AddressBookObject._childBindForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
             if rows:
                 bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
 
@@ -687,30 +685,48 @@
         """
         rows = yield cls._bindForResourceIDAndHomeID.on(
             home._txn, resourceID=resourceID, homeID=home._resourceID)
+
+        if rows:
+            bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+            if bindMode == _BIND_MODE_OWN:
+                child = cls(
+                    home=home,
+                    name=resourceName, resourceID=resourceID,
+                    mode=bindMode, status=bindStatus,
+                    message=bindMessage, ownerHome=home,
+                )
+                yield child.initFromStore()
+                returnValue(child)
+
+        ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
+        ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+        ownerAddressBook = yield ownerHome.addressbook()
+
+        ownerABObjectIDRows = yield cls._resourceIDsWithParent(ownerAddressBook)
+        if ownerABObjectIDRows:
+            ownerABObjectIDs = [ownerABObjectIDRow[0] for ownerABObjectIDRow in ownerABObjectIDRows]
+            groupBindRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
+            for groupBindRow in groupBindRows:
+                bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
+                if rows:
+                    if bindMode == _BIND_MODE_WRITE:
+                        rows[0][0] |= _BIND_MODE_WRITE
+                else:
+                    groupBindRow[3] = None # resourceName or bindName
+                    groupBindRow[5] = None # bindMessage
+                    rows = [groupBindRow]
+
         if not rows:
             returnValue(None)
 
         bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
-
-        if bindMode == _BIND_MODE_OWN:
-            child = cls(
-                home=home,
-                name=resourceName, resourceID=resourceID,
-                mode=bindMode, status=bindStatus,
-                message=bindMessage, ownerHome=home,
-            )
-        else:
-            ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
-            ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
-            ownerAddressBook = yield ownerHome.addressbook()
-            child = cls(
-                home=home,
-                name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
-                mode=bindMode, status=_BIND_STATUS_ACCEPTED,
-                message=bindMessage, ownerHome=ownerHome,
-                bindName=resourceName
-                )
-
+        child = cls(
+            home=home,
+            name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
+            mode=bindMode, status=bindStatus,
+            message=bindMessage, ownerHome=ownerHome,
+            bindName=resourceName
+        )
         yield child.initFromStore()
         returnValue(child)
 
@@ -748,40 +764,6 @@
         )
 
 
-    @inlineCallbacks
-    def shareWith(self, shareeHome, mode, status=None, message=None):
-        """
-        Share this (owned) L{CommonHomeChild} with another home.
-
-        @param shareeHome: The home of the sharee.
-        @type shareeHome: L{CommonHome}
-
-        @param mode: The sharing mode; L{_BIND_MODE_READ} or
-            L{_BIND_MODE_WRITE} or L{_BIND_MODE_DIRECT}
-        @type mode: L{str}
-
-        @param status: The sharing status; L{_BIND_STATUS_INVITED} or
-            L{_BIND_STATUS_ACCEPTED}
-        @type mode: L{str}
-
-        @param message: The proposed message to go along with the share, which
-            will be used as the default display name.
-        @type mode: L{str}
-
-        @return: the name of the shared calendar in the new calendar home.
-        @rtype: L{str}
-        """
-
-        yield self._shareWith(shareeHome, mode, status=status, message=message)
-
-        # uses query cacher
-        shareeAddressBook = yield shareeHome.addressbookWithName(self.shareeABName())
-        # alt: does not use query cacheer
-        # sharedAddressBook = yield shareeNome.objectWithID(self._resourceID)
-
-        returnValue(shareeAddressBook)
-
-
     '''
     @classmethod
     @inlineCallbacks
@@ -900,10 +882,10 @@
         @return: an iterable of C{str}s.
         """
         names = set()
-        rows = yield cls._bindForHomeID.on(
+        rows = yield cls._childBindForHomeID.on(
             home._txn, homeID=home._resourceID
         )
-        rows.extend((yield AddressBookObject._bindForHomeID.on(
+        rows.extend((yield AddressBookObject._childBindForHomeID.on(
             home._txn, homeID=home._resourceID
         )))
         for bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage in rows: #@UnusedVariable
@@ -1614,7 +1596,10 @@
     def ownerHome(self):
         return self._addressbook.ownerHome()
 
+    def viewerHome(self):
+        return self._addressbook.viewerHome()
 
+
     def notifyChanged(self):
         self._addressbook.notifyChanged()
 
@@ -1721,11 +1706,13 @@
         @rtype: L{str}
         """
 
-        yield self._shareWith(shareeHome, mode, status=status, message=message)
+        bindName = yield self._shareWith(shareeHome, mode, status=status, message=message)
         addressbook = self.addressbook()
-        shareeAddressBook = yield shareeHome.addressbookWithName(addressbook.shareeABName())
-        sharedGroup = yield shareeAddressBook.objectWithID(self._resourceID)
+        shareeAddressBook = yield shareeHome.childWithID(addressbook._resourceID)
+        sharedGroup = yield shareeAddressBook.objectResourceWithID(self._resourceID)
 
+        #FIXME
+        sharedGroup._bindName = bindName
         returnValue(sharedGroup)
 
 
@@ -1736,7 +1723,7 @@
         if hasattr(self, "_bindMode"):
             return self._bindMode
         else:
-            return self._addresssBook.shareMode()
+            return self._addressbook.shareMode()
 
 
     def shareStatus(self):
@@ -1746,7 +1733,7 @@
         if hasattr(self, "_bindStatus"):
             return self._bindStatus
         else:
-            return self._addresssBook.shareStatus()
+            return self._addressbook.shareStatus()
 
 
     def shareMessage(self):
@@ -1756,7 +1743,7 @@
         if hasattr(self, "_bindMessage"):
             return self._bindMessage
         else:
-            return self._addresssBook.shareMessage()
+            return self._addressbook.shareMessage()
 
 
     def shareUID(self):
@@ -1766,15 +1753,14 @@
         if hasattr(self, "_bindName"):
             return self._bindName
         else:
-            return self._addresssBook.shareUID()
+            return self._addressbook.shareUID()
 
+
     @classmethod
     def _bindForGroupIDsAndHomeID(cls, groupIDs): #@NoSelf
         bind = cls._bindSchema
         return cls._bindFor(bind.RESOURCE_ID.In(Parameter("groupIDs", len(groupIDs)))
                                .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-                               .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
-                               .And(bind.BIND_MODE != _BIND_MODE_OWN)
                                )
 
 

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py	2013-02-01 23:57:42 UTC (rev 10636)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py	2013-02-02 02:33:15 UTC (rev 10637)
@@ -2398,16 +2398,11 @@
         @rtype: L{CommonHomeChild}
         """
 
-        sharedName = yield self._shareWith(shareeHome, mode, status=status, message=message)
+        yield self._shareWith(shareeHome, mode, status=status, message=message)
+        child = yield shareeHome.childWithID(self._resourceID)
+        returnValue(child)
 
-        if status == _BIND_STATUS_ACCEPTED:
-            shareeHomeChild = yield shareeHome.childWithName(sharedName)
-        else:
-            shareeHomeChild = yield shareeHome.invitedChildWithName(sharedName)
 
-        returnValue(shareeHomeChild)
-
-
     @classmethod
     def _updateBindColumnsQuery(cls, columnMap): #@NoSelf
         bind = cls._bindSchema
@@ -2644,7 +2639,7 @@
 
 
     @classproperty
-    def _childForNameAndHomeID(cls): #@NoSelf
+    def _childBindForNameAndHomeID(cls): #@NoSelf
         bind = cls._bindSchema
         return cls._bindFor((bind.RESOURCE_NAME == Parameter("name"))
                                .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
@@ -2688,12 +2683,25 @@
         return self.name()
 
     @classproperty
-    def _bindForHomeID(cls): #@NoSelf
+    def _childBindForHomeID(cls): #@NoSelf
         bind = cls._bindSchema
         return cls._bindFor((bind.HOME_RESOURCE_ID == Parameter("homeID"))
                             .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED))
 
 
+    @classproperty
+    def _bindForResourceIDAndHomeID(cls): #@NoSelf
+        """
+        DAL query that looks up home child names / bind modes by home child
+        resource ID and home resource ID.
+        """
+        bind = cls._bindSchema
+        return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
+                               .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
+                               )
+
+
+
 class CommonHomeChild(LoggingMixIn, FancyEqMixin, _SharedSyncLogic, HomeChildBase, SharingMixIn):
     """
     Common ancestor class of AddressBooks and Calendars.
@@ -2788,7 +2796,7 @@
         @return: an iterable of C{str}s.
         """
         # FIXME: tests don't cover this as directly as they should.
-        rows = yield cls._bindsForHomeID.on(
+        rows = yield cls._childBindForHomeID.on(
                 home._txn, homeID=home._resourceID
         )
         names = [row[3] for row in rows]
@@ -2985,15 +2993,6 @@
         returnValue(child)
 
 
-    @classproperty
-    def _childForNameAndHomeID(cls): #@NoSelf
-        bind = cls._bindSchema
-        return cls._bindFor((bind.RESOURCE_NAME == Parameter("name"))
-                               .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-                               .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
-                               )
-
-
     @classmethod
     @inlineCallbacks
     def objectWithName(cls, home, name):
@@ -3019,7 +3018,7 @@
 
         if rows is None:
             # No cached copy
-            rows = yield cls._childForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
+            rows = yield cls._childBindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
 
             if rows:
                 bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
@@ -3054,18 +3053,6 @@
         returnValue(child)
 
 
-    @classproperty
-    def _bindForResourceIDAndHomeID(cls): #@NoSelf
-        """
-        DAL query that looks up home child names / bind modes by home child
-        resource ID and home resource ID.
-        """
-        bind = cls._bindSchema
-        return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
-                               .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-                               )
-
-
     @classmethod
     @inlineCallbacks
     def objectWithID(cls, home, resourceID):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130201/5c2199fd/attachment-0001.html>


More information about the calendarserver-changes mailing list