implemented upload side of webish

This commit is contained in:
Brian Warner 2006-12-04 05:15:36 -07:00
parent c6c0b1d6ff
commit a09d00824b
3 changed files with 49 additions and 9 deletions

View File

@ -106,6 +106,8 @@ class VDrive(service.MultiService):
d.addCallback(lambda parent: parent.callRemote("add_directory", name)) d.addCallback(lambda parent: parent.callRemote("add_directory", name))
return d return d
def remove(self, something): # TODO
pass
def get_file(self, dir_and_name_or_path, download_target): def get_file(self, dir_and_name_or_path, download_target):
"""Retrieve a file from the virtual drive and put it somewhere. """Retrieve a file from the virtual drive and put it somewhere.

View File

@ -28,7 +28,7 @@
</table> </table>
<!-- <div n:render="forms"/> --> <div n:render="forms"/>
<!-- <div class="results" n:render="results"/> --> <!-- <div class="results" n:render="results"/> -->

View File

@ -1,12 +1,14 @@
from twisted.application import service, internet from twisted.application import service, internet
from twisted.web import static, resource, server from twisted.web import static, resource, server
from twisted.python import util from twisted.python import util, log
from nevow import inevow, rend, loaders, appserver, tags as T from nevow import inevow, rend, loaders, appserver, url, tags as T
from allmydata.util import idlib from allmydata.util import idlib
from allmydata.download import IDownloadTarget#, IDownloader from allmydata.download import IDownloadTarget#, IDownloader
from allmydata import upload
from zope.interface import implements from zope.interface import implements
import urllib import urllib
from formless import annotate, webform
def getxmlfile(name): def getxmlfile(name):
return loaders.xmlfile(util.sibpath(__file__, "web/%s" % name)) return loaders.xmlfile(util.sibpath(__file__, "web/%s" % name))
@ -26,8 +28,7 @@ class WebishServer(service.MultiService):
internet.TCPServer(webport, site).setServiceParent(self) internet.TCPServer(webport, site).setServiceParent(self)
def set_root_dirnode(self, dirnode): def set_root_dirnode(self, dirnode):
dl = self.parent.getServiceNamed("downloader") self.root.putChild("vdrive", Directory(dirnode, "/", self.parent))
self.root.putChild("vdrive", Directory(dirnode, "/", dl))
#print "REMEMBERING", self.site, dl, IDownloader #print "REMEMBERING", self.site, dl, IDownloader
#self.site.remember(dl, IDownloader) #self.site.remember(dl, IDownloader)
@ -36,14 +37,24 @@ class Welcome(rend.Page):
addSlash = True addSlash = True
docFactory = getxmlfile("welcome.xhtml") 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): class Directory(rend.Page):
addSlash = True addSlash = True
docFactory = getxmlfile("directory.xhtml") docFactory = getxmlfile("directory.xhtml")
def __init__(self, dirnode, dirname, downloader): def __init__(self, dirnode, dirname, client):
self._dirnode = dirnode self._dirnode = dirnode
self._dirname = dirname self._dirname = dirname
self._downloader = downloader self._client = client
def childFactory(self, ctx, name): def childFactory(self, ctx, name):
if name.startswith("freeform"): # ick if name.startswith("freeform"): # ick
@ -52,7 +63,7 @@ class Directory(rend.Page):
args = inevow.IRequest(ctx).args args = inevow.IRequest(ctx).args
filename = args["filename"][0] filename = args["filename"][0]
verifierid = args["verifierid"][0] verifierid = args["verifierid"][0]
return Downloader(self._downloader, return Downloader(self._client.getServiceNamed("downloader"),
self._dirname, filename, idlib.a2b(verifierid)) self._dirname, filename, idlib.a2b(verifierid))
if self._dirname == "/": if self._dirname == "/":
dirname = "/" + name dirname = "/" + name
@ -60,7 +71,7 @@ class Directory(rend.Page):
dirname = self._dirname + "/" + name dirname = self._dirname + "/" + name
d = self._dirnode.callRemote("get", name) d = self._dirnode.callRemote("get", name)
d.addCallback(lambda newnode: d.addCallback(lambda newnode:
Directory(newnode, dirname, self._downloader)) Directory(newnode, dirname, self._client))
return d return d
def render_title(self, ctx, data): def render_title(self, ctx, data):
@ -91,6 +102,31 @@ class Directory(rend.Page):
ctx.fillSlots("fileid", "-") ctx.fillSlots("fileid", "-")
return ctx.tag 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: class WebDownloadTarget:
implements(IDownloadTarget) implements(IDownloadTarget)
def __init__(self, req): def __init__(self, req):
@ -143,3 +179,5 @@ class Downloader(resource.Resource):
dl = self._downloader dl = self._downloader
dl.download(self._verifierid, t) dl.download(self._verifierid, t)
return server.NOT_DONE_YET return server.NOT_DONE_YET