<!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>[12971] 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/12971">12971</a></dd>
<dt>Author</dt> <dd>wsanchez@apple.com</dd>
<dt>Date</dt> <dd>2014-03-19 12:17:18 -0700 (Wed, 19 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>lint</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 (12970 => 12971)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py        2014-03-19 16:55:24 UTC (rev 12970)
+++ CalendarServer/branches/users/sagen/move2who-4/twistedcaldav/directory/test/test_principal.py        2014-03-19 19:17:18 UTC (rev 12971)
</span><span class="lines">@@ -20,29 +20,38 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><ins>+
+from txweb2.dav.fileop import rmdir
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
+
+from txdav.common.datastore.file import CommonDataStore
+from txdav.xml import element as davxml
+
</ins><span class="cx"> from twistedcaldav import carddavxml
</span><span class="cx"> from twistedcaldav.cache import DisabledCacheNotifier
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.customxml import calendarserver_namespace
</span><del>-from twistedcaldav.directory.addressbook import DirectoryAddressBookHomeProvisioningResource
-from twistedcaldav.directory.calendar import DirectoryCalendarHomeProvisioningResource
-from twistedcaldav.directory.principal import DirectoryCalendarPrincipalResource
-from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
-from twistedcaldav.directory.principal import DirectoryPrincipalResource
-from twistedcaldav.directory.principal import DirectoryPrincipalTypeProvisioningResource
</del><ins>+from twistedcaldav.directory.addressbook import (
+    DirectoryAddressBookHomeProvisioningResource
+)
+from twistedcaldav.directory.calendar import (
+    DirectoryCalendarHomeProvisioningResource
+)
+from twistedcaldav.directory.principal import (
+    DirectoryCalendarPrincipalResource,
+    DirectoryPrincipalProvisioningResource,
+    DirectoryPrincipalResource,
+    DirectoryPrincipalTypeProvisioningResource,
+)
</ins><span class="cx"> from twistedcaldav.test.util import StoreTestCase
</span><del>-from txdav.common.datastore.file import CommonDataStore
-from txdav.xml import element as davxml
-from txweb2.dav.fileop import rmdir
-from txweb2.dav.resource import AccessDeniedError
-from txweb2.http import HTTPError
-from txweb2.test.test_server import SimpleRequest
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-
-class ProvisionedPrincipals(StoreTestCase):  # twistedcaldav.test.util.TestCase):
</del><ins>+# twistedcaldav.test.util.TestCase
+class ProvisionedPrincipals(StoreTestCase):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory service provisioned principals.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -93,13 +102,21 @@
</span><span class="cx">         directory = self.directory
</span><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.principalRootResources[directory.__class__.__name__]
+            )
</ins><span class="cx"> 
</span><span class="cx">             provisioningURL = &quot;/&quot; + directory.__class__.__name__ + &quot;/&quot;
</span><del>-            self.assertEquals(provisioningURL, provisioningResource.principalCollectionURL())
</del><ins>+            self.assertEquals(
+                provisioningURL,
+                provisioningResource.principalCollectionURL()
+            )
</ins><span class="cx"> 
</span><span class="cx">             principalCollections = provisioningResource.principalCollections()
</span><del>-            self.assertEquals(set((provisioningURL,)), set(pc.principalCollectionURL() for pc in principalCollections))
</del><ins>+            self.assertEquals(
+                set((provisioningURL,)),
+                set(pc.principalCollectionURL() for pc in principalCollections)
+            )
</ins><span class="cx"> 
</span><span class="cx">             recordTypes = set((yield provisioningResource.listChildren()))
</span><span class="cx">             self.assertEquals(recordTypes, set(directory.recordTypes()))
</span><span class="lines">@@ -107,13 +124,26 @@
</span><span class="cx">             for recordType in recordTypes:
</span><span class="cx">                 #print(&quot;   -&gt; %s&quot; % (recordType,))
</span><span class="cx">                 typeResource = provisioningResource.getChild(recordType)
</span><del>-                self.failUnless(isinstance(typeResource, DirectoryPrincipalTypeProvisioningResource))
</del><ins>+                self.failUnless(
+                    isinstance(
+                        typeResource,
+                        DirectoryPrincipalTypeProvisioningResource
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx">                 typeURL = provisioningURL + recordType + &quot;/&quot;
</span><del>-                self.assertEquals(typeURL, typeResource.principalCollectionURL())
</del><ins>+                self.assertEquals(
+                    typeURL, typeResource.principalCollectionURL()
+                )
</ins><span class="cx"> 
</span><span class="cx">                 principalCollections = typeResource.principalCollections()
</span><del>-                self.assertEquals(set((provisioningURL,)), set(pc.principalCollectionURL() for pc in principalCollections))
</del><ins>+                self.assertEquals(
+                    set((provisioningURL,)),
+                    set(
+                        pc.principalCollectionURL()
+                        for pc in principalCollections
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx">                 shortNames = set((yield typeResource.listChildren()))
</span><span class="cx">                 # Handle records with mulitple shortNames
</span><span class="lines">@@ -126,21 +156,39 @@
</span><span class="cx">                 for shortName in shortNames:
</span><span class="cx">                     #print(&quot;     -&gt; %s&quot; % (shortName,))
</span><span class="cx">                     recordResource = typeResource.getChild(shortName)
</span><del>-                    self.failUnless(isinstance(recordResource, DirectoryPrincipalResource))
</del><ins>+                    self.failUnless(
+                        isinstance(recordResource, DirectoryPrincipalResource)
+                    )
</ins><span class="cx"> 
</span><span class="cx">                     # shortName may be non-ascii
</span><span class="cx">                     recordURL = typeURL + quote(shortName) + &quot;/&quot;
</span><del>-                    self.assertIn(recordURL, (recordResource.principalURL(),) + tuple(recordResource.alternateURIs()))
</del><ins>+                    self.assertIn(
+                        recordURL,
+                        (
+                            (recordResource.principalURL(),) +
+                            tuple(recordResource.alternateURIs())
+                        )
+                    )
</ins><span class="cx"> 
</span><del>-                    principalCollections = recordResource.principalCollections()
-                    self.assertEquals(set((provisioningURL,)), set(pc.principalCollectionURL() for pc in principalCollections))
</del><ins>+                    principalCollections = (
+                        recordResource.principalCollections()
+                    )
+                    self.assertEquals(
+                        set((provisioningURL,)),
+                        set(
+                            pc.principalCollectionURL()
+                            for pc in principalCollections
+                        )
+                    )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><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><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 self.assertEquals(recordResource.record, record)
</span><span class="cx"> 
</span><span class="lines">@@ -153,8 +201,12 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForShortName()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for provisioningResource, recordType, _ignore_recordResource, record in self._allRecords():
-            principal = provisioningResource.principalForShortName(recordType, record.shortNames[0])
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
+            principal = provisioningResource.principalForShortName(
+                recordType, record.shortNames[0]
+            )
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 self.failIf(principal is None)
</span><span class="cx">                 self.assertEquals(record, principal.record)
</span><span class="lines">@@ -167,10 +219,14 @@
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForUser()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         directory = self.directory
</span><del>-        provisioningResource = self.principalRootResources[directory.__class__.__name__]
</del><ins>+        provisioningResource = (
+            self.principalRootResources[directory.__class__.__name__]
+        )
</ins><span class="cx"> 
</span><span class="cx">         for user in directory.listRecords(DirectoryService.recordType_users):
</span><del>-            userResource = provisioningResource.principalForUser(user.shortNames[0])
</del><ins>+            userResource = provisioningResource.principalForUser(
+                user.shortNames[0]
+            )
</ins><span class="cx">             if user.enabled:
</span><span class="cx">                 self.failIf(userResource is None)
</span><span class="cx">                 self.assertEquals(user, userResource.record)
</span><span class="lines">@@ -183,7 +239,9 @@
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForAuthID()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         directory = self.directory
</span><del>-        provisioningResource = self.principalRootResources[directory.__class__.__name__]
</del><ins>+        provisioningResource = (
+            self.principalRootResources[directory.__class__.__name__]
+        )
</ins><span class="cx"> 
</span><span class="cx">         for user in directory.listRecords(DirectoryService.recordType_users):
</span><span class="cx">             creds = UsernamePassword(user.shortNames[0], &quot;bogus&quot;)
</span><span class="lines">@@ -199,7 +257,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForUID()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for provisioningResource, _ignore_recordType, _ignore_recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             principal = provisioningResource.principalForUID(record.uid)
</span><span class="cx">             if record.enabled:
</span><span class="cx">                 self.failIf(principal is None)
</span><span class="lines">@@ -212,7 +272,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForRecord()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for provisioningResource, _ignore_recordType, _ignore_recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             principal = provisioningResource.principalForRecord(record)
</span><span class="cx">             if record.enabled:
</span><span class="cx">                 self.failIf(principal is None)
</span><span class="lines">@@ -226,7 +288,7 @@
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for (
</span><del>-            provisioningResource, _ignore_recordType, recordResource, record
</del><ins>+            provisioningResource, recordType, recordResource, record
</ins><span class="cx">         ) in self._allRecords():
</span><span class="cx"> 
</span><span class="cx">             test_items = tuple(record.calendarUserAddresses)
</span><span class="lines">@@ -239,7 +301,10 @@
</span><span class="cx">                 test_items += (principalURL, alternateURL)
</span><span class="cx"> 
</span><span class="cx">             for address in test_items:
</span><del>-                principal = provisioningResource.principalForCalendarUserAddress(address)
</del><ins>+                principal = (
+                    provisioningResource
+                    .principalForCalendarUserAddress(address)
+                )
</ins><span class="cx">                 if record.enabledForCalendaring:
</span><span class="cx">                     self.failIf(principal is None)
</span><span class="cx">                     self.assertEquals(record, principal.record)
</span><span class="lines">@@ -247,7 +312,9 @@
</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.principalRootResources['XMLDirectoryService']
+        )
</ins><span class="cx"> 
</span><span class="cx">         self.failUnlessIdentical(
</span><span class="cx">             provisioningResource.principalForCalendarUserAddress(
</span><span class="lines">@@ -280,7 +347,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalProvisioningResource.principalForCalendarUserAddress()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for provisioningResource, _ignore_recordType, _ignore_recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             principal = provisioningResource.principalForRecord(record)
</span><span class="cx">             if record.enabled:
</span><span class="cx">                 self.failIf(principal is None)
</span><span class="lines">@@ -288,13 +357,25 @@
</span><span class="cx">                 self.failIf(principal is not None)
</span><span class="cx">                 continue
</span><span class="cx">             if record.enabledForCalendaring:
</span><del>-                self.assertTrue(isinstance(principal, DirectoryCalendarPrincipalResource))
</del><ins>+                self.assertTrue(
+                    isinstance(principal, DirectoryCalendarPrincipalResource)
+                )
</ins><span class="cx">             else:
</span><del>-                self.assertTrue(isinstance(principal, DirectoryPrincipalResource))
</del><ins>+                self.assertTrue(
+                    isinstance(principal, DirectoryPrincipalResource)
+                )
</ins><span class="cx">                 if record.enabledForAddressBooks:
</span><del>-                    self.assertTrue(isinstance(principal, DirectoryCalendarPrincipalResource))
</del><ins>+                    self.assertTrue(
+                        isinstance(
+                            principal, DirectoryCalendarPrincipalResource
+                        )
+                    )
</ins><span class="cx">                 else:
</span><del>-                    self.assertFalse(isinstance(principal, DirectoryCalendarPrincipalResource))
</del><ins>+                    self.assertFalse(
+                        isinstance(
+                            principal, DirectoryCalendarPrincipalResource
+                        )
+                    )
</ins><span class="cx"> 
</span><span class="cx">             @inlineCallbacks
</span><span class="cx">             def hasProperty(property):
</span><span class="lines">@@ -311,31 +392,68 @@
</span><span class="cx">                 except:
</span><span class="cx">                     self.fail(&quot;Wrong exception type&quot;)
</span><span class="cx">                 else:
</span><del>-                    self.fail(&quot;No exception principal: %s, property %s&quot; % (principal, property,))
</del><ins>+                    self.fail(
+                        &quot;No exception principal: %s, property %s&quot;
+                        % (principal, property,)
+                    )
</ins><span class="cx"> 
</span><span class="cx">             if record.enabledForCalendaring:
</span><del>-                yield hasProperty((caldav_namespace, &quot;calendar-home-set&quot;))
-                yield hasProperty((caldav_namespace, &quot;calendar-user-address-set&quot;))
-                yield hasProperty((caldav_namespace, &quot;schedule-inbox-URL&quot;))
-                yield hasProperty((caldav_namespace, &quot;schedule-outbox-URL&quot;))
-                yield hasProperty((caldav_namespace, &quot;calendar-user-type&quot;))
-                yield hasProperty((calendarserver_namespace, &quot;calendar-proxy-read-for&quot;))
-                yield hasProperty((calendarserver_namespace, &quot;calendar-proxy-write-for&quot;))
-                yield hasProperty((calendarserver_namespace, &quot;auto-schedule&quot;))
</del><ins>+                yield hasProperty(
+                    (caldav_namespace, &quot;calendar-home-set&quot;)
+                )
+                yield hasProperty(
+                    (caldav_namespace, &quot;calendar-user-address-set&quot;)
+                )
+                yield hasProperty(
+                    (caldav_namespace, &quot;schedule-inbox-URL&quot;)
+                )
+                yield hasProperty(
+                    (caldav_namespace, &quot;schedule-outbox-URL&quot;)
+                )
+                yield hasProperty(
+                    (caldav_namespace, &quot;calendar-user-type&quot;)
+                )
+                yield hasProperty(
+                    (calendarserver_namespace, &quot;calendar-proxy-read-for&quot;)
+                )
+                yield hasProperty(
+                    (calendarserver_namespace, &quot;calendar-proxy-write-for&quot;)
+                )
+                yield hasProperty(
+                    (calendarserver_namespace, &quot;auto-schedule&quot;)
+                )
</ins><span class="cx">             else:
</span><del>-                yield doesNotHaveProperty((caldav_namespace, &quot;calendar-home-set&quot;))
-                yield doesNotHaveProperty((caldav_namespace, &quot;calendar-user-address-set&quot;))
-                yield doesNotHaveProperty((caldav_namespace, &quot;schedule-inbox-URL&quot;))
-                yield doesNotHaveProperty((caldav_namespace, &quot;schedule-outbox-URL&quot;))
-                yield doesNotHaveProperty((caldav_namespace, &quot;calendar-user-type&quot;))
-                yield doesNotHaveProperty((calendarserver_namespace, &quot;calendar-proxy-read-for&quot;))
-                yield doesNotHaveProperty((calendarserver_namespace, &quot;calendar-proxy-write-for&quot;))
-                yield doesNotHaveProperty((calendarserver_namespace, &quot;auto-schedule&quot;))
</del><ins>+                yield doesNotHaveProperty(
+                    (caldav_namespace, &quot;calendar-home-set&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (caldav_namespace, &quot;calendar-user-address-set&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (caldav_namespace, &quot;schedule-inbox-URL&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (caldav_namespace, &quot;schedule-outbox-URL&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (caldav_namespace, &quot;calendar-user-type&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (calendarserver_namespace, &quot;calendar-proxy-read-for&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (calendarserver_namespace, &quot;calendar-proxy-write-for&quot;)
+                )
+                yield doesNotHaveProperty(
+                    (calendarserver_namespace, &quot;auto-schedule&quot;)
+                )
</ins><span class="cx"> 
</span><span class="cx">             if record.enabledForAddressBooks:
</span><span class="cx">                 yield hasProperty(carddavxml.AddressBookHomeSet.qname())
</span><span class="cx">             else:
</span><del>-                yield doesNotHaveProperty(carddavxml.AddressBookHomeSet.qname())
</del><ins>+                yield doesNotHaveProperty(
+                    carddavxml.AddressBookHomeSet.qname()
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def test_enabledAsOrganizer(self):
</span><span class="lines">@@ -346,12 +464,17 @@
</span><span class="cx">         ok_types = (
</span><span class="cx">             DirectoryService.recordType_users,
</span><span class="cx">         )
</span><del>-        for provisioningResource, recordType, _ignore_recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx"> 
</span><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 principal = provisioningResource.principalForRecord(record)
</span><span class="cx">                 self.failIf(principal is None)
</span><del>-                self.assertEqual(principal.enabledAsOrganizer(), recordType in ok_types)
</del><ins>+                self.assertEqual(
+                    principal.enabledAsOrganizer(),
+                    recordType in ok_types
+                )
</ins><span class="cx"> 
</span><span class="cx">         config.Scheduling.Options.AllowGroupAsOrganizer = True
</span><span class="cx">         config.Scheduling.Options.AllowLocationAsOrganizer = True
</span><span class="lines">@@ -362,15 +485,20 @@
</span><span class="cx">             DirectoryService.recordType_locations,
</span><span class="cx">             DirectoryService.recordType_resources,
</span><span class="cx">         )
</span><del>-        for provisioningResource, recordType, _ignore_recordResource, record in self._allRecords():
-
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 principal = provisioningResource.principalForRecord(record)
</span><span class="cx">                 self.failIf(principal is None)
</span><del>-                self.assertEqual(principal.enabledAsOrganizer(), recordType in ok_types)
</del><ins>+                self.assertEqual(
+                    principal.enabledAsOrganizer(),
+                    recordType in ok_types
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-    # FIXME: Run DirectoryPrincipalProvisioningResource tests on DirectoryPrincipalTypeProvisioningResource also
</del><ins>+    # FIXME: Run DirectoryPrincipalProvisioningResource tests on
+    # DirectoryPrincipalTypeProvisioningResource also
</ins><span class="cx"> 
</span><span class="cx">     ##
</span><span class="cx">     # DirectoryPrincipalResource
</span><span class="lines">@@ -381,17 +509,25 @@
</span><span class="cx">         Each DirectoryPrincipalResource should have a cacheNotifier attribute
</span><span class="cx">         that is an instance of DisabledCacheNotifier
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><del>-                self.failUnless(isinstance(recordResource.cacheNotifier,
-                                           DisabledCacheNotifier))
</del><ins>+                self.failUnless(
+                    isinstance(
+                        recordResource.cacheNotifier,
+                        DisabledCacheNotifier
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><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><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 self.failUnless(recordResource.displayName())
</span><span class="cx"> 
</span><span class="lines">@@ -401,10 +537,16 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.groupMembers()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 members = yield recordResource.groupMembers()
</span><del>-                self.failUnless(set(record.members()).issubset(set(r.record for r in members)))
</del><ins>+                self.failUnless(
+                    set(record.members()).issubset(
+                        set(r.record for r in members)
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -412,17 +554,28 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.groupMemberships()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 memberships = yield recordResource.groupMemberships()
</span><del>-                self.failUnless(set(record.groups()).issubset(set(r.record for r in memberships if hasattr(r, &quot;record&quot;))))
</del><ins>+                self.failUnless(
+                    set(record.groups()).issubset(
+                        set(
+                            r.record
+                            for r in memberships if hasattr(r, &quot;record&quot;)
+                        )
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><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><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><span class="cx">                 self.assertEquals(record.guid, recordResource.principalUID())
</span><span class="cx"> 
</span><span class="lines">@@ -431,9 +584,14 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.calendarUserAddresses()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><del>-                self.assertEqual(set(record.calendarUserAddresses), set(recordResource.calendarUserAddresses()))
</del><ins>+                self.assertEqual(
+                    set(record.calendarUserAddresses),
+                    set(recordResource.calendarUserAddresses())
+                )
</ins><span class="cx"> 
</span><span class="cx">                 # Verify that if not enabled for calendaring, no CUAs:
</span><span class="cx">                 record.enabledForCalendaring = False
</span><span class="lines">@@ -444,17 +602,25 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.canonicalCalendarUserAddress()
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><del>-                self.failUnless(recordResource.canonicalCalendarUserAddress().startswith(&quot;urn:uuid:&quot;))
</del><ins>+                self.failUnless(
+                    recordResource.canonicalCalendarUserAddress()
+                    .startswith(&quot;urn:uuid:&quot;)
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def test_addressBookHomeURLs(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         DirectoryPrincipalResource.addressBookHomeURLs(),
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        # No addressbook home provisioner should result in no addressbook homes.
-        for provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        # No addressbook home provisioner should result in no addressbook
+        # homes.
+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForAddressBooks:
</span><span class="cx">                 self.failIf(tuple(recordResource.addressBookHomeURLs()))
</span><span class="cx"> 
</span><span class="lines">@@ -469,29 +635,37 @@
</span><span class="cx">         os.mkdir(path)
</span><span class="cx"> 
</span><span class="cx">         # need a data store
</span><del>-        _newstore = commondatastore(path, none, none, true, false)
</del><ins>+        newstore = commondatastore(path, none, none, true, false)
</ins><span class="cx"> 
</span><span class="cx">         provisioningresource = directoryaddressbookhomeprovisioningresource(
</span><span class="cx">             directory,
</span><span class="cx">             &quot;/addressbooks/&quot;,
</span><del>-            _newstore
</del><ins>+            newstore
</ins><span class="cx">         )
</span><span class="cx"> 
</span><del>-        addressbookrootresources[directory.__class__.__name__] = provisioningResource
</del><ins>+        addressbookrootresources[directory.__class__.__name__] = (
+            provisioningResource
+        )
</ins><span class="cx"> 
</span><span class="cx">         # AddressBook home provisioners should result in addressBook homes.
</span><del>-        for provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForAddressBooks:
</span><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 should
-                # be empty
</del><ins>+                # Turn off enabledForAddressBooks and addressBookHomeURLs
+                # should be empty
</ins><span class="cx">                 record.enabledForAddressBooks = False
</span><span class="cx">                 self.failIf(tuple(recordResource.addressBookHomeURLs()))
</span><span class="cx">                 record.enabledForAddressBooks = True
</span><span class="cx"> 
</span><del>-                addressBookRootURL = addressBookRootResources[record.service.__class__.__name__].url()
</del><ins>+                addressBookRootURL = (
+                    addressBookRootResources[
+                        record.service.__class__.__name__
+                    ].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="lines">@@ -504,7 +678,9 @@
</span><span class="cx">         DirectoryPrincipalResource.scheduleOutboxURL()
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         # No calendar home provisioner should result in no calendar homes.
</span><del>-        for provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 self.failIf(tuple(recordResource.calendarHomeURLs()))
</span><span class="cx">                 self.failIf(recordResource.scheduleInboxURL())
</span><span class="lines">@@ -529,10 +705,14 @@
</span><span class="cx">             _newStore
</span><span class="cx">         )
</span><span class="cx"> 
</span><del>-        calendarRootResources[directory.__class__.__name__] = provisioningResource
</del><ins>+        calendarRootResources[directory.__class__.__name__] = (
+            provisioningResource
+        )
</ins><span class="cx"> 
</span><span class="cx">         # Calendar home provisioners should result in calendar homes.
</span><del>-        for provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 homeURLs = tuple(recordResource.calendarHomeURLs())
</span><span class="cx">                 self.failUnless(homeURLs)
</span><span class="lines">@@ -543,7 +723,11 @@
</span><span class="cx">                 self.failIf(tuple(recordResource.calendarHomeURLs()))
</span><span class="cx">                 record.enabledForCalendaring = True
</span><span class="cx"> 
</span><del>-                calendarRootURL = calendarRootResources[record.service.__class__.__name__].url()
</del><ins>+                calendarRootURL = (
+                    calendarRootResources[
+                        record.service.__class__.__name__
+                    ].url()
+                )
</ins><span class="cx"> 
</span><span class="cx">                 inboxURL = recordResource.scheduleInboxURL()
</span><span class="cx">                 outboxURL = recordResource.scheduleOutboxURL()
</span><span class="lines">@@ -574,13 +758,20 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Set all resources and locations to auto-schedule, plus one user
</span><del>-        for _ignore_provisioningResource, recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><del>-                if recordType in (&quot;locations&quot;, &quot;resources&quot;) or record.uid == &quot;cdaboo&quot;:
</del><ins>+                if (
+                    recordType in (&quot;locations&quot;, &quot;resources&quot;) or
+                    record.uid == &quot;cdaboo&quot;
+                ):
</ins><span class="cx">                     recordResource.record.autoSchedule = True
</span><span class="cx"> 
</span><span class="cx">         # Default state - resources and locations, enabled, others not
</span><del>-        for _ignore_provisioningResource, recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 if recordType in (&quot;locations&quot;, &quot;resources&quot;):
</span><span class="cx">                     self.assertTrue(recordResource.canAutoSchedule())
</span><span class="lines">@@ -589,16 +780,23 @@
</span><span class="cx"> 
</span><span class="cx">         # Set config to allow users
</span><span class="cx">         self.patch(config.Scheduling.Options.AutoSchedule, &quot;AllowUsers&quot;, True)
</span><del>-        for _ignore_provisioningResource, recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><del>-                if recordType in (&quot;locations&quot;, &quot;resources&quot;) or record.uid == &quot;cdaboo&quot;:
</del><ins>+                if (
+                    recordType in (&quot;locations&quot;, &quot;resources&quot;) or
+                    record.uid == &quot;cdaboo&quot;
+                ):
</ins><span class="cx">                     self.assertTrue(recordResource.canAutoSchedule())
</span><span class="cx">                 else:
</span><span class="cx">                     self.assertFalse(recordResource.canAutoSchedule())
</span><span class="cx"> 
</span><span class="cx">         # Set config to disallow all
</span><span class="cx">         self.patch(config.Scheduling.Options.AutoSchedule, &quot;Enabled&quot;, False)
</span><del>-        for _ignore_provisioningResource, recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabledForCalendaring:
</span><span class="cx">                 self.assertFalse(recordResource.canAutoSchedule())
</span><span class="cx"> 
</span><span class="lines">@@ -608,19 +806,30 @@
</span><span class="cx">         DirectoryPrincipalResource.canAutoSchedule(organizer)
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        # Location &quot;apollo&quot; has an auto-accept group (&quot;both_coasts&quot;) set in augments.xml,
-        # therefore any organizer in that group should be able to auto schedule
</del><ins>+        # Location &quot;apollo&quot; has an auto-accept group (&quot;both_coasts&quot;) set in
+        # augments.xml, therefore any organizer in that group should be able to
+        # auto schedule
</ins><span class="cx"> 
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in 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="cx">                 self.assertFalse(recordResource.canAutoSchedule())
</span><span class="cx"> 
</span><span class="cx">                 # Organizer in auto-accept group
</span><del>-                self.assertTrue(recordResource.canAutoSchedule(organizer=&quot;mailto:wsanchez@example.com&quot;))
</del><ins>+                self.assertTrue(
+                    recordResource.canAutoSchedule(
+                        organizer=&quot;mailto:wsanchez@example.com&quot;
+                    )
+                )
</ins><span class="cx">                 # Organizer not in auto-accept group
</span><del>-                self.assertFalse(recordResource.canAutoSchedule(organizer=&quot;mailto:a@example.com&quot;))
</del><ins>+                self.assertFalse(
+                    recordResource.canAutoSchedule(
+                        organizer=&quot;mailto:a@example.com&quot;
+                    )
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -628,9 +837,13 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Default access controls for principals.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+        for (
+            provisioningResource, recordType, recordResource, record
+        ) in self._allRecords():
</ins><span class="cx">             if record.enabled:
</span><del>-                for args in _authReadOnlyPrivileges(self, recordResource, recordResource.principalURL()):
</del><ins>+                for args in _authReadOnlyPrivileges(
+                    self, recordResource, recordResource.principalURL()
+                ):
</ins><span class="cx">                     yield self._checkPrivileges(*args)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -641,16 +854,23 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         directory = self.directory
</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.principalRootResources[directory.__class__.__name__]
+        )
</ins><span class="cx"> 
</span><del>-        for args in _authReadOnlyPrivileges(self, provisioningResource, provisioningResource.principalCollectionURL()):
</del><ins>+        for args in _authReadOnlyPrivileges(
+            self, provisioningResource,
+            provisioningResource.principalCollectionURL()
+        ):
</ins><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><span class="cx">             typeResource = provisioningResource.getChild(recordType)
</span><span class="cx"> 
</span><del>-            for args in _authReadOnlyPrivileges(self, typeResource, typeResource.principalCollectionURL()):
</del><ins>+            for args in _authReadOnlyPrivileges(
+                self, typeResource, typeResource.principalCollectionURL()
+            ):
</ins><span class="cx">                 yield self._checkPrivileges(*args)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -664,23 +884,73 @@
</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.principalRootResources['XMLDirectoryService']
+        )
</ins><span class="cx"> 
</span><span class="cx">         expected = (
</span><del>-            (&quot;DAV:&quot;, &quot;displayname&quot;, &quot;morgen&quot;, &quot;fullName&quot;, &quot;morgen&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;, &quot;INDIVIDUAL&quot;, &quot;recordType&quot;, &quot;users&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;, &quot;GROUP&quot;, &quot;recordType&quot;, &quot;groups&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;, &quot;RESOURCE&quot;, &quot;recordType&quot;, &quot;resources&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;, &quot;ROOM&quot;, &quot;recordType&quot;, &quot;locations&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;/principals/__uids__/AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/&quot;, &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;http://example.com:8008/principals/__uids__/AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/&quot;, &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;urn:uuid:AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;, &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;/principals/users/example/&quot;, &quot;recordName&quot;, &quot;example&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;https://example.com:8443/principals/users/example/&quot;, &quot;recordName&quot;, &quot;example&quot;),
-            (&quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;, &quot;mailto:example@example.com&quot;, &quot;emailAddresses&quot;, &quot;example@example.com&quot;),
-            (&quot;http://calendarserver.org/ns/&quot;, &quot;first-name&quot;, &quot;morgen&quot;, &quot;firstName&quot;, &quot;morgen&quot;),
-            (&quot;http://calendarserver.org/ns/&quot;, &quot;last-name&quot;, &quot;sagen&quot;, &quot;lastName&quot;, &quot;sagen&quot;),
-            (&quot;http://calendarserver.org/ns/&quot;, &quot;email-address-set&quot;, &quot;example@example.com&quot;, &quot;emailAddresses&quot;, &quot;example@example.com&quot;),
</del><ins>+            (
+                &quot;DAV:&quot;, &quot;displayname&quot;,
+                &quot;morgen&quot;, &quot;fullName&quot;, &quot;morgen&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;,
+                &quot;INDIVIDUAL&quot;, &quot;recordType&quot;, &quot;users&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;,
+                &quot;GROUP&quot;, &quot;recordType&quot;, &quot;groups&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;,
+                &quot;RESOURCE&quot;, &quot;recordType&quot;, &quot;resources&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-type&quot;,
+                &quot;ROOM&quot;, &quot;recordType&quot;, &quot;locations&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;/principals/__uids__/AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/&quot;,
+                &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;http://example.com:8008/principals/__uids__/&quot;
+                &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/&quot;,
+                &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;urn:uuid:AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;,
+                &quot;guid&quot;, &quot;AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;/principals/users/example/&quot;, &quot;recordName&quot;, &quot;example&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;https://example.com:8443/principals/users/example/&quot;,
+                &quot;recordName&quot;, &quot;example&quot;
+            ),
+            (
+                &quot;urn:ietf:params:xml:ns:caldav&quot;, &quot;calendar-user-address-set&quot;,
+                &quot;mailto:example@example.com&quot;,
+                &quot;emailAddresses&quot;, &quot;example@example.com&quot;
+            ),
+            (
+                &quot;http://calendarserver.org/ns/&quot;, &quot;first-name&quot;,
+                &quot;morgen&quot;, &quot;firstName&quot;, &quot;morgen&quot;
+            ),
+            (
+                &quot;http://calendarserver.org/ns/&quot;, &quot;last-name&quot;,
+                &quot;sagen&quot;, &quot;lastName&quot;, &quot;sagen&quot;
+            ),
+            (
+                &quot;http://calendarserver.org/ns/&quot;, &quot;email-address-set&quot;,
+                &quot;example@example.com&quot;, &quot;emailAddresses&quot;, &quot;example@example.com&quot;
+            ),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         for ns, property, match, field, converted in expected:
</span><span class="lines">@@ -694,11 +964,10 @@
</span><span class="cx">     def _allRecords(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: an iterable of tuples
</span><del>-            C{(provisioningResource, recordType, recordResource, record)}, where
-            C{provisioningResource} is the root provisioning resource,
-            C{recordType} is the record type,
-            C{recordResource} is the principal resource and
-            C{record} is the directory service record
</del><ins>+            C{(provisioningResource, recordType, recordResource, record)},
+            where C{provisioningResource} is the root provisioning resource,
+            C{recordType} is the record type, C{recordResource} is the
+            principal resource and C{record} is the directory service record
</ins><span class="cx">             for each record in each directory in C{directoryServices}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         directory = self.directory
</span><span class="lines">@@ -707,7 +976,9 @@
</span><span class="cx">         ]
</span><span class="cx">         for recordType in directory.recordTypes():
</span><span class="cx">             for record in directory.listRecords(recordType):
</span><del>-                recordResource = provisioningResource.principalForRecord(record)
</del><ins>+                recordResource = (
+                    provisioningResource.principalForRecord(record)
+                )
</ins><span class="cx">                 yield provisioningResource, recordType, recordResource, record
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -715,19 +986,28 @@
</span><span class="cx">         request = SimpleRequest(self.site, &quot;GET&quot;, &quot;/&quot;)
</span><span class="cx"> 
</span><span class="cx">         def gotResource(resource):
</span><del>-            d = resource.checkPrivileges(request, (privilege,), principal=davxml.Principal(principal))
</del><ins>+            d = resource.checkPrivileges(
+                request, (privilege,), principal=davxml.Principal(principal)
+            )
</ins><span class="cx">             if allowed:
</span><span class="cx">                 def onError(f):
</span><span class="cx">                     f.trap(AccessDeniedError)
</span><span class="cx">                     #print(resource.readDeadProperty(davxml.ACL))
</span><del>-                    self.fail(&quot;%s should have %s privilege on %r&quot; % (principal.sname(), privilege.sname(), resource))
</del><ins>+                    self.fail(
+                        &quot;%s should have %s privilege on %r&quot;
+                        % (principal.sname(), privilege.sname(), resource)
+                    )
</ins><span class="cx">                 d.addErrback(onError)
</span><span class="cx">             else:
</span><span class="cx">                 def expectAccessDenied(f):
</span><span class="cx">                     f.trap(AccessDeniedError)
</span><ins>+
</ins><span class="cx">                 def onSuccess(_):
</span><span class="cx">                     #print(resource.readDeadProperty(davxml.ACL))
</span><del>-                    self.fail(&quot;%s should not have %s privilege on %r&quot; % (principal.sname(), privilege.sname(), resource))
</del><ins>+                    self.fail(
+                        &quot;%s should not have %s privilege on %r&quot;
+                        % (principal.sname(), privilege.sname(), resource)
+                    )
</ins><span class="cx">                 d.addCallbacks(onSuccess, expectAccessDenied)
</span><span class="cx">             return d
</span><span class="cx"> 
</span><span class="lines">@@ -739,12 +1019,24 @@
</span><span class="cx"> 
</span><span class="cx"> def _authReadOnlyPrivileges(self, resource, url):
</span><span class="cx">     items = []
</span><del>-    for _ignore_provisioningResource, _ignore_recordType, recordResource, record in self._allRecords():
</del><ins>+    for (
+        provisioningResource, recordType, recordResource, record
+    ) in self._allRecords():
</ins><span class="cx">         if record.enabled:
</span><del>-            items.append((davxml.HRef().fromString(recordResource.principalURL()), davxml.Read()  , True))
-            items.append((davxml.HRef().fromString(recordResource.principalURL()), davxml.Write() , False))
-    items.append((davxml.Unauthenticated() , davxml.Read()  , False))
-    items.append((davxml.Unauthenticated() , davxml.Write() , False))
</del><ins>+            items.append((
+                davxml.HRef().fromString(recordResource.principalURL()),
+                davxml.Read(), True
+            ))
+            items.append((
+                davxml.HRef().fromString(recordResource.principalURL()),
+                davxml.Write(), False
+            ))
+    items.append((
+        davxml.Unauthenticated(), davxml.Read(), False
+    ))
+    items.append((
+        davxml.Unauthenticated(), davxml.Write(), False
+    ))
</ins><span class="cx"> 
</span><span class="cx">     for principal, privilege, allowed in items:
</span><span class="cx">         yield resource, url, principal, privilege, allowed
</span></span></pre>
</div>
</div>

</body>
</html>