[CalendarServer-changes] [2562] CalendarServer/trunk/twistedcaldav/extensions.py

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 16 14:41:40 PDT 2008


Revision: 2562
          http://trac.macosforge.org/projects/calendarserver/changeset/2562
Author:   wsanchez at apple.com
Date:     2008-06-16 14:41:40 -0700 (Mon, 16 Jun 2008)

Log Message:
-----------
Unroll defgen

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/extensions.py

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2008-06-16 21:40:57 UTC (rev 2561)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2008-06-16 21:41:40 UTC (rev 2562)
@@ -33,7 +33,7 @@
 import cgi
 import time
 
-from twisted.internet.defer import succeed, deferredGenerator, waitForDeferred
+from twisted.internet.defer import succeed, deferredGenerator, waitForDeferred, DeferredList
 from twisted.internet.defer import maybeDeferred
 from twisted.web2 import responsecode
 from twisted.web2.http import HTTPError, Response, RedirectResponse
@@ -50,7 +50,7 @@
 from twisted.web2.dav.xattrprops import xattrPropertyStore
 
 from twistedcaldav.log import Logger, LoggingMixIn
-from twistedcaldav.util import submodule
+from twistedcaldav.util import submodule, Alternator
 from twistedcaldav.directory.sudo import SudoDirectoryService
 from twistedcaldav.directory.directory import DirectoryService
 
@@ -571,7 +571,7 @@
             """<tr><th>Name</th> <th>Size</th> <th>Last Modified</th> <th>MIME Type</th></tr>"""
         ]
 
-        even = False
+        even = Alternator()
         for name in sorted(self.listChildren()):
             child = self.getChild(name)
 
@@ -586,7 +586,7 @@
                 """<td>%(type)s</td>"""
                 """</tr>"""
                 % {
-                    "even": even and "even" or "odd",
+                    "even": even.state() and "even" or "odd",
                     "url": url,
                     "name": cgi.escape(name),
                     "size": size,
@@ -594,7 +594,6 @@
                     "type": contentType,
                 }
             )
-            even = not even
 
         output.append(
             """</table></div>"""
@@ -604,50 +603,64 @@
             """<tr><th>Name</th> <th>Value</th></tr>"""
         )
 
-        @deferredGenerator
         def gotProperties(qnames):
-            even = False
+            ds = []
+
+            def gotProperty(property):
+                if property is None:
+                    name = "{%s}%s" % qname
+                    value = "** None **"
+                else:
+                    name = property.sname()
+                    value = property.toxml()
+
+                return (name, value)
+
+            def gotError(f, qname):
+                f.trap(HTTPError)
+
+                name = "{%s}%s" % qname
+                code = f.value.response.code
+
+                if code == responsecode.NOT_FOUND:
+                    log.err("Property {%s}%s was returned by listProperties() but does not exist for resource %s."
+                            % (qname[0], qname[1], self))
+                    return (name, None)
+
+                if code == responsecode.UNAUTHORIZED:
+                    return (name, "(access forbidden)")
+
+                return f
+
             for qname in qnames:
-                try:
-                    property = waitForDeferred(self.readProperty(qname, request))
-                    yield property
-                    property = property.getResult()
-                    if property is None:
-                        name = "{%s}%s" % qname
-                        value = "** None **"
-                    else:
-                        name = property.sname()
-                        value = property.toxml()
-                except HTTPError, e:
-                    if e.response.code == responsecode.NOT_FOUND:
-                        log.err("Property {%s}%s was returned by listProperties() but does not exist for resource %s."
-                                % (qname[0], qname[1], self))
-                        continue
+                d = self.readProperty(qname, request)
+                d.addCallback(gotProperty)
+                d.addErrback(gotError, qname)
+                ds.append(d)
 
-                    if e.response.code != responsecode.UNAUTHORIZED:
-                        log.err("Unable to read property %s for dirlist: %s" % (qname, e))
-                        raise
+            even = Alternator()
 
-                    name = "{%s}%s" % qname
-                    value = "(access forbidden)"
-
-                output.append(
+            def gotValues(items):
+                output.append("".join(
                     """<tr class="%(even)s">"""
                     """<td valign="top">%(name)s</td>"""
                     """<td><pre>%(value)s</pre></td>"""
                     """</tr>"""
                     % {
-                        "even": even and "even" or "odd",
+                        "even": even.state() and "even" or "odd",
                         "name": name,
                         "value": cgi.escape(value),
                     }
-                )
-                even = not even
+                    for result, (name, value) in items
+                    if result and value is not None
+                ))
+                output.append("</div>")
+                return "".join(output)
 
-            output.append("</div>")
+            d = DeferredList(ds)
+            d.addCallback(gotValues)
+            return d
 
-            yield "".join(output)
-
         d = self.listProperties(request)
         d.addCallback(gotProperties)
         return d

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080616/86e4470a/attachment.htm 


More information about the calendarserver-changes mailing list