From b257f905a0595de21052cba82c7dd22c8f5d45e2 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Tue, 30 Oct 2007 17:00:37 -0700
Subject: [PATCH] webish.py: handle asynchronous checker results. Thanks to
 robk for pointing out that Nevow will accept a Deferred almost everywhere. In
 this case, we just pass a Deferred into ctx.fillSlots(). One quirk: nevow
 doesn't evaluate all rows of the table in parallel: using a slow Deferred in
 a slot in one row seems to stall the next row until that one has fired,
 probably to simplify the flattening of the HTML.

---
 src/allmydata/webish.py | 39 +++++++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/allmydata/webish.py b/src/allmydata/webish.py
index ecde7f67..d7e07299 100644
--- a/src/allmydata/webish.py
+++ b/src/allmydata/webish.py
@@ -232,24 +232,31 @@ class Directory(rend.Page):
         except KeyError:
             checker = None
         if checker:
-            checker_results = checker.checker_results_for(target.get_verifier())
-            recent_results = reversed(checker_results[-5:])
-            if IFileNode.providedBy(target):
-                results = ("[" +
-                           ", ".join(["%d/%d" % (found, needed)
-                                      for (when,
-                                           (needed, total, found, sharemap))
-                                      in recent_results]) +
-                           "]")
-            elif IDirectoryNode.providedBy(target):
-                results = ("[" +
-                           "".join([{True:"+",False:"-"}[res]
-                                    for (when, res) in recent_results]) +
-                           "]")
-            else:
-                results = "%d results" % len(checker_results)
+            d = defer.maybeDeferred(checker.checker_results_for,
+                                    target.get_verifier())
+            def _got(checker_results):
+                recent_results = reversed(checker_results[-5:])
+                if IFileNode.providedBy(target):
+                    results = ("[" +
+                               ", ".join(["%d/%d" % (found, needed)
+                                          for (when,
+                                               (needed, total, found, sharemap))
+                                          in recent_results]) +
+                               "]")
+                elif IDirectoryNode.providedBy(target):
+                    results = ("[" +
+                               "".join([{True:"+",False:"-"}[res]
+                                        for (when, res) in recent_results]) +
+                               "]")
+                else:
+                    results = "%d results" % len(checker_results)
+                return results
+            d.addCallback(_got)
+            results = d
         else:
             results = "--"
+        # TODO: include a link to see more results, including timestamps
+        # TODO: use a sparkline
         ctx.fillSlots("checker_results", results)
 
         return ctx.tag
-- 
2.45.2