<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12978] CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/12978">12978</a></dd>
<dt>Author</dt> <dd>wsanchez@apple.com</dd>
<dt>Date</dt> <dd>2014-03-19 18:22:18 -0700 (Wed, 19 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Fix some things</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesuserssagenmove2who4twistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServerbranchesuserssagenmove2who4twistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py (12977 => 12978)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py        2014-03-20 00:16:14 UTC (rev 12977)
+++ CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py        2014-03-20 01:22:18 UTC (rev 12978)
</span><span class="lines">@@ -18,8 +18,8 @@
</span><span class="cx"> import os
</span><span class="cx"> from urllib import quote
</span><span class="cx"> 
</span><ins>+from twisted.internet.defer import inlineCallbacks, returnValue
</ins><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twisted.internet.defer import inlineCallbacks
</del><span class="cx"> 
</span><span class="cx"> from txweb2.dav.fileop import rmdir
</span><span class="cx"> from txweb2.dav.resource import AccessDeniedError
</span><span class="lines">@@ -42,7 +42,6 @@
</span><span class="cx"> )
</span><span class="cx"> from twistedcaldav.directory.principal import (
</span><span class="cx">     DirectoryCalendarPrincipalResource,
</span><del>-    DirectoryPrincipalProvisioningResource,
</del><span class="cx">     DirectoryPrincipalResource,
</span><span class="cx">     DirectoryPrincipalTypeProvisioningResource,
</span><span class="cx"> )
</span><span class="lines">@@ -50,40 +49,18 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-# twistedcaldav.test.util.TestCase
</del><span class="cx"> class ProvisionedPrincipals(StoreTestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory service provisioned principals.
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    # def setUp(self):
-    #     super(ProvisionedPrincipals, self).setUp()
</del><ins>+    @inlineCallbacks
+    def setUp(self):
+        yield super(ProvisionedPrincipals, self).setUp()
</ins><span class="cx"> 
</span><del>-    #     self.directoryServices = (
-    #         XMLDirectoryService(
-    #             {
-    #                 'xmlFile' : xmlFile,
-    #                 'augmentService' :
-    #                     augment.AugmentXMLDB(xmlFiles=(augmentsFile.path,)),
-    #             }
-    #         ),
-    #     )
</del><ins>+        self.principalRootResource = self.actualRoot.getChild(&quot;principals&quot;)
</ins><span class="cx"> 
</span><del>-    #     # Set up a principals hierarchy for each service we're testing with
-    #     self.principalRootResources = {}
-    #     for directory in self.directoryServices:
-    #         name = directory.__class__.__name__
-    #         url = &quot;/&quot; + name + &quot;/&quot;
</del><span class="cx"> 
</span><del>-    #         provisioningResource = DirectoryPrincipalProvisioningResource(url, directory)
-    #         directory.setPrincipalCollection(provisioningResource)
</del><span class="cx"> 
</span><del>-    #         self.site.resource.putChild(name, provisioningResource)
-
-    #         self.principalRootResources[directory.__class__.__name__] = provisioningResource
-
-    #     calendaruserproxy.ProxyDBService = calendaruserproxy.ProxySqliteDB(os.path.abspath(self.mktemp()))
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_hierarchy(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -99,14 +76,11 @@
</span><span class="cx"> 
</span><span class="cx">         DirectoryPrincipalResource.principalURL(),
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        directory = self.directory
</del><span class="cx">         if True:
</span><span class="cx">             #print(&quot;\n -&gt; %s&quot; % (directory.__class__.__name__,))
</span><del>-            provisioningResource = (
-                self.principalRootResources[directory.__class__.__name__]
-            )
</del><ins>+            provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><del>-            provisioningURL = &quot;/&quot; + directory.__class__.__name__ + &quot;/&quot;
</del><ins>+            provisioningURL = &quot;/&quot; + self.directory.__class__.__name__ + &quot;/&quot;
</ins><span class="cx">             self.assertEquals(
</span><span class="cx">                 provisioningURL,
</span><span class="cx">                 provisioningResource.principalCollectionURL()
</span><span class="lines">@@ -119,7 +93,7 @@
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">             recordTypes = set((yield provisioningResource.listChildren()))
</span><del>-            self.assertEquals(recordTypes, set(directory.recordTypes()))
</del><ins>+            self.assertEquals(recordTypes, set(self.directory.recordTypes()))
</ins><span class="cx"> 
</span><span class="cx">             for recordType in recordTypes:
</span><span class="cx">                 #print(&quot;   -&gt; %s&quot; % (recordType,))
</span><span class="lines">@@ -148,14 +122,16 @@
</span><span class="cx">                 shortNames = set((yield typeResource.listChildren()))
</span><span class="cx">                 # Handle records with mulitple shortNames
</span><span class="cx">                 expected = []
</span><del>-                for r in directory.listRecords(recordType):
</del><ins>+                for r in (
+                    yield self.directory.recordsWithRecordType(recordType)
+                ):
</ins><span class="cx">                     if r.uid != &quot;disabled&quot;:
</span><span class="cx">                         expected.extend(r.shortNames)
</span><span class="cx">                 self.assertEquals(shortNames, set(expected))
</span><span class="cx"> 
</span><span class="cx">                 for shortName in shortNames:
</span><span class="cx">                     #print(&quot;     -&gt; %s&quot; % (shortName,))
</span><del>-                    recordResource = typeResource.getChild(shortName)
</del><ins>+                    recordResource = yield typeResource.getChild(shortName)
</ins><span class="cx">                     self.failUnless(
</span><span class="cx">                         isinstance(recordResource, DirectoryPrincipalResource)
</span><span class="cx">                     )
</span><span class="lines">@@ -182,14 +158,15 @@
</span><span class="cx">                     )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_allRecords(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test of a test routine...
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 self.assertEquals(recordResource.record, record)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -197,99 +174,108 @@
</span><span class="cx">     # DirectoryPrincipalProvisioningResource
</span><span class="cx">     ##
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForShortName(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForShortName()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            principal = provisioningResource.principalForShortName(
</del><ins>+        ) in (yield self._allRecords()):
+            principal = yield provisioningResource.principalForShortName(
</ins><span class="cx">                 recordType, record.shortNames[0]
</span><span class="cx">             )
</span><del>-            if record.enabled:
</del><ins>+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEquals(record, principal.record)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(principal is not None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForUser(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForUser()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        directory = self.directory
-        provisioningResource = (
-            self.principalRootResources[directory.__class__.__name__]
-        )
</del><ins>+        provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><del>-        for user in directory.listRecords(DirectoryService.recordType_users):
-            userResource = provisioningResource.principalForUser(
</del><ins>+        for user in (
+            yield self.directory.recordsWithRecordType(
+                self.directory.recordType.user
+            )
+        ):
+            userResource = yield provisioningResource.principalForUser(
</ins><span class="cx">                 user.shortNames[0]
</span><span class="cx">             )
</span><del>-            if user.enabled:
</del><ins>+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(userResource is None)
</span><span class="cx">                 self.assertEquals(user, userResource.record)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(userResource is not None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForAuthID(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForAuthID()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        directory = self.directory
-        provisioningResource = (
-            self.principalRootResources[directory.__class__.__name__]
-        )
</del><ins>+        provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><del>-        for user in directory.listRecords(DirectoryService.recordType_users):
</del><ins>+        for user in (
+            yield self.directory.recordsWithRecordType(
+                self.directory.recordType.user
+            )
+        ):
</ins><span class="cx">             creds = UsernamePassword(user.shortNames[0], &quot;bogus&quot;)
</span><del>-            userResource = provisioningResource.principalForAuthID(creds)
-            if user.enabled:
</del><ins>+            userResource = yield provisioningResource.principalForAuthID(creds)
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(userResource is None)
</span><span class="cx">                 self.assertEquals(user, userResource.record)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(userResource is not None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForUID(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForUID()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            principal = provisioningResource.principalForUID(record.uid)
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            principal = yield provisioningResource.principalForUID(record.uid)
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEquals(record, principal.record)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(principal is not None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForRecord(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForRecord()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            principal = provisioningResource.principalForRecord(record)
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            principal = yield provisioningResource.principalForRecord(record)
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEquals(record, principal.record)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(principal is not None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalForCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
</del><ins>+        DirectoryPrincipalProvisioningResource
+        .principalForCalendarUserAddress()
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
</del><ins>+        ) in (yield self._allRecords()):
</ins><span class="cx"> 
</span><span class="cx">             test_items = tuple(record.calendarUserAddresses)
</span><span class="cx">             if recordResource:
</span><span class="lines">@@ -302,61 +288,69 @@
</span><span class="cx"> 
</span><span class="cx">             for address in test_items:
</span><span class="cx">                 principal = (
</span><del>-                    provisioningResource
</del><ins>+                    yield provisioningResource
</ins><span class="cx">                     .principalForCalendarUserAddress(address)
</span><span class="cx">                 )
</span><del>-                if record.enabledForCalendaring:
</del><ins>+                if record.hasCalendars:
</ins><span class="cx">                     self.failIf(principal is None)
</span><span class="cx">                     self.assertEquals(record, principal.record)
</span><span class="cx">                 else:
</span><span class="cx">                     self.failIf(principal is not None)
</span><span class="cx"> 
</span><span class="cx">         # Explicitly check the disabled record
</span><del>-        provisioningResource = (
-            self.principalRootResources['XMLDirectoryService']
-        )
</del><ins>+        provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><span class="cx">         self.failUnlessIdentical(
</span><del>-            provisioningResource.principalForCalendarUserAddress(
-                &quot;mailto:nocalendar@example.com&quot;
</del><ins>+            (
+                yield provisioningResource.principalForCalendarUserAddress(
+                    &quot;mailto:nocalendar@example.com&quot;
+                )
</ins><span class="cx">             ),
</span><span class="cx">             None
</span><span class="cx">         )
</span><span class="cx">         self.failUnlessIdentical(
</span><del>-            provisioningResource.principalForCalendarUserAddress(
-                &quot;urn:uuid:543D28BA-F74F-4D5F-9243-B3E3A61171E5&quot;
</del><ins>+            (
+                yield provisioningResource.principalForCalendarUserAddress(
+                    &quot;urn:uuid:543D28BA-F74F-4D5F-9243-B3E3A61171E5&quot;
+                )
</ins><span class="cx">             ),
</span><span class="cx">             None
</span><span class="cx">         )
</span><span class="cx">         self.failUnlessIdentical(
</span><del>-            provisioningResource.principalForCalendarUserAddress(
-                &quot;/principals/users/nocalendar/&quot;
</del><ins>+            (
+                yield provisioningResource.principalForCalendarUserAddress(
+                    &quot;/principals/users/nocalendar/&quot;
+                )
</ins><span class="cx">             ),
</span><span class="cx">             None
</span><span class="cx">         )
</span><span class="cx">         self.failUnlessIdentical(
</span><del>-            provisioningResource.principalForCalendarUserAddress(
-                &quot;/principals/__uids__/543D28BA-F74F-4D5F-9243-B3E3A61171E5/&quot;
</del><ins>+            (
+                yield provisioningResource.principalForCalendarUserAddress(
+                    &quot;/principals/__uids__/&quot;
+                    &quot;543D28BA-F74F-4D5F-9243-B3E3A61171E5/&quot;
+                )
</ins><span class="cx">             ),
</span><span class="cx">             None
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_enabledForCalendaring(self):
</del><ins>+    def test_hasCalendars(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
</del><ins>+        DirectoryPrincipalProvisioningResource
+        .principalForCalendarUserAddress()
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            principal = provisioningResource.principalForRecord(record)
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            principal = yield provisioningResource.principalForRecord(record)
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">             else:
</span><span class="cx">                 self.failIf(principal is not None)
</span><span class="cx">                 continue
</span><del>-            if record.enabledForCalendaring:
</del><ins>+            if record.hasCalendars:
</ins><span class="cx">                 self.assertTrue(
</span><span class="cx">                     isinstance(principal, DirectoryCalendarPrincipalResource)
</span><span class="cx">                 )
</span><span class="lines">@@ -364,7 +358,7 @@
</span><span class="cx">                 self.assertTrue(
</span><span class="cx">                     isinstance(principal, DirectoryPrincipalResource)
</span><span class="cx">                 )
</span><del>-                if record.enabledForAddressBooks:
</del><ins>+                if record.hasContacts:
</ins><span class="cx">                     self.assertTrue(
</span><span class="cx">                         isinstance(
</span><span class="cx">                             principal, DirectoryCalendarPrincipalResource
</span><span class="lines">@@ -397,7 +391,7 @@
</span><span class="cx">                         % (principal, property,)
</span><span class="cx">                     )
</span><span class="cx"> 
</span><del>-            if record.enabledForCalendaring:
</del><ins>+            if record.hasCalendars:
</ins><span class="cx">                 yield hasProperty(
</span><span class="cx">                     (caldav_namespace, &quot;calendar-home-set&quot;)
</span><span class="cx">                 )
</span><span class="lines">@@ -448,7 +442,7 @@
</span><span class="cx">                     (calendarserver_namespace, &quot;auto-schedule&quot;)
</span><span class="cx">                 )
</span><span class="cx"> 
</span><del>-            if record.enabledForAddressBooks:
</del><ins>+            if record.hasContacts:
</ins><span class="cx">                 yield hasProperty(carddavxml.AddressBookHomeSet.qname())
</span><span class="cx">             else:
</span><span class="cx">                 yield doesNotHaveProperty(
</span><span class="lines">@@ -456,20 +450,23 @@
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_enabledAsOrganizer(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
</del><ins>+        DirectoryPrincipalProvisioningResource
+        .principalForCalendarUserAddress()
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-
</del><span class="cx">         ok_types = (
</span><del>-            DirectoryService.recordType_users,
</del><ins>+            self.directory.recordType.user,
</ins><span class="cx">         )
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
</del><ins>+        ) in (yield self._allRecords()):
</ins><span class="cx"> 
</span><del>-            if record.enabledForCalendaring:
-                principal = provisioningResource.principalForRecord(record)
</del><ins>+            if record.hasCalendars:
+                principal = (
+                    yield provisioningResource.principalForRecord(record)
+                )
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEqual(
</span><span class="cx">                     principal.enabledAsOrganizer(),
</span><span class="lines">@@ -480,16 +477,18 @@
</span><span class="cx">         config.Scheduling.Options.AllowLocationAsOrganizer = True
</span><span class="cx">         config.Scheduling.Options.AllowResourceAsOrganizer = True
</span><span class="cx">         ok_types = (
</span><del>-            DirectoryService.recordType_users,
-            DirectoryService.recordType_groups,
-            DirectoryService.recordType_locations,
-            DirectoryService.recordType_resources,
</del><ins>+            self.directory.recordType.user,
+            self.directory.recordType.group,
+            self.directory.recordType.location,
+            self.directory.recordType.resource,
</ins><span class="cx">         )
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
-                principal = provisioningResource.principalForRecord(record)
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
+                principal = (
+                    yield provisioningResource.principalForRecord(record)
+                )
</ins><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEqual(
</span><span class="cx">                     principal.enabledAsOrganizer(),
</span><span class="lines">@@ -504,6 +503,7 @@
</span><span class="cx">     # DirectoryPrincipalResource
</span><span class="cx">     ##
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_cacheNotifier(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Each DirectoryPrincipalResource should have a cacheNotifier attribute
</span><span class="lines">@@ -511,8 +511,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failUnless(
</span><span class="cx">                     isinstance(
</span><span class="cx">                         recordResource.cacheNotifier,
</span><span class="lines">@@ -521,14 +521,15 @@
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_displayName(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.displayName()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 self.failUnless(recordResource.displayName())
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -539,11 +540,11 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 members = yield recordResource.groupMembers()
</span><span class="cx">                 self.failUnless(
</span><del>-                    set(record.members()).issubset(
</del><ins>+                    set((yield record.members())).issubset(
</ins><span class="cx">                         set(r.record for r in members)
</span><span class="cx">                     )
</span><span class="cx">                 )
</span><span class="lines">@@ -556,11 +557,11 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 memberships = yield recordResource.groupMemberships()
</span><span class="cx">                 self.failUnless(
</span><del>-                    set(record.groups()).issubset(
</del><ins>+                    set((yield record.groups())).issubset(
</ins><span class="cx">                         set(
</span><span class="cx">                             r.record
</span><span class="cx">                             for r in memberships if hasattr(r, &quot;record&quot;)
</span><span class="lines">@@ -569,49 +570,53 @@
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_principalUID(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.principalUID()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
</ins><span class="cx">                 self.assertEquals(record.guid, recordResource.principalUID())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_calendarUserAddresses(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.calendarUserAddresses()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 self.assertEqual(
</span><span class="cx">                     set(record.calendarUserAddresses),
</span><span class="cx">                     set(recordResource.calendarUserAddresses())
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx">                 # Verify that if not enabled for calendaring, no CUAs:
</span><del>-                record.enabledForCalendaring = False
</del><ins>+                record.hasCalendars = False
</ins><span class="cx">                 self.failIf(recordResource.calendarUserAddresses())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.canonicalCalendarUserAddress()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 self.failUnless(
</span><span class="cx">                     recordResource.canonicalCalendarUserAddress()
</span><span class="cx">                     .startswith(&quot;urn:uuid:&quot;)
</span><span class="cx">                 )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_addressBookHomeURLs(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.addressBookHomeURLs(),
</span><span class="lines">@@ -620,57 +625,43 @@
</span><span class="cx">         # homes.
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForAddressBooks:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasContacts:
</ins><span class="cx">                 self.failIf(tuple(recordResource.addressBookHomeURLs()))
</span><span class="cx"> 
</span><del>-        # Need to create a addressbook home provisioner for each service.
-        addressBookRootResources = {}
</del><ins>+        path = os.path.join(self.docroot, self.directory.__class__.__name__)
</ins><span class="cx"> 
</span><del>-        directory = self.directory
-        path = os.path.join(self.docroot, directory.__class__.__name__)
-
</del><span class="cx">         if os.path.exists(path):
</span><span class="cx">             rmdir(path)
</span><span class="cx">         os.mkdir(path)
</span><span class="cx"> 
</span><del>-        # need a data store
-        newstore = commondatastore(path, none, none, true, false)
-
-        provisioningresource = directoryaddressbookhomeprovisioningresource(
-            directory,
</del><ins>+        addressBookRootResource = DirectoryAddressBookHomeProvisioningResource(
+            self.directory,
</ins><span class="cx">             &quot;/addressbooks/&quot;,
</span><del>-            newstore
</del><ins>+            self.storeUnderTest()
</ins><span class="cx">         )
</span><span class="cx"> 
</span><del>-        addressbookrootresources[directory.__class__.__name__] = (
-            provisioningResource
-        )
-
</del><span class="cx">         # AddressBook home provisioners should result in addressBook homes.
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForAddressBooks:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasContacts:
</ins><span class="cx">                 homeURLs = tuple(recordResource.addressBookHomeURLs())
</span><span class="cx">                 self.failUnless(homeURLs)
</span><span class="cx"> 
</span><del>-                # Turn off enabledForAddressBooks and addressBookHomeURLs
</del><ins>+                # Turn off hasContacts and addressBookHomeURLs
</ins><span class="cx">                 # should be empty
</span><del>-                record.enabledForAddressBooks = False
</del><ins>+                record.hasContacts = False
</ins><span class="cx">                 self.failIf(tuple(recordResource.addressBookHomeURLs()))
</span><del>-                record.enabledForAddressBooks = True
</del><ins>+                record.hasContacts = True
</ins><span class="cx"> 
</span><del>-                addressBookRootURL = (
-                    addressBookRootResources[
-                        record.service.__class__.__name__
-                    ].url()
-                )
</del><ins>+                addressBookRootURL = addressBookRootResource.url()
</ins><span class="cx"> 
</span><span class="cx">                 for homeURL in homeURLs:
</span><span class="cx">                     self.failUnless(homeURL.startswith(addressBookRootURL))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_calendarHomeURLs(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.calendarHomeURLs(),
</span><span class="lines">@@ -680,8 +671,8 @@
</span><span class="cx">         # No calendar home provisioner should result in no calendar homes.
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 self.failIf(tuple(recordResource.calendarHomeURLs()))
</span><span class="cx">                 self.failIf(recordResource.scheduleInboxURL())
</span><span class="cx">                 self.failIf(recordResource.scheduleOutboxURL())
</span><span class="lines">@@ -689,8 +680,7 @@
</span><span class="cx">         # Need to create a calendar home provisioner for each service.
</span><span class="cx">         calendarRootResources = {}
</span><span class="cx"> 
</span><del>-        directory = self.directory
-        path = os.path.join(self.docroot, directory.__class__.__name__)
</del><ins>+        path = os.path.join(self.docroot, self.directory.__class__.__name__)
</ins><span class="cx"> 
</span><span class="cx">         if os.path.exists(path):
</span><span class="cx">             rmdir(path)
</span><span class="lines">@@ -700,28 +690,28 @@
</span><span class="cx">         _newStore = CommonDataStore(path, None, None, True, False)
</span><span class="cx"> 
</span><span class="cx">         provisioningResource = DirectoryCalendarHomeProvisioningResource(
</span><del>-            directory,
</del><ins>+            self.directory,
</ins><span class="cx">             &quot;/calendars/&quot;,
</span><span class="cx">             _newStore
</span><span class="cx">         )
</span><span class="cx"> 
</span><del>-        calendarRootResources[directory.__class__.__name__] = (
</del><ins>+        calendarRootResources[self.directory.__class__.__name__] = (
</ins><span class="cx">             provisioningResource
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         # Calendar home provisioners should result in calendar homes.
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 homeURLs = tuple(recordResource.calendarHomeURLs())
</span><span class="cx">                 self.failUnless(homeURLs)
</span><span class="cx"> 
</span><del>-                # Turn off enabledForCalendaring and calendarHomeURLs should
</del><ins>+                # Turn off hasCalendars and calendarHomeURLs should
</ins><span class="cx">                 # be empty
</span><del>-                record.enabledForCalendaring = False
</del><ins>+                record.hasCalendars = False
</ins><span class="cx">                 self.failIf(tuple(recordResource.calendarHomeURLs()))
</span><del>-                record.enabledForCalendaring = True
</del><ins>+                record.hasCalendars = True
</ins><span class="cx"> 
</span><span class="cx">                 calendarRootURL = (
</span><span class="cx">                     calendarRootResources[
</span><span class="lines">@@ -752,6 +742,7 @@
</span><span class="cx">                 self.failIf(outboxURL)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_canAutoSchedule(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.canAutoSchedule()
</span><span class="lines">@@ -760,8 +751,8 @@
</span><span class="cx">         # Set all resources and locations to auto-schedule, plus one user
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 if (
</span><span class="cx">                     recordType in (&quot;locations&quot;, &quot;resources&quot;) or
</span><span class="cx">                     record.uid == &quot;cdaboo&quot;
</span><span class="lines">@@ -771,8 +762,8 @@
</span><span class="cx">         # Default state - resources and locations, enabled, others not
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 if recordType in (&quot;locations&quot;, &quot;resources&quot;):
</span><span class="cx">                     self.assertTrue(recordResource.canAutoSchedule())
</span><span class="cx">                 else:
</span><span class="lines">@@ -782,8 +773,8 @@
</span><span class="cx">         self.patch(config.Scheduling.Options.AutoSchedule, &quot;AllowUsers&quot;, True)
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 if (
</span><span class="cx">                     recordType in (&quot;locations&quot;, &quot;resources&quot;) or
</span><span class="cx">                     record.uid == &quot;cdaboo&quot;
</span><span class="lines">@@ -796,11 +787,12 @@
</span><span class="cx">         self.patch(config.Scheduling.Options.AutoSchedule, &quot;Enabled&quot;, False)
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabledForCalendaring:
</del><ins>+        ) in (yield self._allRecords()):
+            if record.hasCalendars:
</ins><span class="cx">                 self.assertFalse(recordResource.canAutoSchedule())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def test_canAutoScheduleAutoAcceptGroup(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.canAutoSchedule(organizer)
</span><span class="lines">@@ -812,7 +804,7 @@
</span><span class="cx"> 
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
</del><ins>+        ) in (yield self._allRecords()):
</ins><span class="cx">             if record.uid == &quot;apollo&quot;:
</span><span class="cx"> 
</span><span class="cx">                 # No organizer
</span><span class="lines">@@ -839,10 +831,12 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><del>-        ) in self._allRecords():
-            if record.enabled:
-                for args in _authReadOnlyPrivileges(
-                    self, recordResource, recordResource.principalURL()
</del><ins>+        ) in (yield self._allRecords()):
+            if True:  # user.enabled:
+                for args in (
+                    yield _authReadOnlyPrivileges(
+                        self, recordResource, recordResource.principalURL()
+                    )
</ins><span class="cx">                 ):
</span><span class="cx">                     yield self._checkPrivileges(*args)
</span><span class="cx"> 
</span><span class="lines">@@ -852,24 +846,24 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Default access controls for principal provisioning resources.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        directory = self.directory
-        #print(&quot;\n -&gt; %s&quot; % (directory.__class__.__name__,))
-        provisioningResource = (
-            self.principalRootResources[directory.__class__.__name__]
-        )
</del><ins>+        provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><del>-        for args in _authReadOnlyPrivileges(
-            self, provisioningResource,
-            provisioningResource.principalCollectionURL()
</del><ins>+        for args in (
+            yield _authReadOnlyPrivileges(
+                self, provisioningResource,
+                provisioningResource.principalCollectionURL()
+            )
</ins><span class="cx">         ):
</span><span class="cx">             yield self._checkPrivileges(*args)
</span><span class="cx"> 
</span><span class="cx">         for recordType in (yield provisioningResource.listChildren()):
</span><span class="cx">             #print(&quot;   -&gt; %s&quot; % (recordType,))
</span><del>-            typeResource = provisioningResource.getChild(recordType)
</del><ins>+            typeResource = yield provisioningResource.getChild(recordType)
</ins><span class="cx"> 
</span><del>-            for args in _authReadOnlyPrivileges(
-                self, typeResource, typeResource.principalCollectionURL()
</del><ins>+            for args in (
+                yield _authReadOnlyPrivileges(
+                    self, typeResource, typeResource.principalCollectionURL()
+                )
</ins><span class="cx">             ):
</span><span class="cx">                 yield self._checkPrivileges(*args)
</span><span class="cx"> 
</span><span class="lines">@@ -884,9 +878,7 @@
</span><span class="cx">             def qname(self):
</span><span class="cx">                 return self.ns, self.name
</span><span class="cx"> 
</span><del>-        provisioningResource = (
-            self.principalRootResources['XMLDirectoryService']
-        )
</del><ins>+        provisioningResource = self.principalRootResource
</ins><span class="cx"> 
</span><span class="cx">         expected = (
</span><span class="cx">             (
</span><span class="lines">@@ -961,6 +953,7 @@
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
</ins><span class="cx">     def _allRecords(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: an iterable of tuples
</span><span class="lines">@@ -968,18 +961,21 @@
</span><span class="cx">             where C{provisioningResource} is the root provisioning resource,
</span><span class="cx">             C{recordType} is the record type, C{recordResource} is the
</span><span class="cx">             principal resource and C{record} is the directory service record
</span><del>-            for each record in each directory in C{directoryServices}.
</del><ins>+            for each record the directory.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        directory = self.directory
-        provisioningResource = self.principalRootResources[
-            directory.__class__.__name__
-        ]
-        for recordType in directory.recordTypes():
-            for record in directory.listRecords(recordType):
</del><ins>+        provisioningResource = self.principalRootResource
+        results = []
+        for recordType in self.directory.recordTypes():
+            for record in (
+                yield self.directory.recordsWithRecordType(recordType)
+            ):
</ins><span class="cx">                 recordResource = (
</span><del>-                    provisioningResource.principalForRecord(record)
</del><ins>+                    yield provisioningResource.principalForRecord(record)
</ins><span class="cx">                 )
</span><del>-                yield provisioningResource, recordType, recordResource, record
</del><ins>+                results.append(
+                    (provisioningResource, recordType, recordResource, record)
+                )
+        returnValue(results)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def _checkPrivileges(self, resource, url, principal, privilege, allowed):
</span><span class="lines">@@ -1017,12 +1013,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+@inlineCallbacks
</ins><span class="cx"> def _authReadOnlyPrivileges(self, resource, url):
</span><span class="cx">     items = []
</span><span class="cx">     for (
</span><span class="cx">         provisioningResource, recordType, recordResource, record
</span><del>-    ) in self._allRecords():
-        if record.enabled:
</del><ins>+    ) in (yield self._allRecords()):
+        if True:  # user.enabled:
</ins><span class="cx">             items.append((
</span><span class="cx">                 davxml.HRef().fromString(recordResource.principalURL()),
</span><span class="cx">                 davxml.Read(), True
</span><span class="lines">@@ -1038,5 +1035,8 @@
</span><span class="cx">         davxml.Unauthenticated(), davxml.Write(), False
</span><span class="cx">     ))
</span><span class="cx"> 
</span><ins>+    results = []
</ins><span class="cx">     for principal, privilege, allowed in items:
</span><del>-        yield resource, url, principal, privilege, allowed
</del><ins>+        results.append((resource, url, principal, privilege, allowed))
+
+    returnValue(results)
</ins></span></pre>
</div>
</div>

</body>
</html>