From: Brian Warner <warner@lothar.com>
Date: Mon, 4 Dec 2006 12:15:36 +0000 (-0700)
Subject: implemented upload side of webish
X-Git-Tag: tahoe_v0.1.0-0-UNSTABLE~461
X-Git-Url: https://git.rkrishnan.org/listings/vdrive/something?a=commitdiff_plain;h=a09d00824b42a7123d9ab0d13eab118f004a80d7;p=tahoe-lafs%2Ftahoe-lafs.git

implemented upload side of webish
---

diff --git a/allmydata/vdrive.py b/allmydata/vdrive.py
index a676bb42..c0eed1fb 100644
--- a/allmydata/vdrive.py
+++ b/allmydata/vdrive.py
@@ -106,6 +106,8 @@ class VDrive(service.MultiService):
         d.addCallback(lambda parent: parent.callRemote("add_directory", name))
         return d
 
+    def remove(self, something): # TODO
+        pass
 
     def get_file(self, dir_and_name_or_path, download_target):
         """Retrieve a file from the virtual drive and put it somewhere.
diff --git a/allmydata/web/directory.xhtml b/allmydata/web/directory.xhtml
index 1e68ca3d..47f8cd47 100644
--- a/allmydata/web/directory.xhtml
+++ b/allmydata/web/directory.xhtml
@@ -28,7 +28,7 @@
 
 </table>
 
-<!-- <div n:render="forms"/> -->
+<div n:render="forms"/>
 
 <!-- <div class="results" n:render="results"/> -->
 
diff --git a/allmydata/webish.py b/allmydata/webish.py
index 499f4051..c4f18f69 100644
--- a/allmydata/webish.py
+++ b/allmydata/webish.py
@@ -1,12 +1,14 @@
 
 from twisted.application import service, internet
 from twisted.web import static, resource, server
-from twisted.python import util
-from nevow import inevow, rend, loaders, appserver, tags as T
+from twisted.python import util, log
+from nevow import inevow, rend, loaders, appserver, url, tags as T
 from allmydata.util import idlib
 from allmydata.download import IDownloadTarget#, IDownloader
+from allmydata import upload
 from zope.interface import implements
 import urllib
+from formless import annotate, webform
 
 def getxmlfile(name):
     return loaders.xmlfile(util.sibpath(__file__, "web/%s" % name))
@@ -26,8 +28,7 @@ class WebishServer(service.MultiService):
         internet.TCPServer(webport, site).setServiceParent(self)
 
     def set_root_dirnode(self, dirnode):
-        dl = self.parent.getServiceNamed("downloader")
-        self.root.putChild("vdrive", Directory(dirnode, "/", dl))
+        self.root.putChild("vdrive", Directory(dirnode, "/", self.parent))
         #print "REMEMBERING", self.site, dl, IDownloader
         #self.site.remember(dl, IDownloader)
 
@@ -36,14 +37,24 @@ class Welcome(rend.Page):
     addSlash = True
     docFactory = getxmlfile("welcome.xhtml")
 
+class IUpload(annotate.TypedInterface):
+    def upload(contents=annotate.FileUpload(label="Choose a file to upload: ",
+                                            required=True,
+                                            requiredFailMessage="Do iT!"),
+               ctx=annotate.Context(),
+               ):
+        #"""Upload a file"""
+        pass
+    upload = annotate.autocallable(upload, action="Upload file")
+
 class Directory(rend.Page):
     addSlash = True
     docFactory = getxmlfile("directory.xhtml")
 
-    def __init__(self, dirnode, dirname, downloader):
+    def __init__(self, dirnode, dirname, client):
         self._dirnode = dirnode
         self._dirname = dirname
-        self._downloader = downloader
+        self._client = client
 
     def childFactory(self, ctx, name):
         if name.startswith("freeform"): # ick
@@ -52,7 +63,7 @@ class Directory(rend.Page):
             args = inevow.IRequest(ctx).args
             filename = args["filename"][0]
             verifierid = args["verifierid"][0]
-            return Downloader(self._downloader,
+            return Downloader(self._client.getServiceNamed("downloader"),
                               self._dirname, filename, idlib.a2b(verifierid))
         if self._dirname == "/":
             dirname = "/" + name
@@ -60,7 +71,7 @@ class Directory(rend.Page):
             dirname = self._dirname + "/" + name
         d = self._dirnode.callRemote("get", name)
         d.addCallback(lambda newnode:
-                      Directory(newnode, dirname, self._downloader))
+                      Directory(newnode, dirname, self._client))
         return d
 
     def render_title(self, ctx, data):
@@ -91,6 +102,31 @@ class Directory(rend.Page):
             ctx.fillSlots("fileid", "-")
         return ctx.tag
 
+    # this tells formless about what functions can be invoked, giving it
+    # enough information to construct form contents
+    implements(IUpload)
+
+    child_webform_css = webform.defaultCSS
+    def render_forms(self, ctx, data):
+        return webform.renderForms()
+
+    def upload(self, contents, ctx):
+        # contents is a cgi.FieldStorage instance
+        log.msg("starting webish upload")
+
+        uploader = self._client.getServiceNamed("uploader")
+        d = uploader.upload(upload.Data(contents.value))
+        name = contents.filename
+        d.addCallback(lambda vid:
+                      self._dirnode.callRemote("add_file", name, vid))
+        def _done(res):
+            log.msg("webish upload complete")
+            return res
+        d.addCallback(_done)
+        return d
+        return url.here.add("results",
+                            "upload of '%s' complete!" % contents.filename)
+
 class WebDownloadTarget:
     implements(IDownloadTarget)
     def __init__(self, req):
@@ -143,3 +179,5 @@ class Downloader(resource.Resource):
         dl = self._downloader
         dl.download(self._verifierid, t)
         return server.NOT_DONE_YET
+
+