[CalendarServer-changes] [1619] CalendarServer/branches/users/cdaboo/more-od-schema-1617

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 25 13:03:18 PDT 2007


Revision: 1619
          http://trac.macosforge.org/projects/calendarserver/changeset/1619
Author:   cdaboo at apple.com
Date:     2007-06-25 13:03:17 -0700 (Mon, 25 Jun 2007)

Log Message:
-----------
The auto-schedule feature for resources and locations is now determined via the directory service.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts-test.xml
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.dtd
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.xml
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/customxml.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/apache.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/directory.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/principal.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sqldb.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sudo.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/accounts.xml
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectory.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectoryschema.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_principal.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_xmlfile.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlaccountsparser.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlfile.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/schedule.py
    CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/static.py

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts-test.xml
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts-test.xml	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts-test.xml	2007-06-25 20:03:17 UTC (rev 1619)
@@ -40,11 +40,13 @@
     <uid>location%02d</uid>
     <password>location%02d</password>
     <name>Room %02d</name>
+    <auto-schedule/>
   </location>
   <resource repeat="10">
     <uid>resource%02d</uid>
     <password>resource%02d</password>
     <name>Resource %02d</name>
+    <auto-schedule/>
   </resource>
   <group>
     <uid>group01</uid>

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.dtd
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.dtd	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.dtd	2007-06-25 20:03:17 UTC (rev 1619)
@@ -16,31 +16,29 @@
 DRI: Cyrus Daboo, cdaboo at apple.com
  -->
 
-<!ELEMENT accounts (user*, group*, resource*) >
+<!ELEMENT accounts (user*, group*, resource*, location*) >
   <!ATTLIST accounts realm CDATA "">
 
-  <!ELEMENT user (uid, guid, password, name, cuaddr*, calendar*, quota?, autorespond?)>
+  <!ELEMENT user (uid, guid, password, name, cuaddr*)>
     <!ATTLIST user repeat CDATA "1">
 
-  <!ELEMENT group (uid, guid, password, name, members, cuaddr*, calendar*, quota?)>
+  <!ELEMENT group (uid, guid, password, name, members, cuaddr*)>
     <!ATTLIST group repeat CDATA "1">
 
-  <!ELEMENT resource (uid, guid, password, name, cuaddr*, calendar*, quota?, autorespond?)>
+  <!ELEMENT resource (uid, guid, password, name, cuaddr*, auto-schedule?)>
     <!ATTLIST resource repeat CDATA "1">
 
-  <!ELEMENT location (uid, guid, password, name, cuaddr*, calendar*, quota?, autorespond?)>
+  <!ELEMENT location (uid, guid, password, name, cuaddr*, auto-schedule?)>
     <!ATTLIST location repeat CDATA "1">
 
   <!ELEMENT member (#PCDATA)>
     <!ATTLIST member type (users|groups|locations|resources) "users">
 
-  <!ELEMENT uid         (#PCDATA)>
-  <!ELEMENT guid        (#PCDATA)>
-  <!ELEMENT password    (#PCDATA)>
-  <!ELEMENT name        (#PCDATA)>
-  <!ELEMENT cuaddr      (#PCDATA)>
-  <!ELEMENT calendar    (#PCDATA)>
-  <!ELEMENT quota       (#PCDATA)>
-  <!ELEMENT autorespond EMPTY>
-  <!ELEMENT members     (member*)>
+  <!ELEMENT uid           (#PCDATA)>
+  <!ELEMENT guid          (#PCDATA)>
+  <!ELEMENT password      (#PCDATA)>
+  <!ELEMENT name          (#PCDATA)>
+  <!ELEMENT cuaddr        (#PCDATA)>
+  <!ELEMENT auto-schedule EMPTY>
+  <!ELEMENT members       (member*)>
 >

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.xml
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.xml	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/conf/accounts.xml	2007-06-25 20:03:17 UTC (rev 1619)
@@ -38,10 +38,11 @@
       <member type="users">test</member>
     </members>
   </group>
-  <resource>
+  <location>
     <uid>mercury</uid>
     <password>mercury</password>
     <name>Mecury Conference Room, Building 1, 2nd Floor</name>
-  </resource>
+    <auto-schedule/>
+  </location>
 </accounts>
 

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/customxml.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/customxml.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/customxml.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -91,14 +91,6 @@
 
     allowed_children = { (twisted_dav_namespace, "guid"): (0, None) }
 
-class TwistedScheduleAutoRespond(davxml.WebDAVEmptyElement):
-    """
-    When set on an Inbox, scheduling requests are automatically handled.
-    """
-    namespace = twisted_dav_namespace
-    name = "schedule-auto-respond"
-    hidden = True
-
 class DropBoxHome (davxml.WebDAVEmptyElement):
     """
     Denotes a drop box home collection (a collection that will contain drop boxes).

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/apache.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/apache.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/apache.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -132,6 +132,7 @@
             shortName             = shortName,
             fullName              = None,
             calendarUserAddresses = set(),
+            autoSchedule          = False,
         )
 
 class AbstractUserRecord(AbstractDirectoryRecord):

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/appleopendirectory.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/appleopendirectory.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -329,6 +329,21 @@
                 
         return result
 
+    def _parseResourceInfo(self, plist):
+        """
+        Parse OD ResourceInfo attribute and extract information that the server needs.
+
+        @param plist: the plist that is the attribute value.
+        @type plist: str
+        @return: a C{bool} indicating whether the AutoAcceptsInvitation key was set to true or false,
+            and return C{False} if the key was not present at all.
+        """
+        plist = readPlistFromString(plist)
+        wpframework = plist.get("com.apple.WhitePagesFramework", {})
+        autoaccept = wpframework.get("AutoAcceptsInvitation", False)
+        
+        return autoaccept
+
     def recordTypes(self):
         return (
             DirectoryService.recordType_users,
@@ -395,6 +410,7 @@
         elif recordType == DirectoryService.recordType_locations:
             listRecordType = dsattributes.kDSStdRecordTypeResources
             query = dsquery.match(dsattributes.kDSNAttrResourceType, "1", dsattributes.eDSExact)
+            attrs.append(dsattributes.kDSNAttrResourceInfo)
         
         elif recordType == DirectoryService.recordType_resources:
             listRecordType = dsattributes.kDSStdRecordTypeResources
@@ -405,6 +421,7 @@
                 dsquery.match(dsattributes.kDSNAttrResourceType, "4", dsattributes.eDSExact),
                 dsquery.match(dsattributes.kDSNAttrResourceType, "5", dsattributes.eDSExact),
             ))
+            attrs.append(dsattributes.kDSNAttrResourceInfo)
         
         else:
             raise UnknownRecordTypeError("Unknown Open Directory record type: %s"
@@ -484,6 +501,13 @@
             else:
                 memberGUIDs = ()
 
+            # Special case for resources and locations
+            autoSchedule = False
+            if recordType in (DirectoryService.recordType_resources, DirectoryService.recordType_locations):
+                resourceInfo = value.get(dsattributes.kDSNAttrResourceInfo)
+                if resourceInfo is not None:
+                    autoSchedule = self._parseResourceInfo(resourceInfo)
+
             records[recordShortName] = OpenDirectoryRecord(
                 service               = self,
                 recordType            = recordType,
@@ -492,6 +516,7 @@
                 fullName              = realName,
                 calendarUserAddresses = cuaddrset,
                 memberGUIDs           = memberGUIDs,
+                autoSchedule          = autoSchedule,
             )
 
             #log.debug("Populated record: %s" % (records[recordShortName],))
@@ -529,7 +554,7 @@
     """
     Open Directory implementation of L{IDirectoryRecord}.
     """
-    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses, memberGUIDs):
+    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses, memberGUIDs, autoSchedule):
         super(OpenDirectoryRecord, self).__init__(
             service               = service,
             recordType            = recordType,
@@ -537,6 +562,7 @@
             shortName             = shortName,
             fullName              = fullName,
             calendarUserAddresses = calendarUserAddresses,
+            autoSchedule          = autoSchedule,
         )
         self._memberGUIDs = tuple(memberGUIDs)
 

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/directory.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/directory.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -155,7 +155,7 @@
             self.fullName
         )
 
-    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses):
+    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses, autoSchedule):
         assert service.realmName is not None
         assert recordType
         assert shortName
@@ -171,6 +171,7 @@
         self.shortName             = shortName
         self.fullName              = fullName
         self.calendarUserAddresses = calendarUserAddresses
+        self.autoSchedule          = autoSchedule
 
     def __cmp__(self, other):
         if not isinstance(other, DirectoryRecord):

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/principal.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/principal.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -455,6 +455,9 @@
         
         return addresses
 
+    def autoSchedule(self):
+        return self.record.autoSchedule
+        
     def scheduleInbox(self, request):
         home = self._calendarHome()
         if home is None:

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sqldb.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sqldb.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sqldb.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -101,8 +101,11 @@
                 
             # 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
+            yield shortName, guid, password, name, members, groups, calendarUserAddresses, autoSchedule
 
     def getRecord(self, recordType, shortName):
         # Get individual account record
@@ -126,8 +129,11 @@
             
         # 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()
@@ -313,6 +319,7 @@
                 members               = result[4],
                 groups                = result[5],
                 calendarUserAddresses = result[6],
+                autoSchedule          = result[7],
             )
 
     def recordWithShortName(self, recordType, shortName):
@@ -328,6 +335,7 @@
                 members               = result[4],
                 groups                = result[5],
                 calendarUserAddresses = result[6],
+                autoSchedule          = result[7],
             )
 
         return None
@@ -336,7 +344,7 @@
     """
     XML based implementation implementation of L{IDirectoryRecord}.
     """
-    def __init__(self, service, recordType, shortName, guid, password, name, members, groups, calendarUserAddresses):
+    def __init__(self, service, recordType, shortName, guid, password, name, members, groups, calendarUserAddresses, autoSchedule):
         super(SQLDirectoryRecord, self).__init__(
             service               = service,
             recordType            = recordType,
@@ -344,6 +352,7 @@
             shortName             = shortName,
             fullName              = name,
             calendarUserAddresses = calendarUserAddresses,
+            autoSchedule          = autoSchedule,
         )
 
         self.password = password

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sudo.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sudo.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/sudo.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -130,7 +130,8 @@
             guid=None,
             shortName=shortName,
             fullName=shortName,
-            calendarUserAddresses=set())
+            calendarUserAddresses=set(),
+            autoSchedule=False)
 
         self.password = entry['password']
 

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/accounts.xml
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/accounts.xml	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/accounts.xml	2007-06-25 20:03:17 UTC (rev 1619)
@@ -122,6 +122,7 @@
     <password>gemini</password>
     <name>Gemini Twelve</name>
     <cuaddr>mailto:gemini at example.com</cuaddr>
+    <auto-schedule/>
   </location>
   <location>
     <uid>apollo</uid>

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectory.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectory.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -68,7 +68,8 @@
                 "guidify",
                 "GUID",
                 set("mailtoguid at example.com",),
-                []
+                [],
+                False
             )
 
             digestFields = {}

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectoryschema.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectoryschema.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_opendirectoryschema.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -903,7 +903,7 @@
             dsattributes.kDSNAttrRecordName       : "computer1.apple.com",
             dsattributes.kDS1AttrXMLPlist         : PlistParse.plist_good,
             dsattributes.kDSNAttrMetaNodeLocation : "/LDAPv3/127.0.0.1",
-       })
+        })
         record_good_other = ("computer2.apple.com", {
             dsattributes.kDS1AttrGeneratedUID     : "GUID1",
             dsattributes.kDSNAttrRecordName       : "computer2.apple.com",
@@ -989,3 +989,93 @@
 
             for recordlist, title, guid in records:
                 _doParseRecords(recordlist, title, guid)
+
+    class ODResourceInfoParse (twisted.trial.unittest.TestCase):
+
+        plist_good_false = """<?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>
+        <false/>
+        <key>Label</key>
+        <string>Location</string>
+    </dict>
+</dict>
+</plist>
+"""
+
+        plist_good_true = """<?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>
+    </dict>
+</dict>
+</plist>
+"""
+
+        plist_good_missing = """<?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>Label</key>
+        <string>Location</string>
+    </dict>
+</dict>
+</plist>
+"""
+
+        plist_bad = """<?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>
+"""
+
+        plist_wrong = """<?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.YellowPagesFramework</key>
+    <dict>
+        <key>AutoAcceptsInvitation</key>
+        <true/>
+        <key>Label</key>
+        <string>Location</string>
+    </dict>
+</dict>
+</plist>
+"""
+
+        test_bool = (
+            (plist_good_false, False),
+            (plist_good_true, True),
+            (plist_good_missing, False),
+            (plist_wrong, False),
+        )
+
+        test_exception = (
+            (plist_bad, AttributeError),
+        )
+
+        def test_plists(self):
+            service = OpenDirectoryService(node="/Search", dosetup=False)
+            
+            for item in ODResourceInfoParse.test_bool:
+                self.assertEqual(service._parseResourceInfo(item[0]), item[1])
+            
+            for item in ODResourceInfoParse.test_exception:
+                self.assertRaises(item[1], service._parseResourceInfo, item[0])

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_principal.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_principal.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -191,6 +191,17 @@
                 self.failIf(principal is None)
                 self.assertEquals(record, principal.record)
 
+    def test_autoSchedule(self):
+        """
+        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
+        """
+        for provisioningResource, recordType, recordResource, record in self._allRecords():
+            principal = provisioningResource.principalForRecord(record)
+            self.failIf(principal is None)
+            self.assertEquals(record.autoSchedule, principal.autoSchedule())
+            if record.shortName == "gemini":
+                self.assertTrue(principal.autoSchedule())
+
     # FIXME: Run DirectoryPrincipalProvisioningResource tests on DirectoryPrincipalTypeResource also
 
     ##

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_xmlfile.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_xmlfile.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/test/test_xmlfile.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -113,3 +113,53 @@
                 set(r.shortName for r in service.listRecords(recordType)),
                 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.shortName 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.shortName for r in service.listRecords(DirectoryService.recordType_users))
+
+        self.assertRaises(ValueError, _findRecords)

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlaccountsparser.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlaccountsparser.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlaccountsparser.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -44,6 +44,7 @@
 ELEMENT_MEMBERS      = "members"
 ELEMENT_MEMBER       = "member"
 ELEMENT_CUADDR       = "cuaddr"
+ELEMENT_AUTOSCHEDULE = "auto-schedule"
 
 ATTRIBUTE_REALM      = "realm"
 ATTRIBUTE_REPEAT     = "repeat"
@@ -143,6 +144,7 @@
         self.members = set()
         self.groups = set()
         self.calendarUserAddresses = set()
+        self.autoSchedule = False
 
     def repeat(self, ctr):
         """
@@ -175,6 +177,7 @@
         result.name = name
         result.members = self.members
         result.calendarUserAddresses = calendarUserAddresses
+        result.autoSchedule = self.autoSchedule
         return result
 
     def parseXML(self, node):
@@ -199,6 +202,11 @@
             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
             else:
                 raise RuntimeError("Unknown account attribute: %s" % (child_name,))
 

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlfile.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlfile.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/directory/xmlfile.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -107,7 +107,8 @@
             guid                  = xmlPrincipal.guid,
             shortName             = shortName,
             fullName              = xmlPrincipal.name,
-            calendarUserAddresses = xmlPrincipal.calendarUserAddresses
+            calendarUserAddresses = xmlPrincipal.calendarUserAddresses,
+            autoSchedule          = xmlPrincipal.autoSchedule,
         )
 
         self.password = xmlPrincipal.password

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/schedule.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/schedule.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/schedule.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -35,10 +35,9 @@
 from twisted.web2.dav import davxml
 from twisted.web2.dav.http import ErrorResponse, errorForFailure, messageForFailure, statusForFailure
 from twisted.web2.dav.resource import AccessDeniedError
-from twisted.web2.dav.util import joinURL, parentForURL
+from twisted.web2.dav.util import joinURL
 
 from twistedcaldav import caldavxml
-from twistedcaldav import customxml
 from twistedcaldav import itip
 from twistedcaldav.resource import CalDAVResource
 from twistedcaldav.caldavxml import caldav_namespace, TimeRange
@@ -481,8 +480,8 @@
                         # Store CALDAV:schedule-state property
                         child.writeDeadProperty(caldavxml.ScheduleState(caldavxml.NotProcessed()))
                     
-                        # Look for auto-respond option
-                        if inbox.hasDeadProperty(customxml.TwistedScheduleAutoRespond):
+                        # Look for auto-schedule option
+                        if principal.autoSchedule():
                             autoresponses.append((principal, inbox, child))
                     except:
                         log.err("Could not store data in Inbox : %s" % (inbox,))

Modified: CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/static.py	2007-06-21 13:02:17 UTC (rev 1618)
+++ CalendarServer/branches/users/cdaboo/more-od-schema-1617/twistedcaldav/static.py	2007-06-25 20:03:17 UTC (rev 1619)
@@ -575,12 +575,6 @@
 
     def provision(self):
         if self.provisionFile():
-            # FIXME: This should probably be a directory record option that
-            # maps to the property value directly without the need to store one.
-            if self.parent.record.recordType in (DirectoryService.recordType_locations, DirectoryService.recordType_resources,):
-                # Resources should have autorespond turned on by default,
-                # since they typically don't have someone responding for them.
-                self.writeDeadProperty(customxml.TwistedScheduleAutoRespond())
 
             # Initialize CTag on the calendar collection
             self.updateCTag()

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070625/fc0a75d7/attachment.html


More information about the calendarserver-changes mailing list