[CalendarServer-changes] [4063] CalendarServer/branches/users/sagen/resource-delegates-4038

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 23 06:46:00 PDT 2009


Revision: 4063
          http://trac.macosforge.org/projects/calendarserver/changeset/4063
Author:   sagen at apple.com
Date:     2009-04-23 06:45:58 -0700 (Thu, 23 Apr 2009)
Log Message:
-----------
Unit tests pass, CalDAVTester not so much

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/resource-delegates-4038/bin/caldav_utility.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts-test.xml
    CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.dtd
    CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.xml
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingappleopendirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingdirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingxmlfile.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/calendaruserproxy.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/directory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/idirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/principal.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/sqldb.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/accounts.xml
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_cachedirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectory.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectoryrecords.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_principal.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_proxyprincipalmembers.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_xmlfile.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlaccountsparser.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlfile.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/memcachepool.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/resource.py
    CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/test/test_memcachepool.py

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/bin/caldav_utility.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/bin/caldav_utility.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/bin/caldav_utility.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -78,6 +78,8 @@
     print "  --add-read-delegate <prinicpal-path>: add argument as a read-only delegate to the current resource"
     print "  --add-write-delegate <prinicpal-path>: add argument as a read-write delegate to the current resource"
     print "  --remove-delegate <prinicpal-path>: strip argument of delegate status for the current resource"
+    print "  --set-auto-schedule [true|false] : determines whether the current resource auto-accepts invitations"
+    print "  --get-auto-schedule : returns the current resource's auto-schedule state"
 
     if e:
         sys.exit(64)
@@ -203,6 +205,7 @@
             print "Auto-Schedule: %s" % ("True" if result else "False",)
 
 
+    # reactor.callLater(0, reactor.stop)
     reactor.stop()
 
 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts-test.xml
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts-test.xml	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts-test.xml	2009-04-23 13:45:58 UTC (rev 4063)
@@ -60,20 +60,12 @@
     <guid>location%02d</guid>
     <password>location%02d</password>
     <name>Room %02d</name>
-    <auto-schedule/>
   </location>
   <resource repeat="10">
     <uid>resource%02d</uid>
     <guid>resource%02d</guid>
     <password>resource%02d</password>
     <name>Resource %02d</name>
-    <auto-schedule/>
-    <proxies>
-      <member type="users">user01</member>
-    </proxies>
-    <read-only-proxies>
-      <member type="users">user03</member>
-    </read-only-proxies>
   </resource>
   <group>
     <uid>group01</uid>

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.dtd
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.dtd	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.dtd	2009-04-23 13:45:58 UTC (rev 4063)
@@ -23,10 +23,10 @@
   <!ELEMENT group (uid+, guid, password, name, members, cuaddr*, disable-calendar?)>
     <!ATTLIST group repeat CDATA "1">
 
-  <!ELEMENT resource (uid+, guid, password, name, cuaddr*, auto-schedule?, proxies?, read-only-proxies?)>
+  <!ELEMENT resource (uid+, guid, password, name, cuaddr*)>
     <!ATTLIST resource repeat CDATA "1">
 
-  <!ELEMENT location (uid+, guid, password, name, cuaddr*, auto-schedule?, proxies?, read-only-proxies?)>
+  <!ELEMENT location (uid+, guid, password, name, cuaddr*)>
     <!ATTLIST location repeat CDATA "1">
 
   <!ELEMENT member (#PCDATA)>
@@ -38,8 +38,5 @@
   <!ELEMENT name              (#PCDATA)>
   <!ELEMENT cuaddr            (#PCDATA)>
   <!ELEMENT members           (member*)>
-  <!ELEMENT auto-schedule     EMPTY>
   <!ELEMENT disable-calendar  EMPTY>
-  <!ELEMENT proxies           (member*)>
-  <!ELEMENT read-only-proxies (member*)>
 >

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.xml
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.xml	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/conf/auth/accounts.xml	2009-04-23 13:45:58 UTC (rev 4063)
@@ -42,10 +42,6 @@
     <uid>mercury</uid>
     <password>mercury</password>
     <name>Mecury Conference Room, Building 1, 2nd Floor</name>
-    <auto-schedule/>
-    <proxies>
-      <member type="users">test</member>
-    </proxies>
   </location>
 </accounts>
 

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/appleopendirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/appleopendirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -619,22 +619,6 @@
             else:
                 memberGUIDs = ()
 
-            # Special case for resources and locations
-            autoSchedule = False
-            proxyGUIDs = ()
-            readOnlyProxyGUIDs = ()
-            if recordType in (self.recordType_resources, self.recordType_locations):
-                resourceInfo = value.get(dsattributes.kDSNAttrResourceInfo)
-                if resourceInfo is not None:
-                    try:
-                        autoSchedule, proxy, read_only_proxy = self._parseResourceInfo(resourceInfo, recordGUID, recordType, recordShortName)
-                    except ValueError:
-                        continue
-                    if proxy:
-                        proxyGUIDs = (proxy,)
-                    if read_only_proxy:
-                        readOnlyProxyGUIDs = (read_only_proxy,)
-
             record = OpenDirectoryRecord(
                 service               = self,
                 recordType            = recordType,
@@ -647,11 +631,8 @@
                 lastName              = recordLastName,
                 emailAddresses        = recordEmailAddresses,
                 calendarUserAddresses = calendarUserAddresses,
-                autoSchedule          = autoSchedule,
                 enabledForCalendaring = enabledForCalendaring,
                 memberGUIDs           = memberGUIDs,
-                proxyGUIDs            = proxyGUIDs,
-                readOnlyProxyGUIDs    = readOnlyProxyGUIDs,
             )
 
             def disableGUID(guid, record):
@@ -709,11 +690,6 @@
                     if recordType == self.recordType_groups:
                         self._indexGroup(record, record._memberGUIDs, groupsForGUID)
 
-                    # Do proxy indexing if needed
-                    elif recordType in (self.recordType_resources, self.recordType_locations):
-                        self._indexGroup(record, record._proxyGUIDs, proxiesForGUID)
-                        self._indexGroup(record, record._readOnlyProxyGUIDs, readOnlyProxiesForGUID)
-
                     # Index non-duplicate shortNames
                     def disableName(shortName, record):
                         self.log_warn("Short name %s disabled due to conflict for record: %s"
@@ -957,8 +933,8 @@
     def __init__(
         self, service, recordType, guid, nodeName, shortNames, authIDs, fullName,
         firstName, lastName, emailAddresses,
-        calendarUserAddresses, autoSchedule, enabledForCalendaring,
-        memberGUIDs, proxyGUIDs, readOnlyProxyGUIDs,
+        calendarUserAddresses, enabledForCalendaring,
+        memberGUIDs,
     ):
         super(OpenDirectoryRecord, self).__init__(
             service               = service,
@@ -971,13 +947,10 @@
             lastName              = lastName,
             emailAddresses        = emailAddresses,
             calendarUserAddresses = calendarUserAddresses,
-            autoSchedule          = autoSchedule,
             enabledForCalendaring = enabledForCalendaring,
         )
         self.nodeName = nodeName
         self._memberGUIDs = tuple(memberGUIDs)
-        self._proxyGUIDs = tuple(proxyGUIDs)
-        self._readOnlyProxyGUIDs = tuple(readOnlyProxyGUIDs)
 
     def __repr__(self):
         if self.service.realmName == self.nodeName:
@@ -1007,48 +980,6 @@
     def groups(self):
         return self.service.groupsForGUID(self.guid)
 
-    def proxies(self):
-        if self.recordType not in (self.service.recordType_resources, self.service.recordType_locations):
-            return
-
-        for guid in self._proxyGUIDs:
-            proxyRecord = self.service.recordWithGUID(guid)
-            if proxyRecord is None:
-                self.log_error("No record for proxy in (%s)%s with GUID %s" % (
-                    self.recordType,
-                    self.shortNames[0],
-                    guid,
-                ))
-            else:
-                yield proxyRecord
-
-    def proxyFor(self):
-        result = set()
-        result.update(self.service.proxiesForGUID(self.service.recordType_resources, self.guid))
-        result.update(self.service.proxiesForGUID(self.service.recordType_locations, self.guid))
-        return result
-
-    def readOnlyProxies(self):
-        if self.recordType not in (self.service.recordType_resources, self.service.recordType_locations):
-            return
-
-        for guid in self._readOnlyProxyGUIDs:
-            proxyRecord = self.service.recordWithGUID(guid)
-            if proxyRecord is None:
-                self.log_error("No record for proxy in (%s)%s with GUID %s" % (
-                    self.recordType,
-                    self.shortNames[0],
-                    guid,
-                ))
-            else:
-                yield proxyRecord
-
-    def readOnlyProxyFor(self):
-        result = set()
-        result.update(self.service.readOnlyProxiesForGUID(self.service.recordType_resources, self.guid))
-        result.update(self.service.readOnlyProxiesForGUID(self.service.recordType_locations, self.guid))
-        return result
-
     def verifyCredentials(self, credentials):
         if isinstance(credentials, UsernamePassword):
             # Check cached password

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingappleopendirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingappleopendirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingappleopendirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -659,28 +659,6 @@
             else:
                 memberGUIDs = ()
 
-            # MOR:
-            # autoSchedule = False
-
-            proxyGUIDs = ()
-            readOnlyProxyGUIDs = ()
-
-            # MOR:
-            # Special case for resources and locations
-            """
-            if recordType in (self.recordType_resources, self.recordType_locations):
-                resourceInfo = value.get(dsattributes.kDSNAttrResourceInfo)
-                if resourceInfo is not None:
-                    try:
-                        autoSchedule, proxy, read_only_proxy = self._parseResourceInfo(resourceInfo, recordGUID, recordType, recordShortName)
-                    except ValueError:
-                        continue
-                    if proxy:
-                        proxyGUIDs = (proxy,)
-                    if read_only_proxy:
-                        readOnlyProxyGUIDs = (read_only_proxy,)
-            """
-
             record = OpenDirectoryRecord(
                 service               = self,
                 recordType            = recordType,
@@ -693,12 +671,8 @@
                 lastName              = recordLastName,
                 emailAddresses        = recordEmailAddresses,
                 calendarUserAddresses = calendarUserAddresses,
-                # MOR:
-                # autoSchedule          = autoSchedule,
                 enabledForCalendaring = enabledForCalendaring,
                 memberGUIDs           = memberGUIDs,
-                proxyGUIDs            = proxyGUIDs,
-                readOnlyProxyGUIDs    = readOnlyProxyGUIDs,
             )
             self.recordCacheForType(recordType).addRecord(record)
 
@@ -711,10 +685,8 @@
         self, service, recordType, guid, nodeName, shortNames, authIDs,
         fullName, firstName, lastName, emailAddresses,
         calendarUserAddresses,
-        # MOR:
-        # autoSchedule,
         enabledForCalendaring,
-        memberGUIDs, proxyGUIDs, readOnlyProxyGUIDs,
+        memberGUIDs,
     ):
         super(OpenDirectoryRecord, self).__init__(
             service               = service,
@@ -727,14 +699,10 @@
             lastName              = lastName,
             emailAddresses        = emailAddresses,
             calendarUserAddresses = calendarUserAddresses,
-            # MOR:
-            # autoSchedule          = autoSchedule,
             enabledForCalendaring = enabledForCalendaring,
         )
         self.nodeName = nodeName
         self._memberGUIDs = tuple(memberGUIDs)
-        self._proxyGUIDs = tuple(proxyGUIDs)
-        self._readOnlyProxyGUIDs = tuple(readOnlyProxyGUIDs)
         
         self._groupMembershipGUIDs = None
 
@@ -772,48 +740,6 @@
             if record:
                 yield record
 
-    def proxies(self):
-        if self.recordType not in (self.service.recordType_resources, self.service.recordType_locations):
-            return
-
-        for guid in self._proxyGUIDs:
-            proxyRecord = self.service.recordWithGUID(guid)
-            if proxyRecord is None:
-                self.log_error("No record for proxy in (%s)%s with GUID %s" % (
-                    self.recordType,
-                    self.shortNames[0],
-                    guid,
-                ))
-            else:
-                yield proxyRecord
-
-    def proxyFor(self):
-        result = set()
-        result.update(self.service.proxiesForGUID(self.service.recordType_resources, self.guid))
-        result.update(self.service.proxiesForGUID(self.service.recordType_locations, self.guid))
-        return result
-
-    def readOnlyProxies(self):
-        if self.recordType not in (self.service.recordType_resources, self.service.recordType_locations):
-            return
-
-        for guid in self._readOnlyProxyGUIDs:
-            proxyRecord = self.service.recordWithGUID(guid)
-            if proxyRecord is None:
-                self.log_error("No record for proxy in (%s)%s with GUID %s" % (
-                    self.recordType,
-                    self.shortNames[0],
-                    guid,
-                ))
-            else:
-                yield proxyRecord
-
-    def readOnlyProxyFor(self):
-        result = set()
-        result.update(self.service.readOnlyProxiesForGUID(self.service.recordType_resources, self.guid))
-        result.update(self.service.readOnlyProxiesForGUID(self.service.recordType_locations, self.guid))
-        return result
-
     def verifyCredentials(self, credentials):
         if isinstance(credentials, UsernamePassword):
             # Check cached password

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingdirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingdirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingdirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -320,8 +320,6 @@
         self, service, recordType, guid, shortNames=(), authIDs=set(),
         fullName=None, firstName=None, lastName=None, emailAddresses=set(),
         calendarUserAddresses=set(),
-        # MOR:
-        # autoSchedule=False,
         enabledForCalendaring=None, uid=None,
     ):
         super(CachingDirectoryRecord, self).__init__(
@@ -335,8 +333,6 @@
             lastName              = lastName,
             emailAddresses        = emailAddresses,
             calendarUserAddresses = calendarUserAddresses,
-            # MOR:
-            # autoSchedule          = autoSchedule,
             enabledForCalendaring = enabledForCalendaring,
             uid                   = uid,
         )

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingxmlfile.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingxmlfile.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/cachingxmlfile.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -183,17 +183,12 @@
             lastName              = xmlPrincipal.lastName,
             emailAddresses        = xmlPrincipal.emailAddresses,
             calendarUserAddresses = xmlPrincipal.calendarUserAddresses,
-            autoSchedule          = xmlPrincipal.autoSchedule,
             enabledForCalendaring = xmlPrincipal.enabledForCalendaring,
         )
 
         self.password          = xmlPrincipal.password
         self._members          = xmlPrincipal.members
         self._groups           = xmlPrincipal.groups
-        self._proxies          = xmlPrincipal.proxies
-        self._proxyFor         = xmlPrincipal.proxyFor
-        self._readOnlyProxies  = xmlPrincipal.readOnlyProxies
-        self._readOnlyProxyFor = xmlPrincipal.readOnlyProxyFor
 
     def members(self):
         for recordType, shortName in self._members:
@@ -203,22 +198,6 @@
         for shortName in self._groups:
             yield self.service.recordWithShortName(DirectoryService.recordType_groups, shortName)
 
-    def proxies(self):
-        for recordType, shortName in self._proxies:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def proxyFor(self, read_write=True):
-        for recordType, shortName in self._proxyFor:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def readOnlyProxies(self):
-        for recordType, shortName in self._readOnlyProxies:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def readOnlyProxyFor(self, read_write=True):
-        for recordType, shortName in self._readOnlyProxyFor:
-            yield self.service.recordWithShortName(recordType, shortName)
-
     def verifyCredentials(self, credentials):
         if isinstance(credentials, UsernamePassword):
             return credentials.password == self.password

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/calendaruserproxy.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/calendaruserproxy.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/calendaruserproxy.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -161,15 +161,7 @@
         assert isinstance(property, davxml.WebDAVElement)
 
         if property.qname() == (dav_namespace, "group-member-set"):
-            if self.hasEditableMembership():
-                return self.setGroupMemberSet(property, request)
-            else:
-                raise HTTPError(
-                    StatusResponse(
-                        responsecode.FORBIDDEN,
-                        "Proxies cannot be changed."
-                    )
-                )
+            return self.setGroupMemberSet(property, request)
 
         return super(CalendarUserProxyPrincipalResource, self).writeProperty(property, request)
 
@@ -269,8 +261,7 @@
                 """Principal UID: %s\n"""          % (self.principalUID(),),
                 """Principal URL: %s\n"""          % (format_link(self.principalURL()),),
                 """\nAlternate URIs:\n"""          , format_list(format_link(u) for u in self.alternateURIs()),
-                """\nGroup members (%s):\n""" % ({False:"Locked", True:"Editable"}[self.hasEditableMembership()])
-                                                   , format_principals(closure["members"]),
+                """\nGroup members:\n"""           , format_principals(closure["members"]),
                 """\nGroup memberships:\n"""       , format_principals(closure["memberships"]),
                 """</pre></blockquote></div>""",
                 closure["output"]
@@ -321,7 +312,8 @@
                 for member in members:
                     if member.principalUID() not in uids:
                         relatives.add(member)
-                        yield self._expandMemberUIDs(member.principalUID(), relatives, uids, infinity=infinity)
+                        if infinity:
+                            yield self._expandMemberUIDs(member.principalUID(), relatives, uids, infinity=infinity)
             elif isinstance(principal, DirectoryPrincipalResource):
                 if infinity:
                     members = yield principal.expandedGroupMembers()
@@ -333,35 +325,28 @@
 
     @inlineCallbacks
     def _directGroupMembers(self):
-        if self.hasEditableMembership():
-            # Get member UIDs from database and map to principal resources
-            members = yield self._index().getMembers(self.uid)
-            found = []
-            missing = []
-            for uid in members:
-                p = self.pcollection.principalForUID(uid)
-                if p:
-                    found.append(p)
-                    # Make sure any outstanding deletion timer entries for
-                    # existing principals are removed
-                    yield self._index()._memcacher.clearDeletionTimer(uid)
-                else:
-                    missing.append(uid)
+        # Get member UIDs from database and map to principal resources
+        members = yield self._index().getMembers(self.uid)
+        found = []
+        missing = []
+        for uid in members:
+            p = self.pcollection.principalForUID(uid)
+            if p:
+                found.append(p)
+                # Make sure any outstanding deletion timer entries for
+                # existing principals are removed
+                yield self._index()._memcacher.clearDeletionTimer(uid)
+            else:
+                missing.append(uid)
 
-            # Clean-up ones that are missing
-            for uid in missing:
-                cacheTimeout = config.DirectoryService.params.get("cacheTimeout", 30) * 60 # in seconds
+        # Clean-up ones that are missing
+        for uid in missing:
+            cacheTimeout = config.DirectoryService.params.get("cacheTimeout", 30) * 60 # in seconds
 
-                yield self._index().removePrincipal(uid,
-                    delay=cacheTimeout*2)
+            yield self._index().removePrincipal(uid,
+                delay=cacheTimeout*2)
 
-            returnValue(found)
-        else:
-            # Fixed proxies
-            if self.proxyType == "calendar-proxy-write":
-                returnValue(self.parent.proxies())
-            else:
-                returnValue(self.parent.readOnlyProxies())
+        returnValue(found)
 
     def groupMembers(self):
         return self._expandMemberUIDs()
@@ -375,9 +360,6 @@
         memberships = yield self._index().getMemberships(self.uid)
         returnValue([p for p in [self.pcollection.principalForUID(uid) for uid in memberships] if p])
 
-    def hasEditableMembership(self):
-        return self.parent.hasEditableProxyMembership()
-
 class CalendarUserProxyDatabase(AbstractSQLDatabase, LoggingMixIn):
     """
     A database to maintain calendar user proxy group memberships.

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/directory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/directory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -270,8 +270,6 @@
         self, service, recordType, guid, shortNames=(), authIDs=set(), fullName=None,
         firstName=None, lastName=None, emailAddresses=set(),
         calendarUserAddresses=set(),
-        # MOR:
-        # autoSchedule=False,
         enabledForCalendaring=None,
         uid=None,
     ):
@@ -312,8 +310,6 @@
         self.emailAddresses        = emailAddresses
         self.enabledForCalendaring = enabledForCalendaring
         self.calendarUserAddresses = calendarUserAddresses
-        # MOR:
-        # self.autoSchedule          = autoSchedule
 
     def __cmp__(self, other):
         if not isinstance(other, DirectoryRecord):
@@ -339,22 +335,8 @@
     def groups(self):
         return ()
 
-    def proxies(self):
-        return ()
-
-    def proxyFor(self):
-        return ()
-
-    def readOnlyProxies(self):
-        return ()
-
-    def readOnlyProxyFor(self):
-        return ()
-
     def hasEditableProxyMembership(self):
         return True
-        # MOR:
-        # return self.recordType in (DirectoryService.recordType_users, DirectoryService.recordType_groups)
 
     def verifyCredentials(self, credentials):
         return False

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/idirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/idirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/idirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -101,8 +101,6 @@
     lastName              = Attribute("The last name of this record.")
     emailAddress          = Attribute("The email address of this record.")
     calendarUserAddresses = Attribute("A set of calendar user addresses for this record.")
-    # MOR:
-    # autoSchedule          = Attribute("Principal identified by this record should automatically accept/deny meetings.")
     enabledForCalendaring = Attribute("Determines whether this record should be provisioned with a calendar home.")
 
     def members():

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/principal.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/principal.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -583,10 +583,6 @@
         
         memberships = (yield self.groupMemberships())
         
-        proxyFor = (yield self.proxyFor(True))
-        
-        readOnlyProxyFor = (yield self.proxyFor(False))
-
         returnValue("".join((
             """<div class="directory-listing">"""
             """<h1>Principal Details</h1>"""
@@ -611,8 +607,6 @@
             """\nAlternate URIs:\n"""          , format_list(format_link(u) for u in self.alternateURIs()),
             """\nGroup members:\n"""           , format_principals(members),
             """\nGroup memberships:\n"""       , format_principals(memberships),
-            """\nRead-write Proxy For:\n"""    , format_principals(proxyFor),
-            """\nRead-only Proxy For:\n"""     , format_principals(readOnlyProxyFor),
             """%s</pre></blockquote></div>"""  % extras,
             output
         )))
@@ -662,6 +656,38 @@
     def url(self):
         return self.principalURL()
 
+    @inlineCallbacks
+    def proxyFor(self, read_write, resolve_memberships=True):
+        proxyFors = set()
+        print "IN PROXYFOR", self, read_write
+
+        if resolve_memberships:
+            memberships = self._getRelatives("groups", infinity=True)
+            for membership in memberships:
+                print "MEMBERSHIP:", membership
+                results = (yield membership.proxyFor(read_write, False))
+                print "RESULTS", results
+                proxyFors.update(results)
+
+        if config.EnableProxyPrincipals:
+            # Get proxy group UIDs and map to principal resources
+            proxies = []
+            memberships = (yield self._calendar_user_proxy_index().getMemberships(self.principalUID()))
+            print "FROM INDEX", memberships
+            for uid in memberships:
+                subprincipal = self.parent.principalForUID(uid)
+                if subprincipal:
+                    print "SUBPRINCIPAL", subprincipal
+                    if subprincipal.isProxyType(read_write):
+                        print "IS PROXY TYPE", read_write
+                        proxies.append(subprincipal.parent)
+                else:
+                    yield self._calendar_user_proxy_index().removeGroup(uid)
+
+            proxyFors.update(proxies)
+
+        returnValue(proxyFors)
+
     def _getRelatives(self, method, record=None, relatives=None, records=None, proxy=None, infinity=False):
         if record is None:
             record = self.record
@@ -703,8 +729,9 @@
 
         if config.EnableProxyPrincipals:
             # Get any directory specified proxies
-            groups.update(self._getRelatives("proxyFor", proxy='read-write', infinity=infinity))
-            groups.update(self._getRelatives("readOnlyProxyFor", proxy='read-only', infinity=infinity))
+            # MOR:
+            # groups.update(self._getRelatives("proxyFor", proxy='read-write', infinity=infinity))
+            # groups.update(self._getRelatives("readOnlyProxyFor", proxy='read-only', infinity=infinity))
 
             # Get proxy group UIDs and map to principal resources
             proxies = []
@@ -723,40 +750,6 @@
     def expandedGroupMemberships(self):
         return self.groupMemberships(infinity=True)
 
-
-    @inlineCallbacks
-    def proxyFor(self, read_write, resolve_memberships=True):
-        proxyFors = set()
-
-        if resolve_memberships:
-            memberships = self._getRelatives("groups", infinity=True)
-            for membership in memberships:
-                results = (yield membership.proxyFor(read_write, False))
-                proxyFors.update(results)
-
-        if config.EnableProxyPrincipals:
-            # Get any directory specified proxies
-            if read_write:
-                directoryProxies = self._getRelatives("proxyFor", proxy='read-write', infinity=True)
-            else:
-                directoryProxies = self._getRelatives("readOnlyProxyFor", proxy='read-only', infinity=True)
-            proxyFors.update([subprincipal.parent for subprincipal in directoryProxies])
-
-            # Get proxy group UIDs and map to principal resources
-            proxies = []
-            memberships = (yield self._calendar_user_proxy_index().getMemberships(self.principalUID()))
-            for uid in memberships:
-                subprincipal = self.parent.principalForUID(uid)
-                if subprincipal:
-                    if subprincipal.isProxyType(read_write):
-                        proxies.append(subprincipal.parent)
-                else:
-                    yield self._calendar_user_proxy_index().removeGroup(uid)
-
-            proxyFors.update(proxies)
-
-        returnValue(proxyFors)
-
     def principalCollections(self):
         return self.parent.principalCollections()
 
@@ -837,10 +830,6 @@
 
         return addresses
 
-    # MOR:
-    # def autoSchedule(self):
-    #     return self.record.autoSchedule
-
     def enabledAsOrganizer(self):
         if self.record.recordType == DirectoryService.recordType_users:
             return True
@@ -853,15 +842,6 @@
         else:
             return False
 
-    def proxies(self):
-        return self._getRelatives("proxies", infinity=True)
-
-    def readOnlyProxies(self):
-        return self._getRelatives("readOnlyProxies", infinity=True)
-
-    def hasEditableProxyMembership(self):
-        return self.record.hasEditableProxyMembership()
-
     def scheduleInbox(self, request):
         home = self.calendarHome()
         if home is None:
@@ -908,6 +888,7 @@
         else:
             return None
 
+
     ##
     # Static
     ##

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/sqldb.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/sqldb.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/sqldb.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -101,10 +101,7 @@
             # Get calendar user addresses
             calendarUserAddresses = self.calendarUserAddresses(shortName)
             
-            # TODO: need this for Resources and Locations
-            autoSchedule = False
-                
-            yield shortName, guid, password, name, members, groups, calendarUserAddresses, autoSchedule
+            yield shortName, guid, password, name, members, groups, calendarUserAddresses
 
     def getRecord(self, recordType, shortName):
         # Get individual account record
@@ -129,11 +126,8 @@
         # Get calendar user addresses
         calendarUserAddresses = self.calendarUserAddresses(shortName)
         
-        # TODO: need this for Resources and Locations
-        autoSchedule = False
+        return shortName, guid, password, name, members, groups, calendarUserAddresses
             
-        return shortName, guid, password, name, members, groups, calendarUserAddresses, autoSchedule
-            
     def members(self, shortName):
         members = set()
         for member in self._db_execute(
@@ -318,7 +312,6 @@
                 members               = result[4],
                 groups                = result[5],
                 calendarUserAddresses = result[6],
-                autoSchedule          = result[7],
             )
 
     def recordWithShortName(self, recordType, shortName):
@@ -334,7 +327,6 @@
                 members               = result[4],
                 groups                = result[5],
                 calendarUserAddresses = result[6],
-                autoSchedule          = result[7],
             )
 
         return None
@@ -343,7 +335,7 @@
     """
     XML based implementation implementation of L{IDirectoryRecord}.
     """
-    def __init__(self, service, recordType, shortName, guid, password, name, members, groups, calendarUserAddresses, autoSchedule):
+    def __init__(self, service, recordType, shortName, guid, password, name, members, groups, calendarUserAddresses):
         super(SQLDirectoryRecord, self).__init__(
             service               = service,
             recordType            = recordType,
@@ -351,7 +343,6 @@
             shortNames            = (shortName,),
             fullName              = name,
             calendarUserAddresses = calendarUserAddresses,
-            autoSchedule          = autoSchedule,
         )
 
         self.password = password

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/accounts.xml
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/accounts.xml	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/accounts.xml	2009-04-23 13:45:58 UTC (rev 4063)
@@ -158,9 +158,6 @@
     <name>Mecury Seven</name>
     <email-address>mercury at example.com</email-address>
     <cuaddr>mailto:mercury at example.com</cuaddr>
-    <proxies>
-      <member type="groups">left_coast</member>
-    </proxies>
   </location>
   <location>
     <uid>gemini</uid>
@@ -168,10 +165,6 @@
     <name>Gemini Twelve</name>
     <email-address>gemini at example.com</email-address>
     <cuaddr>mailto:gemini at example.com</cuaddr>
-    <auto-schedule/>
-    <proxies>
-      <member>wsanchez</member>
-    </proxies>
   </location>
   <location>
     <uid>apollo</uid>
@@ -179,9 +172,6 @@
     <name>Apollo Eleven</name>
     <email-address>apollo at example.com</email-address>
     <cuaddr>mailto:apollo at example.com</cuaddr>
-    <proxies>
-      <member type="groups">both_coasts</member>
-    </proxies>
   </location>
   <location>
     <uid>orion</uid>
@@ -189,9 +179,6 @@
     <name>Orion</name>
     <email-address>orion at example.com</email-address>
     <cuaddr>mailto:orion at example.com</cuaddr>
-    <proxies>
-      <member type="groups">recursive1_coasts</member>
-    </proxies>
   </location>
   <resource>
     <uid>transporter</uid>
@@ -214,11 +201,5 @@
     <name>Non-calendar proxy</name>
     <email-address>non_calendar_proxy at example.com</email-address>
     <cuaddr>mailto:non_calendar_proxy at example.com</cuaddr>
-    <proxies>
-      <member type="groups">non_calendar_group</member>
-    </proxies>
-    <read-only-proxies>
-      <member type="groups">recursive2_coasts</member>
-    </read-only-proxies>
   </resource>
 </accounts>

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_cachedirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_cachedirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_cachedirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -61,7 +61,6 @@
                         lastName              = "",
                         emailAddresses        = record.get("email"),
                         calendarUserAddresses = record.get("email"),
-                        autoSchedule          = False,
                         enabledForCalendaring = True,
                     ) 
                     self.recordCacheForType(recordType).addRecord(cacheRecord)

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectory.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectory.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectory.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -72,11 +72,8 @@
                 lastName              = "User",
                 emailAddresses        = set(("someuser at example.com",)),
                 calendarUserAddresses = set(("mailtoguid at example.com",)),
-                autoSchedule          = False,
                 enabledForCalendaring = True,
                 memberGUIDs           = [],
-                proxyGUIDs            = (),
-                readOnlyProxyGUIDs    = (),
             )
 
             digestFields = {}

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectoryrecords.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectoryrecords.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_opendirectoryrecords.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -692,58 +692,8 @@
             self.verifyQuery(self.service.recordWithEmailAddress, "location05 at example.com")
             self.verifyNoQuery(self.service.recordWithEmailAddress, "location05 at example.com")
 
-        def test_resourceinfo(self):
-            good_plist = """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-    <key>com.apple.WhitePagesFramework</key>
-    <dict>
-        <key>AutoAcceptsInvitation</key>
-        <true/>
-        <key>Label</key>
-        <string>Location</string>
-        <key>CalendaringDelegate</key>
-        <string></string>
-        <key>ReadOnlyCalendaringDelegate</key>
-        <string></string>
-    </dict>
-</dict>
-</plist>
-"""
 
-            bad_plist = """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-    <key>com.apple.WhitePagesFramework</key>
-    <string>bogus</string>
-</dict>
-</plist>
-"""
 
-            invalid_xml = """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-    <key>com.apple.WhitePagesFramework</key>
-    <string>R&D</string>
-</dict>
-</plist>
-"""
-
-            self.loadRecords({
-                DirectoryService.recordType_locations: [
-                    fakeODRecord("Location 01", resourceInfo=good_plist),
-                    fakeODRecord("Location 02", resourceInfo=bad_plist),
-                    fakeODRecord("Location 03", resourceInfo=invalid_xml),
-                ],
-            })
-
-            self.verifyRecords(DirectoryService.recordType_locations, ("location01",))
-            self.verifyDisabledRecords(DirectoryService.recordType_locations, (), ())
-
-
 def fakeODRecord(fullName, shortName=None, guid=None, email=None, members=None, resourceInfo=None):
     if shortName is None:
         shortName = shortNameForFullName(fullName)

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_principal.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_principal.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -204,20 +204,6 @@
         self.failIf(provisioningResource.principalForCalendarUserAddress("/principals/users/nocalendar/") is not None)
         self.failIf(provisioningResource.principalForCalendarUserAddress("/principals/__uids__/543D28BA-F74F-4D5F-9243-B3E3A61171E5/") is not None)
 
-    def test_autoSchedule(self):
-        """
-        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
-        """
-        for provisioningResource, recordType, recordResource, record in self._allRecords():
-            principal = provisioningResource.principalForRecord(record)
-            self.failIf(principal is None)
-            if record.enabledForCalendaring:
-                self.assertEquals(record.autoSchedule, principal.autoSchedule())
-                if record.shortNames[0] == "gemini":
-                    self.assertTrue(principal.autoSchedule())
-                else:
-                    self.assertFalse(principal.autoSchedule())
-
     def test_enabledForCalendaring(self):
         """
         DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
@@ -302,24 +288,6 @@
             memberships = yield recordResource.groupMemberships()
             self.failUnless(set(record.groups()).issubset(set(r.record for r in memberships if hasattr(r, "record"))))
 
-    def test_proxies(self):
-        """
-        DirectoryPrincipalResource.proxies()
-        """
-        for provisioningResource, recordType, recordResource, record in self._allRecords():
-            if record.enabledForCalendaring:
-                self.failUnless(set(record.proxies()).issubset(set(r.record for r in recordResource.proxies())))
-                self.assertEqual(record.hasEditableProxyMembership(), recordResource.hasEditableProxyMembership())
-
-    def test_read_only_proxies(self):
-        """
-        DirectoryPrincipalResource.proxies()
-        """
-        for provisioningResource, recordType, recordResource, record in self._allRecords():
-            if record.enabledForCalendaring:
-                self.failUnless(set(record.readOnlyProxies()).issubset(set(r.record for r in recordResource.readOnlyProxies())))
-                self.assertEqual(record.hasEditableProxyMembership(), recordResource.hasEditableProxyMembership())
-
     def test_principalUID(self):
         """
         DirectoryPrincipalResource.principalUID()

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_proxyprincipalmembers.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -48,6 +48,7 @@
 
         self.principalRootResources[directoryService.__class__.__name__] = provisioningResource
 
+
     def _getPrincipalByShortName(self, type, name):
         provisioningResource = self.principalRootResources[directoryService.__class__.__name__]
         return provisioningResource.principalForShortName(type, name)
@@ -139,60 +140,85 @@
             ("Wilfredo Sanchez", "Recursive2 Coasts", "Cyrus Daboo",),
         )
 
+    @inlineCallbacks
     def test_groupMembersProxySingleUser(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
         """
-        return self._groupMembersTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "gemini",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_users, "wsanchez",),
+        )
+        self._groupMembersTest(
             DirectoryService.recordType_locations, "gemini", "calendar-proxy-write",
             ("Wilfredo Sanchez",),
         )
 
+    @inlineCallbacks
     def test_groupMembersProxySingleGroup(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
         """
-        return self._groupMembersTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "mercury",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "left_coast",),
+        )
+        self._groupMembersTest(
             DirectoryService.recordType_locations, "mercury", "calendar-proxy-write",
             ("Chris Lecroy", "David Reid", "Wilfredo Sanchez", "West Coast",),
         )
 
+    @inlineCallbacks
     def test_groupMembersProxySingleGroupWithNestedGroups(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
         """
-        return self._groupMembersTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "apollo",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "both_coasts",),
+        )
+        self._groupMembersTest(
             DirectoryService.recordType_locations, "apollo", "calendar-proxy-write",
             ("Chris Lecroy", "David Reid", "Wilfredo Sanchez", "West Coast", "East Coast", "Cyrus Daboo", "Both Coasts",),
         )
 
+    @inlineCallbacks
     def test_groupMembersProxySingleGroupWithNestedRecursiveGroups(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
         """
-        return self._groupMembersTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "orion",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "recursive1_coasts",),
+        )
+        self._groupMembersTest(
             DirectoryService.recordType_locations, "orion", "calendar-proxy-write",
             ("Wilfredo Sanchez", "Cyrus Daboo", "Recursive1 Coasts", "Recursive2 Coasts",),
         )
 
+    @inlineCallbacks
     def test_groupMembersProxySingleGroupWithNonCalendarGroup(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
         """
-        ds = []
-
-        ds.append(self._groupMembersTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_resources, "non_calendar_proxy",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "non_calendar_group",),
+        )
+        yield self._groupMembersTest(
             DirectoryService.recordType_resources, "non_calendar_proxy", "calendar-proxy-write",
             ("Chris Lecroy", "Cyrus Daboo", "Non-calendar group"),
-        ))
-
-        ds.append(self._groupMembershipsTest(
+        )
+        yield self._groupMembershipsTest(
             DirectoryService.recordType_groups, "non_calendar_group", None,
             ("non_calendar_proxy#calendar-proxy-write",),
-        ))
+        )
 
-        return DeferredList(ds)
-
     def test_groupMembersProxyMissingUser(self):
         """
         DirectoryPrincipalResource.expandedGroupMembers()
@@ -304,17 +330,46 @@
         finally:
             DirectoryPrincipalResource.cacheNotifierFactory = oldCacheNotifier
 
+    @inlineCallbacks
     def test_proxyFor(self):
 
-        return self._proxyForTest(
-            DirectoryService.recordType_users, "wsanchez", 
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "mercury",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "left_coast",),
+        )
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "gemini",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_users, "wsanchez",),
+        )
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "apollo",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "both_coasts",),
+        )
+        yield self._addProxy(
+            (DirectoryService.recordType_locations, "orion",),
+            "calendar-proxy-write",
+            (DirectoryService.recordType_groups, "recursive1_coasts",),
+        )
+
+        yield self._proxyForTest(
+            DirectoryService.recordType_users, "wsanchez",
             ("Mecury Seven", "Gemini Twelve", "Apollo Eleven", "Orion", ),
             True
         )
 
+    @inlineCallbacks
     def test_readOnlyProxyFor(self):
 
-        return self._proxyForTest(
+        yield self._addProxy(
+            (DirectoryService.recordType_resources, "non_calendar_proxy",),
+            "calendar-proxy-read",
+            (DirectoryService.recordType_groups, "recursive2_coasts",),
+        )
+
+        yield self._proxyForTest(
             DirectoryService.recordType_users, "wsanchez", 
             ("Non-calendar proxy", ),
             False

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_xmlfile.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_xmlfile.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/test/test_xmlfile.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -121,56 +121,7 @@
                 set(expectedRecords)
             )
 
-    def test_okAutoSchedule(self):
-        service = self.service()
-
-        self.xmlFile().open("w").write(
-"""<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE accounts SYSTEM "accounts.dtd">
-<accounts realm="Test Realm">
-  <location>
-    <uid>my office</uid>
-    <password>nimda</password>
-    <name>Super User</name>
-    <auto-schedule/>
-  </location>
-</accounts>
-"""
-        )
-        for recordType, expectedRecords in (
-            ( DirectoryService.recordType_users     , ()             ),
-            ( DirectoryService.recordType_groups    , ()             ),
-            ( DirectoryService.recordType_locations , ("my office",) ),
-            ( DirectoryService.recordType_resources , ()             ),
-        ):
-            self.assertEquals(
-                set(r.shortNames[0] for r in service.listRecords(recordType)),
-                set(expectedRecords)
-            )
-        self.assertTrue(service.recordWithShortName(DirectoryService.recordType_locations, "my office").autoSchedule)
-
-    def test_badAutoSchedule(self):
-        service = self.service()
-
-        self.xmlFile().open("w").write(
-"""<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE accounts SYSTEM "accounts.dtd">
-<accounts realm="Test Realm">
-  <user>
-    <uid>my office</uid>
-    <password>nimda</password>
-    <name>Super User</name>
-    <auto-schedule/>
-  </user>
-</accounts>
-"""
-        )
         
-        def _findRecords():
-            set(r.shortNames[0] for r in service.listRecords(DirectoryService.recordType_users))
-
-        self.assertRaises(ValueError, _findRecords)
-        
     def test_okDisableCalendar(self):
         service = self.service()
 
@@ -207,63 +158,3 @@
         self.assertFalse(service.recordWithShortName(DirectoryService.recordType_groups, "enabled").enabledForCalendaring)
         self.assertFalse(service.recordWithShortName(DirectoryService.recordType_groups, "disabled").enabledForCalendaring)
 
-    def test_okProxies(self):
-        service = self.service()
-
-        self.xmlFile().open("w").write(
-"""<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE accounts SYSTEM "accounts.dtd">
-<accounts realm="Test Realm">
-  <user>
-    <uid>test</uid>
-    <password>nimda</password>
-    <name>Test</name>
-  </user>
-  <location>
-    <uid>my office</uid>
-    <password>nimda</password>
-    <name>Super User</name>
-    <auto-schedule/>
-    <proxies>
-        <member>test</member>
-    </proxies>
-  </location>
-</accounts>
-"""
-        )
-        for recordType, expectedRecords in (
-            ( DirectoryService.recordType_users     , ("test",)      ),
-            ( DirectoryService.recordType_groups    , ()             ),
-            ( DirectoryService.recordType_locations , ("my office",) ),
-            ( DirectoryService.recordType_resources , ()             ),
-        ):
-            self.assertEquals(
-                set(r.shortNames[0] for r in service.listRecords(recordType)),
-                set(expectedRecords)
-            )
-        self.assertEqual(set([("users", "test",)],), service.recordWithShortName(DirectoryService.recordType_locations, "my office")._proxies)
-        self.assertEqual(set([("locations", "my office",)],), service.recordWithShortName(DirectoryService.recordType_users, "test")._proxyFor)
-
-    def test_badProxies(self):
-        service = self.service()
-
-        self.xmlFile().open("w").write(
-"""<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE accounts SYSTEM "accounts.dtd">
-<accounts realm="Test Realm">
-  <user>
-    <uid>my office</uid>
-    <password>nimda</password>
-    <name>Super User</name>
-    <proxies>
-        <member>12345-GUID-67890</member>
-    </proxies>
-  </user>
-</accounts>
-"""
-        )
-        
-        def _findRecords():
-            set(r.shortNames[0] for r in service.listRecords(DirectoryService.recordType_users))
-
-        self.assertRaises(ValueError, _findRecords)

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlaccountsparser.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlaccountsparser.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlaccountsparser.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -49,10 +49,7 @@
 ELEMENT_MEMBERS           = "members"
 ELEMENT_MEMBER            = "member"
 ELEMENT_CUADDR            = "cuaddr"
-ELEMENT_AUTOSCHEDULE      = "auto-schedule"
 ELEMENT_DISABLECALENDAR   = "disable-calendar"
-ELEMENT_PROXIES           = "proxies"
-ELEMENT_READ_ONLY_PROXIES = "read-only-proxies"
 
 ATTRIBUTE_REALM           = "realm"
 ATTRIBUTE_REPEAT          = "repeat"
@@ -110,19 +107,6 @@
                 if item is not None:
                     item.groups.add(group.shortNames[0])
 
-        def updateProxyFor(proxier):
-            # Update proxy membership
-            for recordType, shortName in proxier.proxies:
-                item = self.items[recordType].get(shortName)
-                if item is not None:
-                    item.proxyFor.add((proxier.recordType, proxier.shortNames[0]))
-
-            # Update read-only proxy membership
-            for recordType, shortName in proxier.readOnlyProxies:
-                item = self.items[recordType].get(shortName)
-                if item is not None:
-                    item.readOnlyProxyFor.add((proxier.recordType, proxier.shortNames[0]))
-
         for child in node._get_childNodes():
             child_name = child._get_localName()
             if child_name is None:
@@ -151,7 +135,6 @@
         for records in self.items.itervalues():
             for principal in records.itervalues():
                 updateMembership(principal)
-                updateProxyFor(principal)
                 
 class XMLAccountRecord (object):
     """
@@ -172,15 +155,10 @@
         self.members = set()
         self.groups = set()
         self.calendarUserAddresses = set()
-        self.autoSchedule = False
         if recordType == DirectoryService.recordType_groups:
             self.enabledForCalendaring = False
         else:
             self.enabledForCalendaring = True
-        self.proxies = set()
-        self.proxyFor = set()
-        self.readOnlyProxies = set()
-        self.readOnlyProxyFor = set()
 
     def repeat(self, ctr):
         """
@@ -237,10 +215,7 @@
         result.emailAddresses = emailAddresses
         result.members = self.members
         result.calendarUserAddresses = calendarUserAddresses
-        result.autoSchedule = self.autoSchedule
         result.enabledForCalendaring = self.enabledForCalendaring
-        result.proxies = self.proxies
-        result.readOnlyProxies = self.readOnlyProxies
         return result
 
     def parseXML(self, node):
@@ -279,27 +254,12 @@
             elif child_name == ELEMENT_CUADDR:
                 if child.firstChild is not None:
                     self.calendarUserAddresses.add(child.firstChild.data.encode("utf-8"))
-            elif child_name == ELEMENT_AUTOSCHEDULE:
-                # Only Resources & Locations
-                if self.recordType not in (DirectoryService.recordType_resources, DirectoryService.recordType_locations):
-                    raise ValueError("<auto-schedule> element only allowed for Resources and Locations: %s" % (child_name,))
-                self.autoSchedule = True
             elif child_name == ELEMENT_DISABLECALENDAR:
                 # FIXME: Not sure I see why this restriction is needed. --wsanchez
                 ## Only Users or Groups
                 #if self.recordType != DirectoryService.recordType_users:
                 #    raise ValueError("<disable-calendar> element only allowed for Users: %s" % (child_name,))
                 self.enabledForCalendaring = False
-            elif child_name == ELEMENT_PROXIES:
-                # Only Resources & Locations
-                if self.recordType not in (DirectoryService.recordType_resources, DirectoryService.recordType_locations):
-                    raise ValueError("<proxies> element only allowed for Resources and Locations: %s" % (child_name,))
-                self._parseMembers(child, self.proxies)
-            elif child_name == ELEMENT_READ_ONLY_PROXIES:
-                # Only Resources & Locations
-                if self.recordType not in (DirectoryService.recordType_resources, DirectoryService.recordType_locations):
-                    raise ValueError("<read-only-proxies> element only allowed for Resources and Locations: %s" % (child_name,))
-                self._parseMembers(child, self.readOnlyProxies)
             else:
                 raise RuntimeError("Unknown account attribute: %s" % (child_name,))
 

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlfile.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlfile.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/directory/xmlfile.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -119,17 +119,12 @@
             lastName              = xmlPrincipal.lastName,
             emailAddresses        = xmlPrincipal.emailAddresses,
             calendarUserAddresses = xmlPrincipal.calendarUserAddresses,
-            autoSchedule          = xmlPrincipal.autoSchedule,
             enabledForCalendaring = xmlPrincipal.enabledForCalendaring,
         )
 
         self.password          = xmlPrincipal.password
         self._members          = xmlPrincipal.members
         self._groups           = xmlPrincipal.groups
-        self._proxies          = xmlPrincipal.proxies
-        self._proxyFor         = xmlPrincipal.proxyFor
-        self._readOnlyProxies  = xmlPrincipal.readOnlyProxies
-        self._readOnlyProxyFor = xmlPrincipal.readOnlyProxyFor
 
     def members(self):
         for recordType, shortName in self._members:
@@ -139,22 +134,6 @@
         for shortName in self._groups:
             yield self.service.recordWithShortName(DirectoryService.recordType_groups, shortName)
 
-    def proxies(self):
-        for recordType, shortName in self._proxies:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def proxyFor(self, read_write=True):
-        for recordType, shortName in self._proxyFor:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def readOnlyProxies(self):
-        for recordType, shortName in self._readOnlyProxies:
-            yield self.service.recordWithShortName(recordType, shortName)
-
-    def readOnlyProxyFor(self, read_write=True):
-        for recordType, shortName in self._readOnlyProxyFor:
-            yield self.service.recordWithShortName(recordType, shortName)
-
     def verifyCredentials(self, credentials):
         if isinstance(credentials, UsernamePassword):
             return credentials.password == self.password

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/memcachepool.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/memcachepool.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/memcachepool.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -153,9 +153,16 @@
         self._pendingConnects = 0
         self._commands = []
 
+    def _isIdle(self):
+        return (
+            len(self._busyClients) == 0 and
+            len(self._commands) == 0 and
+            self._pendingConnects == 0
+        )
+
     def _shutdownCallback(self):
         self.shutdown_requested = True
-        if len(self._busyClients) == 0 and len(self._commands) == 0 and self._pendingConnects == 0:
+        if self._isIdle():
             return None
         self.shutdown_deferred = Deferred()
         return self.shutdown_deferred
@@ -236,6 +243,7 @@
 
         @return: A L{Deferred} that fires with the result of the given command.
         """
+
         if len(self._freeClients) > 0:
             client = self._freeClients.pop()
 
@@ -289,9 +297,6 @@
         @param client: An instance of C{self.clientFactory}
         """
 
-        if self.shutdown_deferred and len(self._busyClients) == 0 and len(self._commands) == 0 and self._pendingConnects == 0:
-            self.shutdown_deferred.callback(None)
-
         if client in self._freeClients:
             self._freeClients.remove(client)
 
@@ -312,7 +317,7 @@
 
         self._freeClients.add(client)
 
-        if self.shutdown_deferred and len(self._busyClients) == 0 and len(self._commands) == 0 and self._pendingConnects == 0:
+        if self.shutdown_deferred and self._isIdle():
             self.shutdown_deferred.callback(None)
 
         if len(self._commands) > 0:

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/resource.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/resource.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -1007,14 +1007,14 @@
         return None
 
     def setAutoSchedule(self, autoSchedule):
-        self._index().setAutoSchedule(self.record.guid, autoSchedule)
+        self._resource_info_index().setAutoSchedule(self.record.guid, autoSchedule)
 
     def getAutoSchedule(self):
-        return self._index().getAutoSchedule(self.record.guid)
+        return self._resource_info_index().getAutoSchedule(self.record.guid)
 
-    def _index(self):
+    def _resource_info_index(self):
         """
-        Return the SQL database for this calendar principal.
+        Return the resource info SQL database for this calendar principal.
 
         @return: the L{ResourceInfoDatabase} for the calendar principal.
         """
@@ -1025,6 +1025,20 @@
             setattr(self.pcollection, "resource_info_db", ResourceInfoDatabase(config.DataRoot))
         return self.pcollection.resource_info_db
 
+    def _calendar_user_proxy_index(self):
+        """
+        Return the calendar user proxy SQL database for this calendar principal.
+
+        @return: the L{CalendarUserProxyDatabase} for the calendar principal.
+        """
+
+        # The db is located in the data root
+        self.pcollection = self.parent.parent # MOR: doesn't feel right
+        if not hasattr(self.pcollection, "calendar_user_proxy_db"):
+            setattr(self.pcollection, "calendar_user_proxy_db", CalendarUserProxyDatabase(config.DataRoot))
+        return self.pcollection.calendar_user_proxy_db
+
+
 ##
 # Utilities
 ##

Modified: CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/test/test_memcachepool.py
===================================================================
--- CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/test/test_memcachepool.py	2009-04-22 19:27:33 UTC (rev 4062)
+++ CalendarServer/branches/users/sagen/resource-delegates-4038/twistedcaldav/test/test_memcachepool.py	2009-04-23 13:45:58 UTC (rev 4063)
@@ -40,8 +40,11 @@
     """
     def __init__(self):
         self.calls = []
+        self.shutdown_deferred = None
+        self.shutdown_requested = False
 
 
+
     def clientFree(self, client):
         """
         Record a C{'free'} call for C{client}.
@@ -100,7 +103,10 @@
         return StubConnector()
 
 
+    def addSystemEventTrigger(*args, **kwds):
+        pass
 
+
 class PooledMemCacheProtocolTests(TestCase):
     """
     Tests for the L{PooledMemCacheProtocol}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090423/c4e23f44/attachment-0001.html>


More information about the calendarserver-changes mailing list