diff options
| author | ianb <devnull@localhost> | 2005-07-18 02:51:55 +0000 |
|---|---|---|
| committer | ianb <devnull@localhost> | 2005-07-18 02:51:55 +0000 |
| commit | 72eae4c536b21fc5096c211f2479ee182faa1352 (patch) | |
| tree | 3a0662495b8c14bc027d608583b3258216120145 /examples | |
| parent | 76f2d6a32c1786be2f893d23e57e5257a833748b (diff) | |
| download | paste-72eae4c536b21fc5096c211f2479ee182faa1352.tar.gz | |
Methods to: rename files, upload multiple files at once, and search files by filename
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/filebrowser/pathobj.py | 83 | ||||
| -rw-r--r-- | examples/filebrowser/templates/rename.pt | 15 |
2 files changed, 91 insertions, 7 deletions
diff --git a/examples/filebrowser/pathobj.py b/examples/filebrowser/pathobj.py index 4c649bf..bee2628 100644 --- a/examples/filebrowser/pathobj.py +++ b/examples/filebrowser/pathobj.py @@ -6,6 +6,7 @@ import random import urllib import cgi import htmlentitydefs +import shutil from paste.wareweb import dispatch, public from paste.httpexceptions import * import sitepage @@ -140,7 +141,10 @@ class Path(sitepage.SitePage): "The path %r contains '\\', which is illegal" % name) name = name.lstrip('/') name = re.sub(r'//+', '/', name) - new_path = self.path + '/' + name + new_path = self.path + if not new_path.endswith('/'): + new_path += '/' + new_path += name return self.pathcontext.path(new_path) bad_regexes = [ @@ -165,7 +169,23 @@ class Path(sitepage.SitePage): self.write_text(content) self.message.write('%i bytes saved to %s' % (len(content), self.basename)) - self.redirect(str(self.pathurl(action='view'))) + self.redirect(str(self.pathurl(action='edit'))) + + def action_rename(self): + dest = self.fields.get('dest') + if dest and ('/' in dest or '\\' in dest): + self.message.write('Bad filename (cannot contain / or \\): %r' + % dest) + dest = None + if not dest: + self.options.action = self.pathurl(action='rename') + self.view = 'rename.pt' + return + new_filename = os.path.join(os.path.dirname(self.filename), dest) + new_path = os.path.join(os.path.dirname(self.path), dest) + shutil.move(self.filename, new_filename) + self.message.write('Renamed to %s' % dest) + self.redirect(self.pathurl(new_path, action='view')) def read(self): f = open(self.filename, 'rb') @@ -235,13 +255,15 @@ class HTMLFile(TextFile): # Unlike Path.save, this doesn't save the entire contents # of the file content = self.fields.content + assert content is not None, ( + "No content?: %s" % repr(self.fields.keys())) props = {} for name, value in self.fields.items(): if name.startswith('property_'): props[name[len('property_'):]] = value self.save(content, props) self.message.write('File %s saved' % self.basename) - self.redirect(str(self.pathurl(action='view'))) + self.redirect(str(self.pathurl(action='edit'))) def save(self, content, props): current = self.read() @@ -383,13 +405,60 @@ class Dir(Path): self.view = 'directory.pt' def action_upload(self): - file = self.fields.file - filename = file.filename - content = file.value + number = 0 + for name in self.fields: + if name.startswith('file_'): + field = self.fields[name] + if isinstance(field, str) and not field: + continue + assert not isinstance(field, (str, unicode)), ( + "Bad field %s (contains %r)" % (name, field)) + result = self._do_upload(field) + number += 1 + if not number: + self.message.write('No files uploaded') + if number == 1: + self.redirect(self.pathurl(result.path, action='view')) + else: + self.redirect(self.pathurl(action='view')) + + def _do_upload(self, field): + filename = field.filename + if '/' in filename: + filename = filename.split('/')[-1] + if '\\' in filename: + filename = filename.split('\\')[-1] + content = field.value f = self.join(filename) f.write_text(content) self.message.write('File %s uploaded' % filename) - self.redirect(self.pathurl(f.path, action='view')) + return f + + def action_mkdir(self): + dirname = self.fields.dirname + dest = self.join(dirname) + os.mkdir(dest.filename) + self.message.write('Created directory %s' % dest) + self.redirect(self.pathurl(dest.path, action='view')) + + def listdir(self): + result = [] + for fn in os.listdir(self.filename): + try: + result.append(self.join(fn)) + except BadFilePath: + pass + return result + + def find_filename(self, filename): + results = [] + for file in self.listdir(): + if filename.lower() in file.basename.lower(): + results.append(file) + if file.isdir: + results.extend(file.find_filename(filename)) + return results + PathContext.register_class(Dir) diff --git a/examples/filebrowser/templates/rename.pt b/examples/filebrowser/templates/rename.pt new file mode 100644 index 0000000..f36d27e --- /dev/null +++ b/examples/filebrowser/templates/rename.pt @@ -0,0 +1,15 @@ +<html metal:use-macro="here/standard_template.pt/macros/page"> +<metal:body fill-slot="body"> + +<form tal:attributes="action options/action" method="POST"> +Rename <span tal:replace="servlet/path"/> to:<br> +<input type="text" name="dest" style="width: 100%" + tal:attributes="value servlet/basename"> +<br> +<input type="submit" value="Rename"> +<button tal:attributes="onclick + servlet/pathurl/action=view/js_set_location">Cancel</button> +</form> + +</metal:body> +</html> |
