summaryrefslogtreecommitdiff
path: root/examples/filebrowser/web
diff options
context:
space:
mode:
authorianb <devnull@localhost>2005-06-13 06:18:19 +0000
committerianb <devnull@localhost>2005-06-13 06:18:19 +0000
commitfc569bdee88033eaf043cf8cd4fea38e8c96ff9a (patch)
tree83a29689bab45f88121fb0057db5fb00c6dfc539 /examples/filebrowser/web
parent844ff4d0aba028053971139f33b2b8908836da98 (diff)
downloadpaste-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__.py39
-rw-r--r--examples/filebrowser/web/copybin.py54
-rw-r--r--examples/filebrowser/web/download.py20
-rw-r--r--examples/filebrowser/web/index.py40
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'