[CalendarServer-changes] [2000] CalendarServer/branches/release/CalendarServer-1.1-dev

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 30 11:33:52 PDT 2007


Revision: 2000
          http://trac.macosforge.org/projects/calendarserver/changeset/2000
Author:   wsanchez at apple.com
Date:     2007-10-30 11:33:51 -0700 (Tue, 30 Oct 2007)

Log Message:
-----------
Pulled up r1950 from trunk.

Modified Paths:
--------------
    CalendarServer/branches/release/CalendarServer-1.1-dev/conf/accounts.dtd
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/principal.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/accounts.xml
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_principal.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_proxyprincipalmembers.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_xmlfile.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/util.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlaccountsparser.py
    CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlfile.py

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/conf/accounts.dtd
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/conf/accounts.dtd	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/conf/accounts.dtd	2007-10-30 18:33:51 UTC (rev 2000)
@@ -22,7 +22,7 @@
   <!ELEMENT user (uid, guid, password, name, cuaddr*)>
     <!ATTLIST user repeat CDATA "1">
 
-  <!ELEMENT group (uid, guid, password, name, members, cuaddr*)>
+  <!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?)>
@@ -34,12 +34,13 @@
   <!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 members       (member*)>
-  <!ELEMENT auto-schedule EMPTY>
-  <!ELEMENT proxies       (member*)>
+  <!ELEMENT uid              (#PCDATA)>
+  <!ELEMENT guid             (#PCDATA)>
+  <!ELEMENT password         (#PCDATA)>
+  <!ELEMENT name             (#PCDATA)>
+  <!ELEMENT cuaddr           (#PCDATA)>
+  <!ELEMENT members          (member*)>
+  <!ELEMENT auto-schedule    EMPTY>
+  <!ELEMENT disable-calendar EMPTY>
+  <!ELEMENT proxies          (member*)>
 >

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/principal.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/principal.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -456,6 +456,21 @@
     # ACL
     ##
 
+    def _calendar_user_proxy_index(self):
+        """
+        Return the SQL database for calendar user proxies.
+        
+        @return: the L{CalendarUserProxyDatabase} for the principal collection.
+        """
+        
+        # Get the principal collection we are contained in
+        pcollection = self.parent.parent
+        
+        # The db is located in the principal collection root
+        if not hasattr(pcollection, "calendar_user_proxy_db"):
+            setattr(pcollection, "calendar_user_proxy_db", CalendarUserProxyDatabase(pcollection.fp.path))
+        return pcollection.calendar_user_proxy_db
+
     def alternateURIs(self):
         # FIXME: Add API to IDirectoryRecord for getting a record URI?
         return self._alternate_urls
@@ -492,8 +507,24 @@
         return self._getRelatives("members")
 
     def groupMemberships(self):
-        return self._getRelatives("groups")
+        groups = self._getRelatives("groups")
 
+        if config.EnableProxyPrincipals:
+            # Get any directory specified proxies
+            groups.update(self._getRelatives("proxyFor", proxy=True))
+
+            # Get proxy group UIDs and map to principal resources
+            proxies = []
+            for uid in self._calendar_user_proxy_index().getMemberships(self.principalUID()):
+                subprincipal = self.parent.principalForUID(uid)
+                if subprincipal:
+                    proxies.append(subprincipal)
+
+            groups.update(proxies)
+
+        return groups
+
+
     def principalCollections(self):
         return self.parent.principalCollections()
 
@@ -577,43 +608,6 @@
         return d
 
     ##
-    # ACL
-    ##
-
-    def _calendar_user_proxy_index(self):
-        """
-        Return the SQL database for calendar user proxies.
-        
-        @return: the L{CalendarUserProxyDatabase} for the principal collection.
-        """
-        
-        # Get the principal collection we are contained in
-        pcollection = self.parent.parent
-        
-        # The db is located in the principal collection root
-        if not hasattr(pcollection, "calendar_user_proxy_db"):
-            setattr(pcollection, "calendar_user_proxy_db", CalendarUserProxyDatabase(pcollection.fp.path))
-        return pcollection.calendar_user_proxy_db
-
-    def groupMemberships(self):
-        groups = self._getRelatives("groups")
-
-        if config.EnableProxyPrincipals:
-            # Get any directory specified proxies
-            groups.update(self._getRelatives("proxyFor", proxy=True))
-
-            # Get proxy group UIDs and map to principal resources
-            proxies = []
-            for uid in self._calendar_user_proxy_index().getMemberships(self.principalUID()):
-                subprincipal = self.parent.principalForUID(uid)
-                if subprincipal:
-                    proxies.append(subprincipal)
-
-            groups.update(proxies)
-
-        return groups
-
-    ##
     # CalDAV
     ##
 

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/accounts.xml
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/accounts.xml	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/accounts.xml	2007-10-30 18:33:51 UTC (rev 2000)
@@ -129,6 +129,16 @@
       <member>cdaboo</member>
     </members>
   </group>
+  <group>
+    <uid>non_calendar_group</uid>
+    <password>non_calendar_group</password>
+    <name>Non-calendar group</name>
+    <members>
+      <member>cdaboo</member>
+      <member>lecroy</member>
+    </members>
+    <disable-calendar/>
+  </group>
   <location>
     <uid>mercury</uid>
     <password>mercury</password>
@@ -178,4 +188,14 @@
     <name>Faster-Than-Light Microprocessor</name>
     <cuaddr>mailto:ftlcpu at example.com</cuaddr>
   </resource>
+  <resource>
+    <uid>non_calendar_proxy</uid>
+    <guid>non_calendar_proxy</guid>
+    <password>non_calendar_proxy</password>
+    <name>Non-calendar proxy</name>
+    <cuaddr>mailto:non_calendar_proxy at example.com</cuaddr>
+    <proxies>
+      <member type="groups">non_calendar_group</member>
+    </proxies>
+  </resource>
 </accounts>

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_principal.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_principal.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -40,6 +40,7 @@
 from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
 from twistedcaldav.directory.principal import DirectoryPrincipalTypeProvisioningResource
 from twistedcaldav.directory.principal import DirectoryPrincipalResource
+from twistedcaldav.directory.principal import DirectoryCalendarPrincipalResource
 
 import twistedcaldav.test.util
 
@@ -198,10 +199,26 @@
         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())
+            if record.enabledForCalendaring:
+                self.assertEquals(record.autoSchedule, principal.autoSchedule())
+                if record.shortName == "gemini":
+                    self.assertTrue(principal.autoSchedule())
+                else:
+                    self.assertFalse(principal.autoSchedule())
 
+    def test_enabledForCalendaring(self):
+        """
+        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
+        """
+        for provisioningResource, recordType, recordResource, record in self._allRecords():
+            principal = provisioningResource.principalForRecord(record)
+            self.failIf(principal is None)
+            if record.enabledForCalendaring:
+                self.assertTrue(isinstance(principal, DirectoryCalendarPrincipalResource))
+            else:
+                self.assertTrue(isinstance(principal, DirectoryPrincipalResource))
+                self.assertFalse(isinstance(principal, DirectoryCalendarPrincipalResource))
+
     # FIXME: Run DirectoryPrincipalProvisioningResource tests on DirectoryPrincipalTypeProvisioningResource also
 
     ##
@@ -234,8 +251,9 @@
         DirectoryPrincipalResource.proxies()
         """
         for provisioningResource, recordType, recordResource, record in self._allRecords():
-            self.failUnless(set(record.proxies()).issubset(set(r.record for r in recordResource.proxies())))
-            self.assertEqual(record.hasEditableProxyMembership(), recordResource.hasEditableProxyMembership())
+            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_principalUID(self):
         """
@@ -249,12 +267,13 @@
         DirectoryPrincipalResource.calendarUserAddresses()
         """
         for provisioningResource, recordType, recordResource, record in self._allRecords():
-            self.failUnless(
-                (
-                    set((recordResource.principalURL(),)) |
-                    set(record.calendarUserAddresses)
-                ).issubset(set(recordResource.calendarUserAddresses()))
-            )
+            if record.enabledForCalendaring:
+                self.failUnless(
+                    (
+                        set((recordResource.principalURL(),)) |
+                        set(record.calendarUserAddresses)
+                    ).issubset(set(recordResource.calendarUserAddresses()))
+                )
 
     def test_calendarHomeURLs(self):
         """
@@ -264,9 +283,10 @@
         """
         # No calendar home provisioner should result in no calendar homes.
         for provisioningResource, recordType, recordResource, record in self._allRecords():
-            self.failIf(tuple(recordResource.calendarHomeURLs()))
-            self.failIf(recordResource.scheduleInboxURL())
-            self.failIf(recordResource.scheduleOutboxURL())
+            if record.enabledForCalendaring:
+                self.failIf(tuple(recordResource.calendarHomeURLs()))
+                self.failIf(recordResource.scheduleInboxURL())
+                self.failIf(recordResource.scheduleOutboxURL())
 
         # Need to create a calendar home provisioner for each service.
         calendarRootResources = {}
@@ -285,33 +305,34 @@
         
         # Calendar home provisioners should result in calendar homes.
         for provisioningResource, recordType, recordResource, record in self._allRecords():
-            homeURLs = tuple(recordResource.calendarHomeURLs())
-            self.failUnless(homeURLs)
+            if record.enabledForCalendaring:
+                homeURLs = tuple(recordResource.calendarHomeURLs())
+                self.failUnless(homeURLs)
+    
+                calendarRootURL = calendarRootResources[record.service.__class__.__name__].url()
+    
+                inboxURL = recordResource.scheduleInboxURL()
+                outboxURL = recordResource.scheduleOutboxURL()
+    
+                self.failUnless(inboxURL)
+                self.failUnless(outboxURL)
+    
+                for homeURL in homeURLs:
+                    self.failUnless(homeURL.startswith(calendarRootURL))
+    
+                    if inboxURL and inboxURL.startswith(homeURL):
+                        self.failUnless(len(inboxURL) > len(homeURL))
+                        self.failUnless(inboxURL.endswith("/"))
+                        inboxURL = None
+    
+                    if outboxURL and outboxURL.startswith(homeURL):
+                        self.failUnless(len(outboxURL) > len(homeURL))
+                        self.failUnless(outboxURL.endswith("/"))
+                        outboxURL = None
+    
+                self.failIf(inboxURL)
+                self.failIf(outboxURL)
 
-            calendarRootURL = calendarRootResources[record.service.__class__.__name__].url()
-
-            inboxURL = recordResource.scheduleInboxURL()
-            outboxURL = recordResource.scheduleOutboxURL()
-
-            self.failUnless(inboxURL)
-            self.failUnless(outboxURL)
-
-            for homeURL in homeURLs:
-                self.failUnless(homeURL.startswith(calendarRootURL))
-
-                if inboxURL and inboxURL.startswith(homeURL):
-                    self.failUnless(len(inboxURL) > len(homeURL))
-                    self.failUnless(inboxURL.endswith("/"))
-                    inboxURL = None
-
-                if outboxURL and outboxURL.startswith(homeURL):
-                    self.failUnless(len(outboxURL) > len(homeURL))
-                    self.failUnless(outboxURL.endswith("/"))
-                    outboxURL = None
-
-            self.failIf(inboxURL)
-            self.failIf(outboxURL)
-
     def test_defaultAccessControlList_principals(self):
         """
         Default access controls for principals.

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_proxyprincipalmembers.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -100,6 +100,18 @@
         members = set([p.displayName() for p in members])
         self.assertEquals(members, set(('Wilfredo Sanchez', 'Cyrus Daboo', 'Recursive1 Coasts', 'Recursive2 Coasts',)))
 
+    def test_groupMembersProxySingleGroupWithNonCalendarGroup(self):
+        """
+        DirectoryPrincipalResource.groupMembers()
+        """
+        members = self._getRecordByShortName(DirectoryService.recordType_resources, "non_calendar_proxy").getChild("calendar-proxy-write").groupMembers()
+        members = set([p.displayName() for p in members])
+        self.assertEquals(members, set(('Chris Lecroy', 'Cyrus Daboo', 'Non-calendar group')))
+
+        memberships = self._getRecordByShortName(DirectoryService.recordType_groups, "non_calendar_group").groupMemberships()
+        memberships = set([p.principalUID() for p in memberships])
+        self.assertEquals(memberships, set(('non_calendar_proxy#calendar-proxy-write',)))
+
     def _getRecordByShortName(self, type, name):
         """
         @return: an iterable of tuples

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_xmlfile.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_xmlfile.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/test_xmlfile.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -58,10 +58,12 @@
                                                                                                (DirectoryService.recordType_users , "lecroy")) },
         "both_coasts": { "password": "both_coasts", "guid": None, "addresses": (), "members": ((DirectoryService.recordType_groups, "right_coast"),
                                                                                                (DirectoryService.recordType_groups, "left_coast"))           },
-        "recursive1_coasts": { "password": "recursive1_coasts", "guid": None, "addresses": (), "members": ((DirectoryService.recordType_groups, "recursive2_coasts"),
+        "recursive1_coasts":  { "password": "recursive1_coasts",  "guid": None, "addresses": (), "members": ((DirectoryService.recordType_groups, "recursive2_coasts"),
                                                                                                (DirectoryService.recordType_users, "wsanchez"))           },
-        "recursive2_coasts": { "password": "recursive2_coasts", "guid": None, "addresses": (), "members": ((DirectoryService.recordType_groups, "recursive1_coasts"),
+        "recursive2_coasts":  { "password": "recursive2_coasts",  "guid": None, "addresses": (), "members": ((DirectoryService.recordType_groups, "recursive1_coasts"),
                                                                                                (DirectoryService.recordType_users, "cdaboo"))           },
+        "non_calendar_group": { "password": "non_calendar_group", "guid": None, "addresses": (), "members": ((DirectoryService.recordType_users , "cdaboo"),
+                                                                                               (DirectoryService.recordType_users , "lecroy"))           },
     }
 
     locations = {
@@ -72,8 +74,9 @@
     }
 
     resources = {
-        "transporter": { "password": "transporter", "guid": None, "addresses": ("mailto:transporter at example.com",) },
-        "ftlcpu"     : { "password": "ftlcpu",      "guid": None, "addresses": ("mailto:ftlcpu at example.com",)      },
+        "transporter"        : { "password": "transporter",        "guid": None,                 "addresses": ("mailto:transporter at example.com",)        },
+        "ftlcpu"             : { "password": "ftlcpu",             "guid": None,                 "addresses": ("mailto:ftlcpu at example.com",)             },
+        "non_calendar_proxy" : { "password": "non_calendar_proxy", "guid": "non_calendar_proxy", "addresses": ("mailto:non_calendar_proxy at example.com",) },
     }
 
     def xmlFile(self):
@@ -168,7 +171,63 @@
             set(r.shortName for r in service.listRecords(DirectoryService.recordType_users))
 
         self.assertRaises(ValueError, _findRecords)
+        
+    def test_okDisableCalendar(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">
+  <group>
+    <uid>enabled</uid>
+    <password>enabled</password>
+    <name>Enabled</name>
+  </group>
+  <group>
+    <uid>disabled</uid>
+    <password>disabled</password>
+    <name>Disabled</name>
+    <disable-calendar/>
+  </group>
+</accounts>
+"""
+        )
+        for recordType, expectedRecords in (
+            ( DirectoryService.recordType_users     , ()                       ),
+            ( DirectoryService.recordType_groups    , ("enabled", "disabled")  ),
+            ( DirectoryService.recordType_locations , ()                       ),
+            ( DirectoryService.recordType_resources , ()                       ),
+        ):
+            self.assertEquals(
+                set(r.shortName for r in service.listRecords(recordType)),
+                set(expectedRecords)
+            )
+        self.assertTrue(service.recordWithShortName(DirectoryService.recordType_groups, "enabled").enabledForCalendaring)
+        self.assertFalse(service.recordWithShortName(DirectoryService.recordType_groups, "disabled").enabledForCalendaring)
+
+    def test_badDisableCalendar(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>
+    <disable-calendar/>
+  </user>
+</accounts>
+"""
+        )
+        
+        def _findRecords():
+            set(r.shortName for r in service.listRecords(DirectoryService.recordType_users))
+
+        self.assertRaises(ValueError, _findRecords)
+
     def test_okProxies(self):
         service = self.service()
 

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/util.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/util.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/test/util.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -231,7 +231,8 @@
             guid = record.guid
 
         addresses = set(value("addresses"))
-        addresses.add("urn:uuid:%s" % (record.guid,))
+        if record.enabledForCalendaring:
+            addresses.add("urn:uuid:%s" % (record.guid,))
 
         if hasattr(record.service, "recordTypePrefix"):
             prefix = record.service.recordTypePrefix

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlaccountsparser.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlaccountsparser.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlaccountsparser.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -31,25 +31,26 @@
 
 from twistedcaldav.directory.directory import DirectoryService
 
-ELEMENT_ACCOUNTS     = "accounts"
-ELEMENT_USER         = "user"
-ELEMENT_GROUP        = "group"
-ELEMENT_LOCATION     = "location"
-ELEMENT_RESOURCE     = "resource"
+ELEMENT_ACCOUNTS        = "accounts"
+ELEMENT_USER            = "user"
+ELEMENT_GROUP           = "group"
+ELEMENT_LOCATION        = "location"
+ELEMENT_RESOURCE        = "resource"
 
-ELEMENT_SHORTNAME    = "uid"
-ELEMENT_GUID         = "guid"
-ELEMENT_PASSWORD     = "password"
-ELEMENT_NAME         = "name"
-ELEMENT_MEMBERS      = "members"
-ELEMENT_MEMBER       = "member"
-ELEMENT_CUADDR       = "cuaddr"
-ELEMENT_AUTOSCHEDULE = "auto-schedule"
-ELEMENT_PROXIES      = "proxies"
+ELEMENT_SHORTNAME       = "uid"
+ELEMENT_GUID            = "guid"
+ELEMENT_PASSWORD        = "password"
+ELEMENT_NAME            = "name"
+ELEMENT_MEMBERS         = "members"
+ELEMENT_MEMBER          = "member"
+ELEMENT_CUADDR          = "cuaddr"
+ELEMENT_AUTOSCHEDULE    = "auto-schedule"
+ELEMENT_DISABLECALENDAR = "disable-calendar"
+ELEMENT_PROXIES         = "proxies"
 
-ATTRIBUTE_REALM      = "realm"
-ATTRIBUTE_REPEAT     = "repeat"
-ATTRIBUTE_RECORDTYPE = "type"
+ATTRIBUTE_REALM         = "realm"
+ATTRIBUTE_REPEAT        = "repeat"
+ATTRIBUTE_RECORDTYPE    = "type"
 
 RECORD_TYPES = {
     ELEMENT_USER     : DirectoryService.recordType_users,
@@ -157,6 +158,7 @@
         self.groups = set()
         self.calendarUserAddresses = set()
         self.autoSchedule = False
+        self.enabledForCalendaring = True
         self.proxies = set()
         self.proxyFor = set()
 
@@ -227,6 +229,11 @@
                 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:
+                # Only Groups
+                if self.recordType not in (DirectoryService.recordType_groups):
+                    raise ValueError("<disable-calendar> element only allowed for Groups: %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):

Modified: CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlfile.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlfile.py	2007-10-30 18:31:54 UTC (rev 1999)
+++ CalendarServer/branches/release/CalendarServer-1.1-dev/twistedcaldav/directory/xmlfile.py	2007-10-30 18:33:51 UTC (rev 2000)
@@ -112,6 +112,7 @@
             fullName              = xmlPrincipal.name,
             calendarUserAddresses = xmlPrincipal.calendarUserAddresses,
             autoSchedule          = xmlPrincipal.autoSchedule,
+            enabledForCalendaring = xmlPrincipal.enabledForCalendaring,
         )
 
         self.password     = xmlPrincipal.password

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20071030/7e4580a7/attachment-0001.html


More information about the calendarserver-changes mailing list