]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
webish: make POST /uri?t=upload deposit you on an 'Upload Results' page
authorBrian Warner <warner@allmydata.com>
Wed, 6 Feb 2008 06:01:37 +0000 (23:01 -0700)
committerBrian Warner <warner@allmydata.com>
Wed, 6 Feb 2008 06:01:37 +0000 (23:01 -0700)
docs/webapi.txt
src/allmydata/test/test_web.py
src/allmydata/web/unlinked-upload.xhtml [new file with mode: 0644]
src/allmydata/webish.py

index 3cc00592714f94c1c766e4de2c9bc0f488cc42ea..6b97019b6f4911c886fb63e109560f7faac27e9c 100644 (file)
@@ -177,8 +177,9 @@ f. uploading a file
   POST http://localhost:8123/uri?t=upload
 
    This action also uploads a file without attaching it to a virtual drive
-   directory, but can be used from an HTML form. The response is the file
-   read cap.
+   directory, but can be used from an HTML form. The response is an HTML page
+   that describes the results of the upload, including the resulting URI (but
+   also including information about which peers were used, etc).
 
   POST http://localhost:8123/uri?t=upload&mutable=true
 
index 5acb9ec92c496ea9a5cf9070b13331981e72a778..c6ba8d48a90560874ba4b6194888198987879fea 100644 (file)
@@ -993,6 +993,17 @@ class Web(WebMixin, unittest.TestCase):
     def test_POST_upload_no_link(self):
         d = self.POST("/uri", t="upload",
                       file=("new.txt", self.NEWFILE_CONTENTS))
+        def _check_upload_results(page):
+            # this should be a page which describes the results of the upload
+            # that just finished.
+            self.failUnless("Upload Results:" in page)
+            self.failUnless("URI:" in page)
+            uri_re = re.compile("URI: <tt><span>(.*)</span>")
+            mo = uri_re.search(page)
+            self.failUnless(mo, page)
+            new_uri = mo.group(1)
+            return new_uri
+        d.addCallback(_check_upload_results)
         d.addCallback(self.failUnlessCHKURIHasContents, self.NEWFILE_CONTENTS)
         return d
 
diff --git a/src/allmydata/web/unlinked-upload.xhtml b/src/allmydata/web/unlinked-upload.xhtml
new file mode 100644 (file)
index 0000000..0de727b
--- /dev/null
@@ -0,0 +1,22 @@
+<html xmlns:n="http://nevow.com/ns/nevow/0.1">
+  <head>
+    <title>AllMyData - Tahoe - File Uploaded</title>
+    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
+          rel="stylesheet" type="text/css"/> -->
+    <link href="/webform_css" rel="stylesheet" type="text/css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  </head>
+  <body>
+
+<h1>Uploading File... <span n:render="string" n:data="done" /></h1>
+
+<h2>Upload Results:</h2>
+<ul>
+  <li>URI: <tt><span n:render="string" n:data="uri" /></tt></li>
+  <li>Download link: <span n:render="download_link" /></li>
+</ul>
+
+<div>Return to the <a href="/">Welcome Page</a></div>
+
+  </body>
+</html>
index 611beb2c87e81df61df53253ea93e82dcf5dc791..e5e824ef6fd6f44ceb8ca089f10f6c2d6a858193 100644 (file)
@@ -7,7 +7,7 @@ from twisted.internet import defer, address
 from twisted.internet.interfaces import IConsumer
 from nevow import inevow, rend, loaders, appserver, url, tags as T
 from nevow.static import File as nevow_File # TODO: merge with static.File?
-from allmydata.util import fileutil, idlib
+from allmydata.util import fileutil, idlib, observer
 import simplejson
 from allmydata.interfaces import IDownloadTarget, IDirectoryNode, IFileNode, \
      IMutableFileNode
@@ -1242,16 +1242,37 @@ class UnlinkedPUTCreateDirectory(rend.Page):
 
 
 class UnlinkedPOSTCHKUploader(rend.Page):
-    def renderHTTP(self, ctx):
-        req = inevow.IRequest(ctx)
-        assert req.method == "POST"
+    """'POST /uri', to create an unlinked file."""
+    docFactory = getxmlfile("unlinked-upload.xhtml")
 
-        # "POST /uri", to create an unlinked file.
+    def __init__(self, client, req):
+        rend.Page.__init__(self)
+        # we start the upload now, and distribute notification of its
+        # completion to render_ methods with an ObserverList
+        assert req.method == "POST"
+        self._done = observer.OneShotObserverList()
         fileobj = req.fields["file"].file
         uploadable = FileHandle(fileobj)
-        d = IClient(ctx).upload(uploadable)
-        d.addCallback(lambda results: results.uri)
-        # that fires with the URI of the new file
+        d = client.upload(uploadable)
+        d.addBoth(self._done.fire)
+
+    def upload_results(self):
+        return self._done.when_fired()
+
+    def data_done(self, ctx, data):
+        d = self.upload_results()
+        d.addCallback(lambda res: "done!")
+        return d
+
+    def data_uri(self, ctx, data):
+        d = self.upload_results()
+        d.addCallback(lambda res: res.uri)
+        return d
+
+    def render_download_link(self, ctx, data):
+        d = self.upload_results()
+        d.addCallback(lambda res: T.a(href="/uri/" + urllib.quote(res.uri))
+                      ["/uri/" + res.uri])
         return d
 
 class UnlinkedPOSTSSKUploader(rend.Page):
@@ -1340,7 +1361,7 @@ class Root(rend.Page):
                             if mutable:
                                 return UnlinkedPOSTSSKUploader(), ()
                             else:
-                                return UnlinkedPOSTCHKUploader(), ()
+                                return UnlinkedPOSTCHKUploader(client, req), ()
                         if t == "mkdir":
                             return UnlinkedPOSTCreateDirectory(), ()
                         errmsg = "/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, and POST?t=mkdir"