[CalendarServer-changes] [11025] CalendarServer/trunk/txdav

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 10 14:28:48 PDT 2013


Revision: 11025
          http://trac.calendarserver.org//changeset/11025
Author:   cdaboo at apple.com
Date:     2013-04-10 14:28:48 -0700 (Wed, 10 Apr 2013)
Log Message:
-----------
Make sure push notifier ids for shared calendars use the owner uid and owner calendar name.

Modified Paths:
--------------
    CalendarServer/trunk/txdav/caldav/datastore/test/common.py
    CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py
    CalendarServer/trunk/txdav/common/datastore/sql.py

Modified: CalendarServer/trunk/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2013-04-10 16:10:31 UTC (rev 11024)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2013-04-10 21:28:48 UTC (rev 11025)
@@ -536,7 +536,6 @@
         self.assertEquals(name, "/CalDAV/example.com/home1/")
 
 
-
     @inlineCallbacks
     def test_displayNameNone(self):
         """
@@ -1110,6 +1109,26 @@
 
 
     @inlineCallbacks
+    def test_sharedNotifierID(self):
+        yield self.test_shareWith()
+        yield self.commit()
+
+        home = yield self.homeUnderTest()
+        self.assertEquals(home.notifierID(), "CalDAV|home1")
+        calendar = yield home.calendarWithName("calendar_1")
+        self.assertEquals(calendar.notifierID(), "CalDAV|home1")
+        self.assertEquals(calendar.notifierID(label="collection"), "CalDAV|home1/calendar_1")
+        yield self.commit()
+
+        home = yield self.homeUnderTest(name=OTHER_HOME_UID)
+        self.assertEquals(home.notifierID(), "CalDAV|%s" % (OTHER_HOME_UID,))
+        calendar = yield home.calendarWithName(self.sharedName)
+        self.assertEquals(calendar.notifierID(), "CalDAV|%s" % (OTHER_HOME_UID,))
+        self.assertEquals(calendar.notifierID(label="collection"), "CalDAV|home1/calendar_1")
+        yield self.commit()
+
+
+    @inlineCallbacks
     def test_hasCalendarResourceUIDSomewhereElse(self):
         """
         L{ICalendarHome.hasCalendarResourceUIDSomewhereElse} will determine if

Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py	2013-04-10 16:10:31 UTC (rev 11024)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py	2013-04-10 21:28:48 UTC (rev 11025)
@@ -490,6 +490,7 @@
     test_asShared = test_shareWith
     test_unshareSharerSide = test_shareWith
     test_unshareShareeSide = test_shareWith
+    test_sharedNotifierID = test_shareWith
 
 
     def test_init(self):

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2013-04-10 16:10:31 UTC (rev 11024)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2013-04-10 21:28:48 UTC (rev 11025)
@@ -2467,15 +2467,8 @@
     _objectTable = None
 
 
-    def __init__(self, home, name, resourceID, mode, status, message=None, ownerHome=None):
+    def __init__(self, home, name, resourceID, mode, status, message=None, ownerHome=None, ownerName=None):
 
-        if home._notifiers:
-            childID = "%s/%s" % (home.uid(), name)
-            notifiers = [notifier.clone(label="collection", id=childID)
-                         for notifier in home._notifiers]
-        else:
-            notifiers = None
-
         self._home = home
         self._name = name
         self._resourceID = resourceID
@@ -2483,12 +2476,20 @@
         self._bindStatus = status
         self._bindMessage = message
         self._ownerHome = home if ownerHome is None else ownerHome
+        self._ownerName = name if ownerName is None else ownerName
         self._created = None
         self._modified = None
         self._objects = {}
         self._objectNames = None
         self._syncTokenRevision = None
-        self._notifiers = notifiers
+
+        if self._ownerHome._notifiers:
+            childID = "%s/%s" % (self._ownerHome.uid(), self._ownerName)
+            self._notifiers = [notifier.clone(label="collection", id=childID)
+                         for notifier in home._notifiers]
+        else:
+            self._notifiers = None
+
         self._index = None  # Derived classes need to set this
 
 
@@ -3000,17 +3001,18 @@
 
             if bindStatus == _BIND_MODE_OWN:
                 ownerHome = home
+                ownerName = resourceName
             else:
                 #TODO: get all ownerHomeIDs at once
-                ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
-                                home._txn, resourceID=resourceID))[0][0]
+                ownerHomeID, ownerName = (yield cls._ownerHomeWithResourceID.on(home._txn, resourceID=resourceID))[0]
                 ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
 
             child = cls(
                 home=home,
                 name=resourceName, resourceID=resourceID,
                 mode=bindMode, status=bindStatus,
-                message=bindMessage, ownerHome=ownerHome
+                message=bindMessage,
+                ownerHome=ownerHome, ownerName=ownerName
             )
             for attr, value in zip(cls.metadataAttributes(), metadata):
                 setattr(child, attr, value)
@@ -3059,15 +3061,15 @@
         bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
 
         #TODO:  combine with _invitedBindForNameAndHomeID and sort results
-        ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
-                        home._txn, resourceID=resourceID))[0][0]
+        ownerHomeID, ownerName = (yield cls._ownerHomeWithResourceID.on(home._txn, resourceID=resourceID))[0]
         ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
 
         child = cls(
             home=home,
             name=resourceName, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage, ownerHome=ownerHome,
+            message=bindMessage,
+            ownerHome=ownerHome, ownerName=ownerName,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -3114,10 +3116,12 @@
                 # get ownerHomeID
                 if bindMode == _BIND_MODE_OWN:
                     ownerHomeID = homeID
+                    ownerName = resourceName
                 else:
-                    ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
-                                    home._txn, resourceID=resourceID))[0][0]
+                    ownerHomeID, ownerName = (yield cls._ownerHomeWithResourceID.on(
+                                    home._txn, resourceID=resourceID))[0]
                 rows[0].append(ownerHomeID)
+                rows[0].append(ownerName)
 
             if rows and queryCacher:
                 # Cache the result
@@ -3126,7 +3130,7 @@
         if not rows:
             returnValue(None)
 
-        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID, ownerName = rows[0] #@UnusedVariable
 
         if bindMode == _BIND_MODE_OWN:
             ownerHome = home
@@ -3137,7 +3141,8 @@
             home=home,
             name=name, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage, ownerHome=ownerHome,
+            message=bindMessage,
+            ownerHome=ownerHome, ownerName=ownerName,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -3176,15 +3181,16 @@
 
         if bindMode == _BIND_MODE_OWN:
             ownerHome = home
+            ownerName = resourceName
         else:
-            ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
-                            home._txn, resourceID=resourceID))[0][0]
+            ownerHomeID, ownerName = (yield cls._ownerHomeWithResourceID.on(home._txn, resourceID=resourceID))[0]
             ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
         child = cls(
             home=home,
             name=resourceName, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage, ownerHome=ownerHome,
+            message=bindMessage,
+            ownerHome=ownerHome, ownerName=ownerName,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -3435,15 +3441,16 @@
     @classproperty
     def _ownerHomeWithResourceID(cls): #@NoSelf
         """
-        DAL query to retrieve the home resource ID of the owner from the bound
+        DAL query to retrieve the home resource ID and resource name of the owner from the bound
         home-child ID.
         """
         bind = cls._bindSchema
-        return Select([bind.HOME_RESOURCE_ID],
-                     From=bind,
-                     Where=(bind.RESOURCE_ID ==
-                            Parameter("resourceID")).And(
-                                bind.BIND_MODE == _BIND_MODE_OWN))
+        return Select(
+            [bind.HOME_RESOURCE_ID, bind.RESOURCE_NAME, ],
+            From=bind,
+            Where=(bind.RESOURCE_ID == Parameter("resourceID")).And(
+                bind.BIND_MODE == _BIND_MODE_OWN)
+        )
 
 
     @inlineCallbacks
@@ -3459,8 +3466,7 @@
             # we already know who the owner is.
             returnValue(self._home._resourceID)
         else:
-            rid = (yield self._ownerHomeWithResourceID.on(
-                self._txn, resourceID=self._resourceID))[0][0]
+            rid, _ignore_rname = (yield self._ownerHomeWithResourceID.on(self._txn, resourceID=self._resourceID))[0]
             returnValue(rid)
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130410/264b54c3/attachment-0001.html>


More information about the calendarserver-changes mailing list