From 6f21b4248a9f30df77639da268b89f50d44f2984 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Mon, 4 Dec 2006 19:27:38 -0700
Subject: [PATCH] webish: implement delete (for files only, not directories)

---
 allmydata/filetable.py        |  1 +
 allmydata/vdrive.py           | 19 +++++++++++++++++--
 allmydata/web/directory.xhtml |  2 ++
 allmydata/webish.py           | 22 ++++++++++++++++++++++
 4 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/allmydata/filetable.py b/allmydata/filetable.py
index e93413c1..bb96b02a 100644
--- a/allmydata/filetable.py
+++ b/allmydata/filetable.py
@@ -90,6 +90,7 @@ class MutableDirectoryNode(Referenceable):
             os.unlink(absname)
         else:
             raise BadFileError("Cannot delete non-existent file '%s'" % name)
+    remote_remove = remove
 
 
 class GlobalVirtualDrive(service.MultiService):
diff --git a/allmydata/vdrive.py b/allmydata/vdrive.py
index c0eed1fb..22e012d0 100644
--- a/allmydata/vdrive.py
+++ b/allmydata/vdrive.py
@@ -106,8 +106,23 @@ class VDrive(service.MultiService):
         d.addCallback(lambda parent: parent.callRemote("add_directory", name))
         return d
 
-    def remove(self, something): # TODO
-        pass
+    def remove(self, parent, name):
+        assert not isinstance(parent, str)
+        log.msg("vdrive removing %s" % name)
+        # first find the verifierid
+        d = self.get_verifierid_from_parent(parent, name)
+        def _got_verifierid(vid):
+            # TODO: delete the file's shares using this
+            pass
+        d.addCallback(_got_verifierid)
+        def _delete_from_parent(res):
+            return parent.callRemote("remove", name)
+        d.addCallback(_delete_from_parent)
+        def _done(res):
+            log.msg("vdrive done removing %s" % name)
+        d.addCallback(_done)
+        return d
+
 
     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 47f8cd47..5b4d9c7a 100644
--- a/allmydata/web/directory.xhtml
+++ b/allmydata/web/directory.xhtml
@@ -17,11 +17,13 @@
     <td>Filename</td>
     <td>Type</td>
     <td>fileid</td>
+    <td></td>
   </tr>
   <tr n:pattern="item" n:render="row">
     <td><n:slot name="filename"/></td>
     <td><n:slot name="type"/></td>
     <td><n:slot name="fileid"/></td>
+    <td><n:slot name="delete"/></td>
   </tr>
 
   <tr n:pattern="empty"><td>directory is empty!</td></tr>
diff --git a/allmydata/webish.py b/allmydata/webish.py
index 43e5772a..4d41cbc0 100644
--- a/allmydata/webish.py
+++ b/allmydata/webish.py
@@ -86,11 +86,23 @@ class Directory(rend.Page):
             ctx.fillSlots("filename", T.a(href=dlurl)[name])
             ctx.fillSlots("type", "FILE")
             ctx.fillSlots("fileid", idlib.b2a(target))
+
+            # this creates a button which will cause our child__delete method
+            # to be invoked, which deletes the file and then redirects the
+            # browser back to this directory
+            del_url = url.here.child("_delete")
+            #del_url = del_url.add("verifierid", idlib.b2a(target))
+            del_url = del_url.add("name", name)
+            delete = T.form(action=del_url, method="post")[
+                T.input(type='submit', value='del', name="del"),
+                ]
+            ctx.fillSlots("delete", delete)
         else:
             # directory
             ctx.fillSlots("filename", T.a(href=name)[name])
             ctx.fillSlots("type", "DIR")
             ctx.fillSlots("fileid", "-")
+            ctx.fillSlots("delete", "-")
         return ctx.tag
 
     child_webform_css = webform.defaultCSS
@@ -153,6 +165,16 @@ class Directory(rend.Page):
         d.addCallback(_done)
         return d
 
+    def child__delete(self, ctx):
+        # perform the delete, then redirect back to the directory page
+        args = inevow.IRequest(ctx).args
+        vdrive = self._client.getServiceNamed("vdrive")
+        d = vdrive.remove(self._dirnode, args["name"][0])
+        def _deleted(res):
+            return url.here.up()
+        d.addCallback(_deleted)
+        return d
+
 class WebDownloadTarget:
     implements(IDownloadTarget)
     def __init__(self, req):
-- 
2.45.2