diff options
| author | ianb <devnull@localhost> | 2005-06-13 06:18:19 +0000 |
|---|---|---|
| committer | ianb <devnull@localhost> | 2005-06-13 06:18:19 +0000 |
| commit | fc569bdee88033eaf043cf8cd4fea38e8c96ff9a (patch) | |
| tree | 83a29689bab45f88121fb0057db5fb00c6dfc539 /examples/filebrowser/web | |
| parent | 844ff4d0aba028053971139f33b2b8908836da98 (diff) | |
| download | paste-fc569bdee88033eaf043cf8cd4fea38e8c96ff9a.tar.gz | |
Added new example application (not completely finished), a file browsing application, with lots of Ajax
Diffstat (limited to 'examples/filebrowser/web')
| -rw-r--r-- | examples/filebrowser/web/__init__.py | 39 | ||||
| -rw-r--r-- | examples/filebrowser/web/copybin.py | 54 | ||||
| -rw-r--r-- | examples/filebrowser/web/download.py | 20 | ||||
| -rw-r--r-- | examples/filebrowser/web/index.py | 40 |
4 files changed, 153 insertions, 0 deletions
diff --git a/examples/filebrowser/web/__init__.py b/examples/filebrowser/web/__init__.py new file mode 100644 index 0000000..0ffdb8b --- /dev/null +++ b/examples/filebrowser/web/__init__.py @@ -0,0 +1,39 @@ +import os +import urllib +from py.path import local +from paste import wsgilib +from paste import httpexceptions +from paste import urlparser + +def urlparser_hook(environ): + if not environ.has_key('filebrowser.base_url'): + environ['filebrowser.base_url'] = environ['SCRIPT_NAME'] + +special_dirs = {} + +for special_dir in ['js-lib', 'icons', 'static']: + special_dirs[special_dir] = urlparser.URLParser( + os.path.join(os.path.dirname(os.path.dirname(__file__)), + special_dir), None) + +special_dirs['app'] = urlparser.URLParser( + os.path.dirname(__file__), 'filebrowser.web') + +def application(environ, start_response): + if environ.get('browser.resolved'): + return special_dirs['app'](environ, start_response) + conf = environ['paste.config'] + path_info = environ.get('PATH_INFO', '') + for special_dir, parser in special_dirs.items(): + if path_info.startswith('/_%s/' % special_dir): + environ['browser.resolved'] = True + wsgilib.path_info_pop(environ) + return parser(environ, start_response) + environ['browser.filepath'] = urllib.unquote(environ['PATH_INFO']) + vars = dict(wsgilib.parse_querystring(environ)) + action = (vars.get('action') or ['index'])[0] + servlet_fn = os.path.join(os.path.dirname(__file__), action + '.py') + servlet_app = urlparser.make_py(environ, servlet_fn) + return servlet_app(environ, start_response) + + diff --git a/examples/filebrowser/web/copybin.py b/examples/filebrowser/web/copybin.py new file mode 100644 index 0000000..b17153f --- /dev/null +++ b/examples/filebrowser/web/copybin.py @@ -0,0 +1,54 @@ +from filebrowser.sitepage import * +from py.path import local +import py + +class copybin(SitePage): + + bins = ['copy', 'cut'] + + def setup(self): + for fn in self.fields.getlist('copy'): + self.copybin[fn] = 'copy' + for fn in self.fields.getlist('cut'): + self.copybin[fn] = 'cut' + for fn in self.fields.getlist('remove'): + if fn in self.copybin: + del self.copybin[fn] + if self.fields.get('clear'): + self.copybin.clear() + if 'paste' in self.fields: + return self.paste() + self.update_copybin_display() + + def paste(self): + if not self.copybin: + self.message.write('No items to paste') + self.redirect(self.fields.back) + return + dest = self.root.join(self.fields.paste) + copied = 0 + moved = 0 + for filename, copytype in self.copybin.items(): + path = self.root.join(filename) + if copytype == 'copy': + copied += 1 + path.copy(dest) + elif copytype == 'cut': + try: + path.move(dest) + except py.error.ENOTEMPTY, e: + self.message.write( + 'Cannot move %s (file by the same name exists' % dest) + else: + moved += 1 + msg = [] + if copied: + msg.append('%i file%s copied' % ( + copied, copied>1 and 's' or '')) + if moved: + msg.append('%i file%s moved' % ( + moved, moved>1 and 's' or '')) + msg = ', '.join(msg) + self.copybin.clear() + self.message.write('%s to %s' % (msg, self.fields.paste)) + self.redirect(self.fields.back) diff --git a/examples/filebrowser/web/download.py b/examples/filebrowser/web/download.py new file mode 100644 index 0000000..a18ebf6 --- /dev/null +++ b/examples/filebrowser/web/download.py @@ -0,0 +1,20 @@ +import mimetypes +import re +from filebrowser.sitepage import SitePage + +bad_regexes = [ + re.compile(r'<script.*?</script>', re.I+re.S), + re.compile(r'style="[^"]*position:.*?"', re.I+re.S), + ] + +class download(SitePage): + + def setup(self): + mime, _ = mimetypes.guess_type(str(self.path)) + self.set_header('Content-type', mime) + self.view = None + content = self.path.read() + if self.fields.get('html') == 'clean': + for bad_regex in bad_regexes: + content = bad_regex.sub('', content) + self.write(content) diff --git a/examples/filebrowser/web/index.py b/examples/filebrowser/web/index.py new file mode 100644 index 0000000..2a80712 --- /dev/null +++ b/examples/filebrowser/web/index.py @@ -0,0 +1,40 @@ +import mimetypes +from filebrowser.sitepage import SitePage + +class index(SitePage): + + def setup(self): + self.title = 'File: %s' % self.path.basename + self.options.parent = { + 'url': self.pathurl.up(), + 'name': self.pathurl.up().name() or 'root', + } + if self.path.check(dir=1): + self.setup_dir() + else: + self.setup_file() + + def setup_dir(self): + files = [] + for f in self.path.listdir(sort=True): + files.append({ + 'path': f, + 'name': f.basename, + 'url': self.pathurl[f.basename], + 'copyid': self.pathid('copy_', f), + }) + if f.check(dir=1): + files[-1]['name'] += '/' + self.options.files = files + self.view = 'directory.pt' + + def setup_file(self): + self.options.mimetype, _ = mimetypes.guess_type(str(self.path)) + mime = self.options.mimetype + self.view = 'view_file.pt' + if mime and mime.startswith('text/'): + self.options.content = self.path.read() + else: + self.options.content = None + self.options.is_image = mime and mime.startswith('image/') + self.options.use_iframe = mime == 'text/html' |
