better gluon.tools.Expose, thanks Richard

This commit is contained in:
mdipierro
2012-11-01 21:09:09 -05:00
parent c9b41a4343
commit b17358e761
2 changed files with 26 additions and 18 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.2.1 (2012-11-01 21:07:42) stable Version 2.2.1 (2012-11-01 21:09:04) stable
+25 -17
View File
@@ -4587,16 +4587,23 @@ class PluginManager(object):
class Expose(object): class Expose(object):
def __init__(self, base=None, basename='base'): def __init__(self, base=None, basename='base', extensions=None, allow_download=True):
"""
extensions: an optional list of file extensions for filtering displayed files:
['.py', '.jpg']
allow_download: whether to allow downloading selected files
"""
current.session.forget() current.session.forget()
base = base or os.path.join(current.request.folder, 'static') base = base or os.path.join(current.request.folder, 'static')
self.basename = basename self.basename = basename
args = self.args = current.request.raw_args and \ self.args = current.request.raw_args and \
current.request.raw_args.split('/') or [] [arg for arg in current.request.raw_args.split('/') if arg] or []
filename = os.path.join(base, *args) filename = os.path.join(base, *self.args)
if not os.path.exists(filename):
raise HTTP(404, "FILE NOT FOUND")
if not os.path.normpath(filename).startswith(base): if not os.path.normpath(filename).startswith(base):
raise HTTP(401, "NOT AUTHORIZED") raise HTTP(401, "NOT AUTHORIZED")
if not os.path.isdir(filename): if allow_download and not os.path.isdir(filename):
current.response.headers['Content-Type'] = contenttype(filename) current.response.headers['Content-Type'] = contenttype(filename)
raise HTTP(200, open(filename, 'rb'), **current.response.headers) raise HTTP(200, open(filename, 'rb'), **current.response.headers)
self.path = path = os.path.join(filename, '*') self.path = path = os.path.join(filename, '*')
@@ -4604,23 +4611,24 @@ class Expose(object):
if os.path.isdir(f) and not self.isprivate(f)] if os.path.isdir(f) and not self.isprivate(f)]
self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path)) self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path))
if not os.path.isdir(f) and not self.isprivate(f)] if not os.path.isdir(f) and not self.isprivate(f)]
if extensions:
self.filenames = [f for f in self.filenames if os.path.splitext(f)[-1] in extensions]
def breadcrumbs(self, basename): def breadcrumbs(self, basename):
path = [] path = []
span = SPAN() span = SPAN()
span.append(A(basename, _href=URL())) span.append(A(basename, _href=URL()))
span.append('/') for arg in self.args:
args = current.request.raw_args and \ span.append('/')
current.request.raw_args.split('/') or []
for arg in args:
path.append(arg) path.append(arg)
span.append(A(arg, _href=URL(args='/'.join(path)))) span.append(A(arg, _href=URL(args='/'.join(path))))
span.append('/')
return span return span
def table_folders(self): def table_folders(self):
return TABLE(*[TR(TD(A(folder, _href=URL(args=self.args + [folder])))) if self.folders:
for folder in self.folders]) return SPAN(H3('Folders'), TABLE(*[TR(TD(A(folder, _href=URL(args=self.args + [folder]))))
for folder in self.folders]))
return ''
@staticmethod @staticmethod
def isprivate(f): def isprivate(f):
@@ -4628,21 +4636,21 @@ class Expose(object):
@staticmethod @staticmethod
def isimage(f): def isimage(f):
return f.rsplit('.')[-1].lower() in ('png', 'jpg', 'jpeg', 'gif', 'tiff') return os.path.splitext(f)[-1].lower() in ('.png', '.jpg', '.jpeg', '.gif', '.tiff')
def table_files(self, width=160): def table_files(self, width=160):
return TABLE(*[TR(TD(A(f, _href=URL(args=self.args + [f]))), if self.filenames:
return SPAN(H3('Files'), TABLE(*[TR(TD(A(f, _href=URL(args=self.args + [f]))),
TD(IMG(_src=URL(args=self.args + [f]), TD(IMG(_src=URL(args=self.args + [f]),
_style='max-width:%spx' % width) _style='max-width:%spx' % width)
if width and self.isimage(f) else '')) if width and self.isimage(f) else ''))
for f in self.filenames]) for f in self.filenames]))
return ''
def xml(self): def xml(self):
return DIV( return DIV(
H2(self.breadcrumbs(self.basename)), H2(self.breadcrumbs(self.basename)),
H3('Folders'),
self.table_folders(), self.table_folders(),
H3('Files'),
self.table_files()).xml() self.table_files()).xml()