]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
add a 'rename' button to the webish dir view
authorrobk-org <robk-org@allmydata.com>
Thu, 12 Jul 2007 23:53:54 +0000 (16:53 -0700)
committerrobk-org <robk-org@allmydata.com>
Thu, 12 Jul 2007 23:53:54 +0000 (16:53 -0700)
alongside the 'del' button is now presented a 'rename' button, which takes
the user to a new page, the 't=rename-form' page, which asks ther user for
the new name of the child and ultimately submits a POST request to the dir
for 't=rename' to perform the actual rename i.e. an attach followed by a
delete of children.

docs/webapi.txt
src/allmydata/web/directory.xhtml
src/allmydata/web/rename-form.xhtml [new file with mode: 0644]
src/allmydata/webish.py

index 1cce3f447b8cfb003004dff1321639603346af3a..1089b805ae8408364110fa96cb3bd127b0c47c0c 100644 (file)
@@ -215,6 +215,13 @@ for files and directories which do not yet exist.
 
    curl -T /dev/null 'http://localhost:8011/vdrive/global/newdir?t=upload&localdir=/home/user/directory-to-upload'
 
+ GET DIRURL?t=rename-form&name=$CHILDNAME
+
+  This provides a useful facility to browser-based user interfaces.
+  It returns a page containing a form targetting the POST DIRURL t=rename
+  functionality listed below, with the provided $CHILDNAME present in the
+  'from_name' field of that form.  i.e. this presents a form offering to
+  rename $CHILDNAME, requesting the new name, and submitting POST rename
 
 == POST Forms ==
 
@@ -252,6 +259,15 @@ for files and directories which do not yet exist.
   This instructs the client to delete a file from the given dirnode. The name
   of the child to be deleted will be included in the form's arguments.
 
+ POST DIRURL
+  t=rename
+  from_name=oldchildname
+  to_name=newchildname
+
+  This instructs the client to rename a child within the given dirnode. The
+  child specified by 'from_name' is removed, and reattached as a child named
+  for 'to_name'.  This is unconditional and will replace any child already
+  present under 'to_name', akin to 'mv -f' in unix parlance.
 
 == URI ==
 
index dea8700376d4ccd3a3153ec0502a2811e7068e40..9b5b4ad4e3a756621710519fe08c7e815c9a0d25 100644 (file)
@@ -29,6 +29,7 @@
     <td>Size</td>
     <td>other representations</td>
     <td></td>
+    <td></td>
   </tr>
   <tr n:pattern="item" n:render="row">
     <td><n:slot name="filename"/></td>
@@ -36,6 +37,7 @@
     <td><n:slot name="size"/></td>
     <td><n:slot name="data"/></td>
     <td><n:slot name="delete"/></td>
+    <td><n:slot name="rename"/></td>
   </tr>
 
   <tr n:pattern="empty"><td>directory is empty!</td></tr>
diff --git a/src/allmydata/web/rename-form.xhtml b/src/allmydata/web/rename-form.xhtml
new file mode 100644 (file)
index 0000000..1de951d
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns:n="http://nevow.com/ns/nevow/0.1">
+  <head>
+    <title n:render="title"></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"/>
+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  </head>
+
+<body>
+
+<h2 n:render="header" />
+
+<div class="freeform-form">
+    <form action="." method="post" enctype="multipart/form-data">
+        <fieldset>
+            <legend class="freeform-form-label">Rename child</legend>
+            <input type="hidden" name="t" value="rename" />
+            <input n:render="when_done" />
+
+            Rename child:
+            <input type="text" name="from_name" readonly="true" n:render="get_name" />
+            to
+            <input type="text" name="to_name" />
+            <input type="submit" value="rename" />
+        </fieldset>
+    </form>
+</div>
+
+</body></html>
index 168af19e791a0e1e476e8cef4247e2431b65d311..402a2775374f4f7bf89e51883b212fd467727305 100644 (file)
@@ -80,9 +80,18 @@ class Directory(rend.Page):
                 T.input(type='hidden', name='when_done', value=url.here),
                 T.input(type='submit', value='del', name="del"),
                 ]
+
+            rename = T.form(action=url.here, method="get")[
+                T.input(type='hidden', name='t', value='rename-form'),
+                T.input(type='hidden', name='name', value=name),
+                T.input(type='hidden', name='when_done', value=url.here),
+                T.input(type='submit', value='rename', name="rename"),
+                ]
         else:
             delete = "-"
+            rename = "-"
         ctx.fillSlots("delete", delete)
+        ctx.fillSlots("rename", rename)
 
         # build the base of the uri_link link url
         uri_link = urllib.quote(target.get_uri().replace("/", "!"))
@@ -429,6 +438,46 @@ class DirectoryReadonlyURI(DirectoryJSONMetadata):
     def renderNode(self, node):
         return node.get_immutable_uri()
 
+class RenameForm(rend.Page):
+    addSlash = True
+    docFactory = getxmlfile("rename-form.xhtml")
+
+    def __init__(self, rootname, dirnode, dirpath):
+        self._rootname = rootname
+        self._dirnode = dirnode
+        self._dirpath = dirpath
+
+    def dirpath_as_string(self):
+        return "/" + "/".join(self._dirpath)
+
+    def render_title(self, ctx, data):
+        return ctx.tag["Directory '%s':" % self.dirpath_as_string()]
+
+    def render_header(self, ctx, data):
+        parent_directories = ("<%s>" % self._rootname,) + self._dirpath
+        num_dirs = len(parent_directories)
+
+        header = [ "Rename in directory '",
+                   "<%s>/" % self._rootname,
+                   "/".join(self._dirpath),
+                   "':", ]
+
+        if not self._dirnode.is_mutable():
+            header.append(" (readonly)")
+        return ctx.tag[header]
+
+    def render_when_done(self, ctx, data):
+        return T.input(type="hidden", name="when_done", value=url.here)
+
+    def render_get_name(self, ctx, data):
+        req = inevow.IRequest(ctx)
+        if 'name' in req.args:
+            name = req.args['name'][0]
+        else:
+            name = ''
+        ctx.tag.attributes['value'] = name
+        return ctx.tag
+
 class POSTHandler(rend.Page):
     def __init__(self, node):
         self._node = node
@@ -478,6 +527,25 @@ class POSTHandler(rend.Page):
             def _done(res):
                 return "thing deleted"
             d.addCallback(_done)
+        elif t == "rename":
+            from_name = 'from_name' in req.fields and req.fields["from_name"].value
+            to_name = 'to_name' in req.fields and req.fields["to_name"].value
+            if not from_name or not to_name:
+                raise RuntimeError("rename requires from_name and to_name")
+            if not IDirectoryNode.providedBy(self._node):
+                raise RuntimeError("rename must only be called on directories")
+            d = self._node.get(from_name)
+            def add_dest(child):
+                uri = child.get_uri()
+                # now actually do the rename
+                return self._node.set_uri(to_name, uri)
+            d.addCallback(add_dest)
+            def rm_src(junk):
+                return self._node.delete(from_name)
+            d.addCallback(rm_src)
+            def _done(res):
+                return "thing renamed"
+            d.addCallback(_done)
         elif t == "upload":
             contents = req.fields["file"]
             name = name or contents.filename
@@ -744,6 +812,8 @@ class VDrive(rend.Page):
                         return DirectoryReadonlyURI(node), ()
                     elif t == "manifest":
                         return Manifest(node, path), ()
+                    elif t == 'rename-form':
+                        return RenameForm(self.name, node, path), ()
                     else:
                         raise RuntimeError("bad t=%s" % t)
                 else: